背景
- 最近接手公司一个项目,日峰值QPS大概4万/秒左右,
- 用了60台机器,42台24核/64G,18台16核20G,峰值时CPU空闲率80%左右
- Nginx+PHP5.5,CentOS6.6
- 很明显,性能低下,浪费大量资源,所以决定入手优化
第一步升级PHP7
- CentOS6.6,Nginx,PHP7.0 (很多原因没能升到7.2),都是系统部提供的默认配置
- 压力测试对比:旧系统单机16核压测QPS 1500 左右,新环境16核单机3100左右
- 压测选择的一个业务相对比较简单的接口,没有数据库操作
第二部优化配置/代码
- 可以说,单独升级带来的性能提升并不理想,所以在配置和代码中继续探究
- 修改php-fpm配置:
pm = static, pm.max_children = 64
fpm进程数改为静态,开启64个 listen=/dev/shm/php-fcgi.sock
由监听本地端口改为sock- 修改
opcache.revalidate_freq=5
,脚本文件更新检测周期改为5秒,之前是0,每次都检测 - 代码中 mcrypt 改为 openssl, mcrypt在php7.2中正式废弃
- 上述优化后,单机QPS 提升到 4500 左右
其实这个性能仍然并不太满意,代码还有很多可以优化的地方,只是改动比较大,不想承担风险了,所以本次优化就这么结束。机器从60台,减少到现在的50台8核/16G(配置了https,所以机器多了很多)
基础测试
- 最近看PHP7.3 正式发布了,手痒,拿过来测试下
- 编译安装后,未修改任何代码,16核机器QPS直接提升到了 6500 左右
- 有点惊喜,所以做了一系列基础测试
本次测试环境
- 硬件:16核32G 虚拟机
- Linux内核:
2.6.32-642.15.1.el6.x86_64
- 系统:
LSB Version: :base-4.0-amd64:base-4.0-noarch:core-4.0-amd64:core-4.0-noarch:graphics-4.0-amd64:graphics-4.0-noarch:printing-4.0-amd64:printing-4.0-noarch
Distributor ID: CentOS
Description: CentOS release 6.6 (Final)
Release: 6.6
Codename: Final
- 以下均为运行10次测试脚本,记录耗时,去掉最大值和最小值后8个值取平均值
基本元素测试
- 测试for/while/foreach/if/三元表达式
- 测试结果表明,PHP7比php5 在各方面都有较大幅度提升
- php7.3与7.0相比,各项性能均有小幅提升,if语句和三元表达式性能提升较多
函数测试
- 测试 自定义函数/3层递归调用/strlen/empty/sort
- sort for循环调用2,000,000次,排序数组为20个元素
- 可以发现,php7.3 自定义函数调用性能大幅提升,其他各项略有提升
类与对象
- 测试普通方法调用/静态调用/extends/trait/abstract
- 和函数 比较类似,在普通方法调用上大幅提升,其他方面略有提升或持平
测试代码及结果
可能我的测试不是很标准,这里放出测试代码,供大家参考,指正。 https://gitee.com/664712890/PHP-Performance-Testing/
压测工具
最后推荐一个非常好用的压测工具:https://github.com/tsenart/vegeta