如何监控 PHP-FPM 的 QPS 并据此调整进程管理策略?

文章导读
监控 PHP-FPM QPS 需结合 Web 服务器访问日志或启用 pm.status_path 状态页配合监控工具,调整进程策略应依据单进程内存占用和服务器总内存计算 max_children。适用场景为高并发 PHP 服务,风险边界是进程数设置过高导致服务器内存溢出(OOM)。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

监控 PHP-FPM QPS 需结合 Web 服务器访问日志或启用 pm.status_path 状态页配合监控工具,调整进程策略应依据单进程内存占用和服务器总内存计算 max_children。适用场景为高并发 PHP 服务,风险边界是进程数设置过高导致服务器内存溢出(OOM)。

先说结论:PHP-FPM 自身不直接统计 QPS,需通过状态页监控进程积压和队列长度来间接评估负载,并据此动态或静态调整进程数。

  • 先定位:启用 status_path 查看 listen queue 和 idle processes 指标。
  • 先做:根据单进程内存和总内存计算 pm.max_children 上限。
  • 再验证:观察慢日志和队列长度是否归零,确认响应时间稳定。

命令速用版

通过 curl 请求状态页获取实时进程数据,或使用 awk 分析访问日志计算 QPS。

curl http://127.0.0.1:9000/status?full
awk '{print $4}' access.log | cut -d ':' -f2 | uniq -c | wc -l

为什么会这样

PHP-FPM 进程数直接决定并发处理能力,队列积压意味着请求等待。

PHP-FPM 采用多进程模型,每个请求占用一个子进程。当并发请求数超过空闲进程数时,请求进入 listen queue 等待。如果队列满或超时,Web 服务器会返回 502 Bad Gateway。调整进程管理策略(pm)是为了在内存限制内最大化并发处理能力。

分步处理

调整 PHP-FPM 进程策略需先测量单进程内存,再计算最大进程数,最后选择合适的 pm 模式。

  1. 启用状态页:在 php-fpm.conf 或 pool 配置中设置 pm.status_path = /status,并确保 Web 服务器允许访问该路径。
  2. 测量单进程内存:使用 ps 或 top 命令观察 php-fpm 子进程的平均内存占用,公开资料中没有看到可靠的量化数据,需根据实际业务代码测量。
  3. 计算 max_children:公式为(服务器总内存 - 其他服务预留内存)/ 单进程内存。例如预留 1GB 给系统,剩余内存除以单进程内存得到数值。
  4. 选择 pm 模式:内存充足且负载稳定选 static;内存有限或负载波动大选 dynamic;低流量服务选 ondemand。

怎么验证是否生效

验证生效需观察状态页中的 listen queue 长度和慢日志中的请求耗时。

如何监控 PHP-FPM 的 QPS 并据此调整进程管理策略?

访问 status 页面,检查 listen queue 是否长期大于 0。检查 php-fpm 慢日志(slowlog),确认没有大量请求超过预设阈值。监控 Web 服务器错误日志,确认 502 错误不再增加。

常见坑

配置状态页时未做访问控制会导致信息泄露,计算进程数时未预留系统内存会导致 OOM。

  • status_path 默认暴露敏感信息,必须限制仅本地或监控 IP 访问。
  • pm.max_children 设置过大,瞬间高并发会导致内存耗尽,触发 Linux OOM Killer 杀死进程。
  • dynamic 模式下 min_spare_servers 设置过高,低峰期会浪费内存。

常见问题

PHP-FPM 状态页在哪里配置?

在 php-fpm.conf 或 www.conf 配置文件中设置 pm.status_path 参数。

listen queue 大于 0 代表什么?

代表当前请求数超过空闲进程数,请求正在排队等待处理。

static 和 dynamic 模式怎么选?

内存充足且并发稳定选 static,内存有限或波动大选 dynamic。

参考来源

  • PHP Official Documentation, FPM Configuration, https://www.php.net/manual/zh/install.fpm.configuration.php