现场是这样的。站点访问变慢,错误日志提示子进程数量已达上限,随后开始返回五百错误,重启服务能好一阵。
这类报错背后常见的原因有几处,逐个排除就行。每个请求占用时间长,子进程迟迟不释放;进程数按内存上限除以单进程占用估算不足;上游超时时间比脚本执行时间长,请求堆积。
先看进程池运行状态
systemctl status php-fpm
然后统计各状态进程数量
ps -o stat,cmd -C php-fpm | sort | uniq -c
接着按可用内存重算进程数
grep -E 'pm.max_children|pm.memory' /etc/php-fpm.d/www.conf
调大上限并观察内存
systemctl reload php-fpm && free -h
中途换过一次思路,把范围缩到最小的那一层,反而快了。
中间停过一次,把已经改的东西回滚干净,再重新来一遍。
别只看报错消失,验证要多做一步。进程池不再打满,请求排队消失,页面响应时间恢复。
这里还有个坑。进程数不是越大越好,每个进程都要占几十兆内存;超出物理内存后会发生交换,比排队更慢。这类问题最好一次改到位,反复小改反而容易把原因搅混。