php-fpm内存飙升典型表现为多个进程各占80–150mb、总内存超70%甚至触发oom killer,或宝塔显示php内存>90%伴502错误频发;主因是pm.max_children过高叠加请求堆积。

PHP-FPM 内存飙升的典型表现是什么
你看到 top 或 htop 里多个 php-fpm 进程各自占 80–150MB 内存,总内存占用持续超 70%,甚至触发 OOM Killer 杀进程;或者宝塔面板监控页显示「PHP 服务内存使用率 >90%」但网站响应变慢、502 错误频发——这基本不是单个脚本泄漏,而是 pm.max_children 设置过高 + 请求堆积导致子进程无节制创建。
怎么安全调低 max_children
盲目砍数值会直接引发 502,关键在「匹配实际并发」而非拍脑袋。先用宝塔日志或 ss -ant | grep :80 | wc -l 粗估当前活跃连接数,再按 PHP-FPM 官方公式反推:
max_children ≈ (总可用内存 × 0.6) ÷ 单个 php-fpm 进程平均内存
实操建议:
- 进宝塔 → 网站 → PHP 设置 → 配置修改 → 找到
pm.max_children行(通常在[www]段下) - 若服务器 2GB 内存,观察到单个子进程常驻 120MB,则建议值为
(2048 × 0.6) ÷ 120 ≈ 10,设为10起步 - 同时把
pm.start_servers、pm.min_spare_servers、pm.max_spare_servers按比例缩为2、2、6,避免冷启动抖动 - 改完必须点「重载配置」,别只保存——否则不生效
为什么光调参数还不够,得加定时重启
PHP 扩展(比如某些旧版 Redis、Xdebug)或 Composer 加载器存在长期运行后的内存缓慢增长,max_children 控制的是上限,不解决进程自身老化问题。宝塔自带的「计划任务」能补这个缺口:
进宝塔 → 计划任务 → 添加定时任务:
- 任务类型选「Shell 脚本」
- 执行周期建议:每天凌晨 3:30(避开业务高峰),填
30 3 * * * - 脚本内容写:
#!/bin/bash # 仅重启 PHP-FPM,不 reload(避免配置未生效风险) systemctl restart php-fpm-74.service # 替换为你实际的版本,如 80、81
- 务必确认服务名:运行
systemctl list-units | grep php-fpm查真实名称
容易被忽略的三个细节
很多人调完就以为万事大吉,结果几天后又爆了:
-
pm = dynamic是前提——如果误设成static,max_children就是固定进程数,根本不会随负载伸缩 - 宝塔多 PHP 版本共存时,每个版本的配置文件独立(路径类似
/www/server/php/74/etc/php-fpm.d/www.conf),改错版本等于白改 - 重启脚本里用
systemctl restart而非service php-fpm restart,后者在新版宝塔中可能指向错误的 unit 文件,导致静默失败
真正稳定的方案,是参数收敛 + 定期重启 + 每周人工检查一次 php-fpm.log 里有没有 WARNING: [pool www] child 12345 exited on signal 9 (OOM) 这类记录——信号 9 就是内存被系统强杀的铁证,说明你还得再压一压 max_children。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











