Nginx+PHP-FPM集群不跑满

  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查看结果,请求均能平均分发到各台服务器中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值