如何最优调整 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 配置参数的解释,包括各模式下无效参数说明:
pm = static含义:静态模式,启动时直接创建固定数量的子进程(等于 pm.max_children)\
有效范围:所有模式下均有效\
特性:
pm.max_children = 50含义:允许创建的最大子进程数量\ 有效范围:所有模式均有效\ 特性:
pm.start_servers = 10含义:服务启动时初始创建的子进程数\
有效范围:仅在 dynamic 模式下有效\
无效场景:
static 模式:进程数固定为 pm.max_children,忽略此值ondemand 模式:启动时不创建进程,此值无效pm.min_spare_servers = 10含义:最小空闲进程数(低于此值会创建新进程)\
有效范围:仅在 dynamic 模式下有效\
无效场景:
static 模式:进程数固定,无需动态调整ondemand 模式:无空闲进程概念(请求结束即释放)pm.max_spare_servers = 40含义:最大空闲进程数(超过此值会回收多余进程)\
有效范围:仅在 dynamic 模式下有效\
无效场景:
static 模式:进程数固定,不回收进程ondemand 模式:闲置进程被 pm.process_idle_timeout 控制pm.max_requests = 1024含义:单个子进程处理的最大请求数(达到后自动重启)\ 有效范围:所有模式均有效\ 作用:
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/