根据实测数据,每个 PHP-FPM 子进程常驻 RSS 通常在 25–50MB,4GB 内存服务器预留 30% 系统内存后,pm.max_children 安全值应设为 56–60 而非默认 100。
原因分析
pm.max_children 直接决定 PHP-FPM 最多能 fork 出多少个子进程,设高了会触发系统 OOM killer 杀进程,设低了会导致 502 Bad gateway 或 504 Gateway Time-out 错误。根据 2026 年 4 月 26 日收录的技术资料,常见错误是拿 ps aux 看到的 VSZ 或%MEM 估算,这会严重高估——VSZ 包含未分配的虚拟内存,%MEM 是瞬时快照,真正该看的是 RSS 均值。每个子进程平均吃掉 20–50MB 内存(取决于扩展加载量和脚本复杂度),设成 100 意味着可能占用 2–5GB 物理内存,而服务器可能只有 2GB。
计算 pm.max_children 的核心公式
第一步:查当前 PHP 进程平均内存占用。在 SSH 执行命令ps aux --sort=-%mem | grep php-fpm | head -n 5,看 RSS 列取中间值(如 36MB)。更精确的采样方式是用ps -eo pid,ppid,cmd,%mem,rss --sort=-rss | grep "php-fpm: pool" | head -20,排除刚启动、空闲或正在回收的进程,取中间 10 个的 RSS 平均值。
第二步:预留系统内存。留出 30% 内存给系统、MySQL、宝塔自身等。例如 4GB 总内存,可用约 2800MB 给 PHP-FPM;8GB 内存预留 2GB 后,可用约 6GB。
第三步:计算上限并打八折。公式为floor(可用内存 MB / 单进程 RSS MB) × 0.8。例如 4GB 服务器,单进程 38MB,计算floor(2800 / 38) ≈ 73,再打八折得 56–60 作为 pm.max_children。8GB 服务器单进程 30MB,理论上限 200,实际建议 120–160 更稳妥。
配置 pm.start_servers 避免高并发卡顿
宝塔默认 pm = dynamic,但很多人把 pm.start_servers 设成 2 或 5,结果高并发一来,新请求排队等进程启动,延迟飙升到 2s+,Nginx 报 upstream timed out。正确做法是进宝塔「网站」→「PHP 设置」→「性能调整」,看「当前运行中进程数」的 5 分钟低谷值(比如常在 12–18 之间波动),pm.start_servers 设为该区间的下限(如 12),pm.min_spare_servers 设为 8–10。pm.max_spare_servers 别超过 pm.max_children × 0.3,否则空闲时也占着大量内存。
修改配置的正确流程
确认改的是对应 PHP 版本的/www/server/php/{版本号}/etc/php-fpm.d/www.conf,不是/www/server/php/{版本号}/etc/php-fpm.conf(后者没有 pm.*参数)。改完必须执行bt restart php或在宝塔界面点「重载配置」——只点「保存」完全没用。宝塔 7.9+ 的 PHP 管理模块会拦截非面板操作的配置写入,建议用 bt 17 命令重载比 systemctl reload 更安全。验证是否生效用ps aux | grep php-fpm | wc -l看进程数,或用php-fpm-{版本号} -t检查语法(输出 test is successful 才算过关)。
注意事项
第一,调了 pm.max_children 还是 502?真因往往不在这里。检查 pm.status_path 是否启用(宝塔默认关),启用后可用curl http://127.0.0.1/status?full查看真实进程状态,确认是否真达到 max_children。第二,翻/www/wwwlogs/php_slow.log,如果大量请求 duration > 1000ms,说明是脚本慢,加进程只会让内存更快耗尽。第三,Nginx 的 fastcgi_read_timeout 默认 60 秒,若 PHP 脚本真要跑 90 秒,得同步调大,否则 Nginx 主动断连导致 502。第四,1GB 内存服务器 pm.max_children 设成 10 都可能撑不住,建议从 2–3 起步并用 ondemand 模式。第五,不建议设置超过 300 并发上限,哪怕服务器性能足够好,若发现并发不够用,尝试优化站点数据库缓存可能更有效。
参考来源
来源:宝塔面板技术文档 - 如何优化 PHP-FPM 的进程管理模式_根据内存调整 pm.max_children(2026 年 4 月 17 日)
来源:SegmentFault 技术社区 - PHP-FPM 的 pm.max_children 配置值怎么计算(2016 年 7 月 6 日)
来源:Linux 运维教程 - centos 下 php-fpm 进程数如何设置合理(2025 年 12 月 5 日)
来源:PHP 性能优化指南 - PHP-FPM 调优配置建议(2025 年 5 月 13 日)