在 Ubuntu 上 php-fpm 占用内存高 是很常见的问题,通常不是“泄漏”,而是由配置和请求模式决定的。下面按常见原因 → 排查方法 → 解决建议来说明。
php-fpm 是多进程模型,每个 worker 进程都会占用独立内存。
例如:
pm = dynamic
pm.max_children = 100
如果每个进程 30–50MB:
100 × 40MB = 4GB
✅ 这是“内存高”的第一嫌疑
常见三种模式:
| 模式 | 特点 | 风险 |
|---|---|---|
| static | 固定进程数 | 内存稳定但容易浪费 |
| dynamic | 动态增减 | 默认最常见 |
| ondemand | 按需启动 | 最省内存(适合低流量) |
很多人用 dynamic 但 max_children 设得很大。
以下情况会显著增加内存:
可检查:
echo memory_get_peak_usage();
没开 OPcache:
推荐:
opcache.enable=1
opcache.memory_consumption=128
常见“内存刺客”:
Ubuntu 上可能同时有:
你以为只跑一个,其实多个都在占用内存。
检查:
ps aux | grep php-fpm
ps aux --sort=-rss | head
或:
top -p $(pgrep php-fpm | tr '\n' ',' | sed 's/,$//')
pgrep php-fpm | wc -l
在 pool 配置中:
pm.status_path = /status
访问:
http://localhost/status
能看到:
计算公式(保守):
max_children ≈ 总内存 / 单进程内存
例如 2GB 内存:
2048 / 40 ≈ 50
pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 10s
pm.max_requests = 500
让 worker 自动重启,避免长期运行堆积内存。
php -m
禁用:
opcache.enable=1
opcache.enable_cli=1
你可以贴出:
php-fpm.conf 或 pool 配置free -hps aux | grep php-fpm我可以直接帮你算该设多少 max_children 最合适。