流量上来后部分请求返回 502,日志显示进程池排队超时。乍看像缓存或者权限的锅,追下去往往不是。

pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.max_requests = 500

追下去是这么回事:进程池上限按默认值配置,并发请求超过可用进程数后被拒绝。

「PHP-FPM 进程数」相关的日志我一般连着看前后五分钟,单看一条报错经常判断不出是哪一步失败。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。改完顺手把文档补一句,省得下次自己重新推一遍。

监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

具体做法是,按内存估算可承载进程数;调整最大子进程与排队长度;观察内存与负载。

验收就看一点,高峰期不再出现 502,内存占用稳定。

作者 9823189