pm.max_children需按内存倒推法动态设定:先用ps命令查PHP-FPM进程实际RSS,再用(总内存−系统及其他服务占用)÷单进程平均RSS得出理论值,向下取整并留余量;结合dynamic模式与业务波峰特征配置四参数,并通过状态监控和日志持续验证调优。

PHP-FPM 的 pm.max_children 不是固定值,得根据服务器内存、每个 PHP 进程平均内存占用、并发请求数三者动态平衡来设。设小了会频繁 502,设大了可能 OOM 杀进程。
先估算单个 PHP 进程实际内存开销
别直接看 phpinfo() 里的 memory_limit,那是上限。真实值要看运行时 RSS(常驻内存):
- 用
ps aux --sort=-%mem | grep "php-fpm" | head -10查当前活跃子进程的 RSS 列(单位 KB) - 挑几个典型游戏接口(如登录、战斗结算)压测,用
ab或wrk发 50–100 并发,再查 RSS 均值 - 游戏站常见范围:简单页面约 20–40MB,带 Redis/MySQL/加载大量类的逻辑(如技能计算、掉落模拟)可能到 60–100MB
用可用内存倒推最大子进程数
公式:max_children ≤ (总内存 − 系统及其他服务占用) ÷ 单进程平均 RSS
- 例如:4GB 内存服务器,留 1GB 给系统、MySQL、Redis → 可用约 3GB = 3072MB
- 若实测平均进程占 64MB → 3072 ÷ 64 ≈ 48 →
pm.max_children = 45(留点余量) - 8GB 机器跑中型游戏站,常见设为 60–100;16GB+ 可到 120–180,但必须配合压测验证
结合 pm 模式和游戏业务特征调优
游戏网站请求有明显波峰(如开服、活动开启),且部分接口耗时长(如抽卡、合成),需避免子进程被长时间占满:
- 用
pm = dynamic(不推荐 static),并合理设pm.start_servers、pm.min_spare_servers、pm.max_spare_servers - 比如:设
pm.max_children = 80,则pm.start_servers = 20,pm.min_spare_servers = 15,pm.max_spare_servers = 40 - 加
pm.max_requests = 500–1000防止长期运行内存泄漏(尤其用了某些扩展或全局缓存的游戏逻辑)
上线后必须持续观察和微调
光靠理论值不够,得看真实负载:
- 监控
pm.status页面里的active processes和max active processes是否频繁逼近 max_children - 查 Nginx error log 是否有 “upstream sent too big header” 或 “No live upstreams while connecting to upstream” —— 往往是 FPM 子进程不够用的信号
- 用
free -h和cat /proc/meminfo | grep MemAvailable看是否内存吃紧;dmesg -T | grep -i "killed process"确认是否被 OOM killer 干掉过
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











