为什么选择PHP8,原来性能提升这么多!
1.5k
类别: 
开发交流

PHP8比PHP7提升多少呢?一起来看看翻了多少倍!

先看一下结果:

JIT 不开启的情况下

php -d opcache.jit_buffer_size=0 Zend/bench.php
simple             0.025
simplecall         0.012
simpleucall        0.012
simpleudcall       0.012
mandel             0.135
mandel2            0.211
ackermann(7)       0.082
ary(50000)         0.012
ary2(50000)        0.010
ary3(2000)         0.186
fibo(30)           0.283
hash1(50000)       0.039
hash2(500)         0.041
heapsort(20000)    0.089
matrix(20)         0.110
nestedloop(12)     0.096
sieve(30)          0.045
strcat(200000)     0.019
------------------------
Total              1.419

JIT 开启的情况下:

php -d -d opcache.jit_buffer_size=64M -d opcache.jit=1205 Zend/bench.php
simple             0.001
simplecall         0.000
simpleucall        0.000
simpleudcall       0.000
mandel             0.005
mandel2            0.006
ackermann(7)       0.010
ary(50000)         0.005
ary2(50000)        0.004
ary3(2000)         0.011
fibo(30)           0.027
hash1(50000)       0.027
hash2(500)         0.018
heapsort(20000)    0.011
matrix(20)         0.011
nestedloop(12)     0.006
sieve(30)          0.004
strcat(200000)     0.009
------------------------
Total              0.155

还有不打开 Opcache 的情况下:

php Zend/bench.php
simple             0.051
simplecall         0.017
simpleucall        0.083
simpleudcall       0.089
mandel             0.506
mandel2            0.409
ackermann(7)       0.095
ary(50000)         0.012
ary2(50000)        0.010
ary3(2000)         0.187
fibo(30)           0.367
hash1(50000)       0.040
hash2(500)         0.041
heapsort(20000)    0.097
matrix(20)         0.122
nestedloop(12)     0.093
sieve(30)          0.063
strcat(200000)     0.018
------------------------
Total              2.299

不开启 Opcache:2.299s

开启 Opcache 不开启 JIT 情况下:1.419s

开启 Opcache 且开启 JIT 情况下:0.155s

开启 JIT 情况下是不开启 JIT 情况下的接近 9.15 倍,多次测试这个值稳定在 8 倍到 10 倍之间。

MPF 表现如何?

为了接近我们的业务,所以在 mpf 框架下进行测试

环境

aliyun centos 6.9

php7.test.com php-fpm 一个进程

php8.test.com php-fpm 一个进程

Mpf 两个接口

/v1/hello/wzh/index1

public function index1() {
    $this->output('123');
}

/v1/hello/wzh/index2

public function index2() {
    $a = 0;
    for ($i = 0; $i < 1000000; $i++)
        $a++;

    $this->output($a);
}

我们压测一下

php7 计算少情况

wrk -c36 -d 5s -t12 https://php7.test.com/v1/hello/wzh/index1
Running 5s test @ https://php7.test.com/v1/hello/wzh/index1
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   432.97ms   76.00ms 527.38ms   92.17%
    Req/Sec     8.38      5.36    20.00     63.85%
  396 requests in 5.09s, 121.43KB read
Requests/sec:     77.78
Transfer/sec:     23.85KB

php7 计算多情况

wrk -c36 -d 5s -t12 https://php7.test.com/v1/hello/wzh/index2
Running 5s test @ https://php7.test.com/v1/hello/wzh/index2
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.02s   569.99ms   1.96s    57.14%
    Req/Sec     3.18      3.43    10.00     80.88%
  70 requests in 5.03s, 21.60KB read
  Socket errors: connect 0, read 0, write 0, timeout 42
Requests/sec:     13.91
Transfer/sec:      4.29KB

php8 JIT 开启计算少情况

wrk -c36 -d 5s -t12 https://php8.test.com/v1/hello/wzh/index1
Running 5s test @ https://php8.test.com/v1/hello/wzh/index1
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    34.48ms    4.34ms  95.45ms   87.87%
    Req/Sec    84.61     13.36   121.00     85.28%
  5083 requests in 5.03s, 1.67MB read
Requests/sec:   1010.55
Transfer/sec:    340.43KB

php8 JIT 开启计算多情况

wrk -c36 -d 5s -t12 https://php8.test.com/v1/hello/wzh/index2
Running 5s test @ https://php8.test.com/v1/hello/wzh/index2
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    97.84ms    4.97ms 159.50ms   92.12%
    Req/Sec    30.27      4.42    50.00     86.50%
  1814 requests in 5.07s, 614.71KB read
Requests/sec:    357.76
Transfer/sec:    121.23KB

php8 JIT 关闭计算少情况

wrk -c36 -d 5s -t12 https://php8.test.com/v1/hello/wzh/index1
Running 5s test @ https://php8.test.com/v1/hello/wzh/index1
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency    38.10ms    6.47ms 239.60ms   94.01%
    Req/Sec    77.50     12.76   110.00     89.63%
  4622 requests in 5.04s, 1.52MB read
Requests/sec:    916.22
Transfer/sec:    308.65KB

php8 JIT 关闭计算多情况

wrk -c36 -d 5s -t12 https://php8.test.com/v1/hello/wzh/index2
Running 5s test @ https://php8.test.com/v1/hello/wzh/index2
  12 threads and 36 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency   766.16ms  181.30ms 887.08ms   88.37%
    Req/Sec     6.25      5.36    20.00     91.36%
  215 requests in 5.09s, 72.86KB read
Requests/sec:     42.22
Transfer/sec:     14.31KB

发现计算少情况下 php8 JIT 是 php7 性能的 13 倍,而且计算越多优化越明显,计算多情况下 php8 JIT 是 php7 性能的 25.7 倍。

但是有一个问题我觉得很神奇 php8 无 JIT 计算少的情况居然也优化了很多,我以为是测试方向的问题,但是经过多次论证,这个数据是准确的,有时间想找一下这里的优化点是什么。

编译过程

吐槽:php 手动编译越来越麻烦了,编译了 2 个小时才编译完,踩了 N 个坑,为了让大家多写几个需求,把坑分享出来

环境

aliyun centos 6.9,咱们公司一般都是这个版本。

php 源码编译

wget https://downloads.php.net/~carusogabriel/php-8.0.0alpha2.tar.gz

tar -zxf php-8.0.0alpha2.tar.gz

cd php-8.0.0alpha2

./configure --prefix=/yourdir/php8 --with-config-file-path=/yourdir/php8/etc --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-fpm --enable-static --enable-sockets --with-zip --enable-calendar --enable-bcmath --enable-mbstring --with-zlib --with-iconv=/usr/local/libiconv --enable-gd --enable-mbstring --with-freetype --with-mysql-sock=/tmp/mysql.sock --disable-ipv6 --enable-debug --with-openssl --enable-opcache

这里一般都是 makefile 生成失败的,后面有生成失败的例子,生成成功后

make -j 8

make install

cp php.ini-production /yourdir/php8/etc/php.ini

配置 php.ini

记住一定要把 opcache.ini 旧的配置也写上,JIT 说到底还是对 Opcache 的优化。

zend_extension=opcache.so
opcache.enable=1

; 命令行测试的话这里一定要打开
opcache.enable_cli=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.validate_timestamps=1
opcache.revalidate_freq=300
opcache.fast_shutdown=1
opcache.enable_file_override = 1
opcache.blacklist_filename = /etc/php.d/opcache.blacklist

; 这里就是新的jit的配置
opcache.jit=1205
opcache.jit_buffer_size=64M

configure 失败解决方法

这里解决./configure 失败的一些问题

问题一

No package 'qlite3' found

解决办法

wget https://www.sqlite.org/2020/sqlite-autoconf-3320300.tar.gz

tar -zxf sqlite-autoconf-3320300.tar.gz

cd sqlite-autoconf-3320300

./configure --prefix=/usr/local/lib/sqlite-3.32.0

make CFLAGS="-g -O2 -DSQLITE_ENABLE_COLUMN_METADATA"

make install

export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/sqlite-3.32.0/lib/pkgconfig"

注意

直接这样是不行的,yum 仓库里的版本太低。

yum install sqlite-devel 

问题二

configure: error: Please reinstall the iconv library.

解决办法

wget http://ftp.gnu.org/pub/gnu/libiconv/libiconv-1.14.tar.gz

tar -zxf libiconv-1.14.tar.gz

cd libiconv-1.14

./configure 

make 

make install

问题三

No package 'oniguruma' found

同样 yum 也是不行的,版本太低。

yum install oniguruma-devel 

解决办法

wget https://github.com/kkos/oniguruma/archive/v6.9.5_rev1.tar.gz

tar -zxf v6.9.5_rev1.tar.gz

cd oniguruma-6.9.5_rev1/ 

autoreconf -vfi

./configure --prefix=/usr/local/lib/oniguruma-6.9.5

make 

make install

export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/oniguruma-6.9.5/lib/pkgconfig"

问题四

No package 'libzip' found

解决办法

wget https://libzip.org/download/libzip-1.7.2.tar.gz

tar -zxf libzip-1.7.2.tar.gz

cd libzip-1.7.2

cmake3 -DCMAKE_INSTALL_PREFIX=/usr/local/lib/libzip-1.7.2

make 

make install

export PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/libzip-1.7.2/lib/pkgconfig"
标签:
评论 0
/ 1000
0
0
收藏