pm.max_children需按真实内存倒推:先测单进程rss(如90–120mb),再扣减系统、mysql、nginx等占用得可用内存,最后用floor(可用内存÷rss)计算,结果向下取整,并配合dynamic模式参数校验。

pm.max_children 不是随便填个数字,它直接决定你的服务会不会在流量高峰时崩出 502,或者默默吃光内存触发 OOM。算错比不调更危险——数值偏小,请求排队、响应卡顿;偏大,系统杀进程、服务闪退。核心原则就一条:用真实内存数据倒推,不是查文档抄经验值。
第一步:测准单个 PHP 进程实际内存(RSS)
别信“平均 30MB”“64MB”这种老黄历。Laravel + Redis + Guzzle + 文件上传的典型请求,实测 RSS 常在 90–120MB。关键看 你自己的业务:
- 执行命令获取当前活跃进程的 RSS 中位数:
ps aux --sort=-%mem | grep 'php-fpm' | head -5 | awk '{print $6}' | sort -n | sed -n '3p' - 或快速估算平均值:
ps --no-headers -o rss -C php-fpm | awk '{sum+=$1} END {printf "%.0f MB\n", sum/NR/1024}' - 务必在业务中等负载(非空闲、非压测峰值)下采样,持续观察 10–15 分钟取稳定值
第二步:算清能分给 PHP-FPM 的安全内存上限
不是总内存,而是真正可自由支配的部分。用 free -h 看 total 后,逐项扣除:
- 系统基础占用:固定留 1.5GB(内核、sshd、cron、日志等)
- MySQL(同机部署):至少 2GB;若用云数据库,此项归零
- Nginx:约 300MB;若启用了大量模块或缓存,加到 500MB
- 宝塔面板或其它运维工具:约 200–400MB(如使用)
- 剩余值 = 可用内存(单位 MB),这就是你唯一能动的“池子”
第三步:用公式得出最终值,并向下取整
公式很简单,但执行必须严格:
pm.max_children = floor(可用内存 MB ÷ 单进程 RSS MB)- 例如:可用内存 5200MB,实测单进程 RSS 105MB → 5200 ÷ 105 ≈ 49.52 → 结果为 49
- 宁可少 1 个,绝不四舍五入。多这 1 个,可能就是 OOM 的最后一根稻草
- 如果结果小于 10,说明内存严重不足或进程异常臃肿,优先排查脚本、扩展或内存泄漏
第四步:结合 pm 模式做联动校验
max_children 是“天花板”,但动态模式下还需配套参数协同工作:
- 确认
pm = dynamic(绝大多数场景推荐) -
pm.start_servers设为 CPU 核心数(nproc查得),不建议 ×2 —— 容易冷启动过载 -
pm.min_spare_servers= 核心数,pm.max_spare_servers= 核心数 × 2~3 - 确保
pm.max_spare_servers ,否则空闲伸缩会顶到上限,失去弹性意义
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











