现场是这样的。站点访问变慢,错误日志提示子进程数量已达上限,随后开始返回五百错误,重启服务能好一阵。

这类报错背后常见的原因有几处,逐个排除就行。每个请求占用时间长,子进程迟迟不释放;进程数按内存上限除以单进程占用估算不足;上游超时时间比脚本执行时间长,请求堆积。

先看进程池运行状态

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

中途换过一次思路,把范围缩到最小的那一层,反而快了。

中间停过一次,把已经改的东西回滚干净,再重新来一遍。

别只看报错消失,验证要多做一步。进程池不再打满,请求排队消失,页面响应时间恢复。

这里还有个坑。进程数不是越大越好,每个进程都要占几十兆内存;超出物理内存后会发生交换,比排队更慢。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189