如何最优调整 pm.max_children 的值,本文只讨论非 CPU 密集计算下的情况
问题:
[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,子进程已经跑满了,请考虑扩大下
解决:
我们需要根据系统上的内存量来计算和更改这些值,打开 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. pm = static
含义:静态模式,启动时直接创建固定数量的子进程(等于 pm.max_children)
有效范围:所有模式下均有效
特性:
- 进程数量固定不变
- 适合高负载场景,减少进程创建开销
- 无需动态调整进程数,资源消耗稳定23
2. pm.max_children = 50
含义:允许创建的最大子进程数量
有效范围:所有模式均有效
特性:
- 硬性限制进程池容量
- 超过此值会导致新请求被拒绝(返回 502 错误)
- 需根据服务器内存计算:推荐值=可用内存−系统预留单进程平均内存推荐值=单进程平均内存可用内存−系统预留例如:若单进程占 60MB,可用内存 4GB,则最大进程数 ≈ 6814
3. pm.start_servers = 10
含义:服务启动时初始创建的子进程数
有效范围:仅在 dynamic 模式下有效
无效场景:
static模式:进程数固定为pm.max_children,忽略此值ondemand模式:启动时不创建进程,此值无效23
4. pm.min_spare_servers = 10
含义:最小空闲进程数(低于此值会创建新进程)
有效范围:仅在 dynamic 模式下有效
无效场景:
static模式:进程数固定,无需动态调整ondemand模式:无空闲进程概念(请求结束即释放)32
5. pm.max_spare_servers = 40
含义:最大空闲进程数(超过此值会回收多余进程)
有效范围:仅在 dynamic 模式下有效
无效场景:
static模式:进程数固定,不回收进程ondemand模式:闲置进程被pm.process_idle_timeout控制23
6. pm.max_requests = 1024
含义:单个子进程处理的最大请求数(达到后自动重启)
有效范围:所有模式均有效
作用:
- 预防内存泄漏
- 建议值:500-2000(根据应用稳定性调整)
- 过高可能无法及时释放内存,过低增加进程回收开销14
7. pm.process_idle_timeout = 10s
含义:空闲进程被回收前的等待时间
有效范围:仅在 ondemand 模式下有效
无效场景:
static模式:进程常驻内存,不回收dynamic模式:通过min/max_spare_servers控制进程数23
不同模式下的参数有效性总结
| 配置项 | 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模式节省资源24
参考翻译:
https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/