高并发场景下,若服务器内存充足(≥8GB)且负载稳定,优先选择 static 模式以减少进程创建开销;若流量波动大或内存受限,选择 dynamic 模式但必须手动调优进程参数。
先说结论:static 模式适合内存充足、并发稳定的核心服务,dynamic 模式适合流量波动大的通用场景,选错会导致内存溢出或响应延迟。
- 适合:static 用于电商核心交易等稳定高并发,dynamic 用于早晚高峰波动网站
- 重点看:static 需计算 pm.max_children,dynamic 需协调 start_servers 与 spare 参数
- 别忽略:1G 内存服务器 dynamic 模式默认 pm.max_children=50 极易导致内存耗尽
命令速用版
修改配置后必须验证语法并重载服务,否则配置不生效。
php-fpm -t systemctl reload php-fpm ps aux | grep 'php-fpm:' | wc -l
为什么会这样
static 模式预创建固定进程,避免了高并发下频繁 fork 子进程的 CPU 和内存抖动。
dynamic 模式按需伸缩进程,虽然节省空闲内存,但在请求突发时创建进程需要时间,且频繁销毁重建会加剧系统负载。若 dynamic 参数默认值未调整,如 1G 内存服务器默认创建 50 个子进程,每个进程常驻 30–60MB,极易吃光内存导致 502 错误。
分步处理
第一步:评估服务器内存与并发特征。内存≥8GB 且负载稳定选 static,流量波动大或内存<4GB 选 dynamic。
第二步:计算进程数量。static 模式直接设置 pm.max_children,公式参考:可用内存 × 0.8 ÷ 单进程平均内存。例如 8GB 内存、单进程 40MB,可设为 160 左右。
第三步:修改配置文件。static 模式设 pm = static 并指定 pm.max_children;dynamic 模式设 pm = dynamic,调整 pm.start_servers 为 CPU 核心数 × 2,pm.min_spare_servers 与 pm.max_spare_servers 差值控制在 5–10 以内。
第四步:重载服务。执行 php-fpm -t 验证语法,确认无误后 systemctl reload php-fpm 或 bt 18 重载。
怎么验证是否生效
查看进程数是否符合预期。使用 ps aux | grep 'php-fpm:' | wc -l 统计进程数,static 模式下应恒定等于 pm.max_children 设置值。
检查服务状态。执行 systemctl status php-fpm 确认服务运行正常,无重启循环或报错。
监控内存占用。观察服务器内存使用率,确保未因进程过多导致 swap 交换或 OOM。
常见坑
动态模式参数未协同。只改 pm.max_children 不改 pm.start_servers,导致初始进程数不足,突发请求排队。
忘记重载服务。修改配置文件后未 reload,宝塔面板显示“运行中”但实际进程策略未更新。
Static 模式误用阻塞应用。若 PHP 应用有频繁 fork 或长时间阻塞 I/O,static 模式下一个进程卡死会占用固定槽位,导致整个池子堵住。
默认配置陷阱。1G 内存轻量服务器直接使用 dynamic 默认配置(pm.max_children=50),极易内存爆满。
常见问题
Static 和 Dynamic 模式的核心区别是什么?
Static 模式启动时固定创建指定数量子进程且不增减,Dynamic 模式根据负载动态伸缩进程数。
内存较小的服务器应该选哪种模式?
内存较小(如 1G)建议选 dynamic 模式但必须调小 pm.max_children 至 20 左右,避免内存耗尽。
OnDemand 模式适合高并发吗?
不适合,OnDemand 模式仅在接收请求时创建进程,高并发下频繁创建销毁会导致性能下降,仅适合低负载场景。
参考来源
- 宝塔面板如何优化 PHP 运行模式_对比 Static 与 Dynamic 模式
- ThinkPHP 如何优化海量并发下的服务器环境_FPM 参数与缓存调优
- php-fpm 配置怎么优化_提升 web 服务性能方法【技巧】
- Ubuntu PHP-FPM 如何选择合适的进程管理器
- PHP-FPM 进程模式怎么选
- PHP 动态模式和静态模式区别