Nginx+PHP-FPM集群不跑满

来源:互联网 发布:js获取json中的键值 编辑:程序博客网 时间:2024/06/05 11:57
  1. 服务器配置架构
    硬件:
    Nginx:4核4G,外网200M
    PHP-FPM:4核4G*8台
    软件:
    Nginx:1.2.10
    PHP:5.6.30
  2. 出现的问题
    使用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只需要很短的时间就把队列里面的任务处理完成。因此考虑把队列加大避免太早出现队列满载。
  3. 解决方案
    根据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
  4. 效果
    通过access.log查看结果,请求均能平均分发到各台服务器中。