菜单
优化php-fpm子进程动态管理

如何最优调整 pm.max_children 的值,本文只讨论非 CPU 密集计算下的情况

问题

小鸡上的博客最近响应很慢,查看了 fpm 日志如下

[04-Jul-2019 18:54:07] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
[04-Jul-2019 18:57:53] WARNING: [pool www] server reached pm.max_children setting (5), consider raising it

很明显,php-fpm.log 告警说 pm.max_children 设置是5,子进程已经跑满了,请考虑扩大下

解决

由于机器资源紧张,这里使用了dynamic管理方式,我们需要根据系统上的内存量来计算和更改这些值,打开 php-fpm.conf

pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3

以下命令将帮助我们确定每个(PHP-FPM)子进程使用的内存

ps -ylC php-fpm --sort:rss

RSS列显示PHP-FPM进程的非交换物理内存使用量(以 kb 为单位)

公式

pm.max_children = 要分配给php-fpm的总内存 / 子进程最大占用内存或平均内存

您可以使用这个方便的命令计算 PHP-FPM 进程平均内存使用情况

ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

PHP-FPM 配置项详解

以下是对提供的 PHP-FPM 配置参数的解释,包括各模式下无效参数说明:

  1. <br />

pm = static

含义:静态模式,启动时直接创建固定数量的子进程(等于 pm.max_children)\ 有效范围:所有模式下均有效\ 特性

  • 进程数量固定不变
  • 适合高负载场景,减少进程创建开销
  • 无需动态调整进程数,资源消耗稳定

  1. <br />

pm.max_children = 50

含义:允许创建的最大子进程数量\ 有效范围所有模式均有效\ 特性

  • 硬性限制进程池容量
  • 超过此值会导致新请求被拒绝(返回 502 错误)
  • 需根据服务器内存计算:推荐值=可用内存−系统预留单进程平均内存推荐值=单进程平均内存可用内存−系统预留。​例如:若单进程占 60MB,可用内存 4GB,则最大进程数 ≈ 68

  1. <br />

pm.start_servers = 10

含义:服务启动时初始创建的子进程数\ 有效范围:仅在 dynamic 模式下有效\ 无效场景

  • static 模式:进程数固定为 pm.max_children,忽略此值
  • ondemand 模式:启动时不创建进程,此值无效

  1. <br />

pm.min_spare_servers = 10

含义:最小空闲进程数(低于此值会创建新进程)\ 有效范围:仅在 dynamic 模式下有效\ 无效场景

  • static 模式:进程数固定,无需动态调整
  • ondemand 模式:无空闲进程概念(请求结束即释放)

  1. <br />

pm.max_spare_servers = 40

含义:最大空闲进程数(超过此值会回收多余进程)\ 有效范围:仅在 dynamic 模式下有效\ 无效场景

  • static 模式:进程数固定,不回收进程
  • ondemand 模式:闲置进程被 pm.process_idle_timeout 控制

  1. <br />

pm.max_requests = 1024

含义:单个子进程处理的最大请求数(达到后自动重启)\ 有效范围所有模式均有效\ 作用

  • 预防内存泄漏
  • 建议值:500-2000(根据应用稳定性调整)
  • 过高可能无法及时释放内存,过低增加进程回收开销

  1. <br />

pm.process_idle_timeout = 10s

含义:空闲进程被回收前的等待时间\ 有效范围:仅在 ondemand 模式下有效\ 无效场景

  • static 模式:进程常驻内存,不回收
  • dynamic 模式:通过 min/max_spare_servers 控制进程数

不同模式下的参数有效性总结

配置项 static dynamic ondemand
pm.max_children
pm.start_servers
pm.min_spare_servers
pm.max_spare_servers
pm.max_requests
pm.process_idle_timeout

关键建议

  • 高负载场景:用 static 模式避免进程创建开销
  • 流量波动大:用 dynamic 模式动态调整进程
  • 低流量场景:用 ondemand 模式节省资源

参考翻译\ https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/