• 技术文章 >后端开发 >PHP8

    虽迟但到!PHP8测评来了~

    藏色散人藏色散人2020-09-16 16:53:13转载3698
    6月25号php 8 alpha 1发布,7月9号 php 8 alpha 2发布,一般alpha 2是一个稍微能用的版本,所以周末测评了一下php8 JIT到底是个什么?

    先看一下结果:

    JIT不开启的情况下

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

    JIT开启的情况下:

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

    还有不打开Opcache的情况下:

    php Zend/bench.php
    simple             0.051simplecall         0.017simpleucall        0.083simpleudcall       0.089mandel             0.506mandel2            0.409ackermann(7)       0.095ary(50000)         0.012ary2(50000)        0.010ary3(2000)         0.187fibo(30)           0.367hash1(50000)       0.040hash2(500)         0.041heapsort(20000)    0.097matrix(20)         0.122nestedloop(12)     0.093sieve(30)          0.063strcat(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 readRequests/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 readRequests/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 readRequests/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 readRequests/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 readRequests/sec:     42.22
    Transfer/sec:     14.31KB

    [image:BA1A37D8-760E-4637-901B-3E3521F969E7-4107-0000191504DD1B2E/86D37899-3B46-4BDA-B396-E5C8DD51068E.png]

    发现计算少情况下php8JIT是php7性能的13倍,而且计算越多优化越明显,计算多情况下php8JIT是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.gzcd 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 'sqlite3' found

    解决办法

    wget https://www.sqlite.org/2020/sqlite-autoconf-3320300.tar.gz
    
    tar -zxf sqlite-autoconf-3320300.tar.gzcd sqlite-autoconf-3320300
    
    ./configure --prefix=/usr/local/lib/sqlite-3.32.0
    
    make CFLAGS="-g -O2 -DSQLITE_ENABLE_COLUMN_METADATA"make installexport 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.gzcd 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.gzcd oniguruma-6.9.5_rev1/ 
    
    autoreconf -vfi
    
    ./configure --prefix=/usr/local/lib/oniguruma-6.9.5
    
    make 
    
    make installexport 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.gzcd libzip-1.7.2
    
    cmake3 -DCMAKE_INSTALL_PREFIX=/usr/local/lib/libzip-1.7.2
    
    make 
    
    make installexport PKG_CONFIG_PATH="$PKG_CONFIG_PATH:/usr/local/lib/libzip-1.7.2/lib/pkgconfig"复制代码

    Enjoy php 8 & JIT !

    以上就是虽迟但到!PHP8测评来了~的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:juejin,如有侵犯,请联系admin@php.cn删除
    专题推荐:PHP8
    上一篇:了解PHP 8的JIT 下一篇:php8的扩展arginfo生成工具之使用初体验
    线上培训班

    相关文章推荐

    • 全方位解读php8.0版本优化与改进• php8具体发布时间表一览!• PHP8 新特性 match 表达式详解• PHP8新特性之构造函数属性大加强!

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网