- 服务器配置架构
硬件:
Nginx:4核4G,外网200M
PHP-FPM:4核4G*8台
软件:
Nginx:1.2.10
PHP:5.6.30 - 出现的问题
使用ab进行压力测试时,压力测试的结果偏低(1200req/s)。Nginx负载以及带宽都偏低,各PHP-FPM节点占用也偏低,查看PHP-FPM的status,其中max active processes只有50多。
PHP-FPM的配置:
pm = dynamic
pm.max_children = 512
理论上max_children应该能跑满512个进程,可是现实情况并没有这么理想。观察后发现,max listen queue刚好到达128后就没有新的请求进入,查看Nginx的access_log发现,压力测试后面请求的PHP-FPM节点都集中同一台服务器了并没有轮流请求每一台服务器。
因此,应该是Nginx在放到前面几台PHP-FPM服务器后发现队列已经满了接收不了新的请求,于是把它当做是已经宕机的服务器,列到失败列表后指定时间后重试,可是实际上PHP-FPM只需要很短的时间就把队列里面的任务处理完成。因此考虑把队列加大避免太早出现队列满载。 - 解决方案
根据PHP-FPM.cnof中的描述,max listen queue的大小受backlog的大小限制,因此需要修改系统的backlog大小从而使队列长度更大:
sysctl -w net.core.netdev_max_backlog = 65535
sysctl -w net.ipv4.tcp_max_syn_backlog = 65535
sysctl -w net.core.somaxconn = 65535
sysctl -p
修改后重启PHP-FPM即可以看到max listen queue大小为65535 - 效果
通过access.log查看结果,请求均能平均分发到各台服务器中。
Nginx+PHP-FPM集群不跑满
最新推荐文章于 2024-08-19 10:24:03 发布