测试环境介绍
机器是一台基于 vmware 的虚拟机
CPU: cat /proc/cpuinfo 看到为 8 核 CPU, 型号是 Intel(R) Xeon(R) CPU E5-2430 v2 @ 2.50GHz MEM: free 命令看到内存大小为 16G nginx 版本为 1.11.5, worker_processes 8 php 版本为 7.0.12, fpm 进程 100 个
程序是 yii2-app-basic , HelloController.php 文件内容如下:
<?php namespace app\controllers; class HelloController extends \yii\web\Controller { public function actionWorld() { return 'Hello, world!'; } }
测试命令: ab -n10000 -c100 ‘http://yii2.app.com:8090/index.php?r=/hello/world’
测试结果:
Opcache | CPU占用 | Requests per second(吞吐率) |
---|---|---|
未开启 | 99% | 520 |
开启 | 99% | 5480 |
用 strace 追踪 php-fpm 的系统调用(strace 会严重影响性能,追踪系统调用时用的测试命令是:ab -n1000 -c100 ‘http://yii2.app.com:8090/index.php?r=/hello/world’,总请求减少为之前的10%),结果如下:
未开启 Opcache php-fpm的系统调用 % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 29.99 0.512695 3 174053 fstat 18.60 0.318016 5 59611 munmap 13.98 0.238919 4 58059 3 open 13.56 0.231822 4 59235 mmap 9.70 0.165759 3 59559 close 4.83 0.082623 8 11010 4 lstat 3.46 0.059209 2 28014 read 1.14 0.019432 4 5102 100 stat 0.76 0.012930 13 1000 accept 0.66 0.011317 6 2000 chdir 0.50 0.008500 8 1005 write 0.50 0.008488 8 1001 getcwd 0.44 0.007527 8 1000 shutdown 0.41 0.006957 2 3000 setitimer 0.40 0.006795 7 1000 poll 0.37 0.006369 4 1610 rt_sigaction 0.31 0.005215 3 2000 times 0.19 0.003238 2 2000 recvfrom 0.11 0.001857 2 1001 rt_sigprocmask 开启 Opcache php-fpm的系统调用 % time seconds usecs/call calls errors syscall ------ ----------- ----------- --------- --------- ---------------- 26.92 0.041058 1 28015 read 15.73 0.023990 5 5160 100 stat 8.44 0.012872 6 2000 chdir 6.78 0.010336 3 3000 setitimer 6.04 0.009209 4 2132 fcntl 5.49 0.008373 8 1000 accept 5.29 0.008068 13 615 4 lstat 3.63 0.005544 3 1618 close 3.48 0.005308 3 2000 times 3.01 0.004586 5 1001 rt_sigprocmask 2.90 0.004427 4 1005 write 2.65 0.004042 4 1001 getcwd 2.39 0.003651 2 1610 rt_sigaction 2.29 0.003491 2 2000 recvfrom 1.93 0.002950 3 1000 shutdown 1.65 0.002516 3 1000 poll 0.81 0.001241 3 397 mmap 0.38 0.000582 6 100 clone
测试结果分析:
Opcache 开启前后 cpu 使用率都达到了 100% 说明系统瓶颈在 cpu。开启 Opcache 后系统调用少了很多,特别是 fstat,mumap,open,mmap,开启后,这几个系统调用可以忽略不计。Opcache 省去了每次加载和解析 PHP 脚本的开销,一次加载解析后后续请求不用去读源码,因此少了这么多系统调用。
结论:提高PHP程序的性能,最重要也最有效的方法就是开启 Opcache。
其它: 最初 fpm 配置是监听端口,吞吐率在开启Opcache前只有340左右;开启Opcache后在900左右,cpu占有80%,无法达到100%;如果请求过多,则会出现超时错误。后来改 fpm 监听 unix sock,性能一下子上来了。Yii2 开启 debug 模式后,吞吐率为 1200 左右。
Pingback: 主流PHP框架 Yii2,Laravel,CodeIgniter 性能对比 – 开飞机的小蜗牛
Pingback: php5.6 和 php7 性能对比 – 开飞机的小蜗牛