背景
一个项目,甲方要求 TPS 达到 5000。框架是yii2。
解决过程
在此之前,并没有碰到过此类提出明确性能指标的项目,这次算是头一次。刚开始拿到这个需求的时候并没有什么头绪,不知从何处下手,现在回过头来看,出现这样的情绪非常的正常。
不知道怎么办的时候,先找搜索引擎,查查看,搜集下相关的信息,主要是找找方向。
经过一番搜寻,大致有这么几个方面
1.PHP开启opcache
2.代理服务器(nginx)配置调整
3.php-fpm配置优化
4.代码,业务逻辑优化
5.内核参数优化
有了方向之后,逐条去确认就可以了,根据实际的压测指标,opcache 的开启对性能提升很大,具体操作如下
vim php.ini
新增
zend_extension=opcache.so #这里要注意的是 zend_extension,不是 extension
php -m 下看到
[Zend Modules]
Opcache
即说明已经开启
php-fpm 的参数优化
vim php-fpm.conf
pm.max_children #php-fpm可创建的最大的进程数
pm.start_servers #php-fpm进程启动创建的进程数
pm.min_spare_servers #php-fpm管理的进程数不能小于它,start_servers不能小于它
pm.max_spare_servers #php-fpm管理的最大进程数
通过对压测指标(ab测试)以及 top
命令的观察,此调整也有很明显的效果,并且 php
对内存的消耗并不高,给了我另外一个思路,CPU
核数对性能的影响,后面也测试了不同核数对性能的影响。
多核的影响
前面发现对 php-fpm
的配置进行了大幅的提升之后,内存消耗并没有明显变化,根据分析,增加 CPU
可能会对性能有影响。
配置对比 8cpu 32g 395 16cpu 16g 831 32cpu 32g 432
压测的指标很明确,cpu
核数的增加确实会对性能有提升,但也不是越多越好,需要根据数据找到一个合适的配置。
nginx 的配置优化
worker_processes #一般与CPU核数相同
worker_connection
use epoll
实际的压测指标也有不小的提升
内核参数优化
net.ipv4.tcp_max_tw_buckets
net.ipv4.tcp_sack
net.ipv4.tcp_window_scaling
...
这里的配置较多,有提升,幅度不大,聊胜于无。
经过上面的这些优化之后,较最初的测试指标提升到2.x倍。