在 Ubuntu 上 php-fpm 占内存高 是很常见的问题,通常不是“泄漏”,而是配置和运行模式导致。下面按最常见原因 → 排查方法 → 优化建议来说明。
php-fpm 有三种模式:
pm = staticpm = dynamic(默认)pm = ondemand如果你用的是 static,内存会直接拉满。
一个空 PHP 进程通常:
公式估算:
总内存 ≈ 子进程数 × 单进程内存
例如:
pm.max_children = 100
如果单进程 50MB → 直接 5GB
以下是“隐形内存杀手”:
以下扩展也会吃内存:
常见情况:
php7.4-fpmphp8.1-fpmphp8.2-fpm用:
ps aux | grep php-fpm
看是不是有多个 pool 在跑。
ps -eo pid,user,%mem,rss,comm | grep php-fpm
ps --no-headers -o rss -C php-fpm | awk '{sum+=$1} END {print sum/NR/1024 " MB"}'
php-fpm -i | grep "Loaded Configuration File"
通常在:
/etc/php/*/fpm/pool.d/www.conf
pm = dynamic
pm.max_children = 20
pm.start_servers = 5
pm.min_spare_servers = 3
pm.max_spare_servers = 10
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 10s
php_admin_value[memory_limit] = 128M
pm.max_requests = 500
每处理 500 次请求重启进程,防止内存慢慢涨
| 情况 | 是否正常 |
|---|---|
| 1G 内存,php-fpm 占 300–500M | ✅ 正常 |
| 2G 内存,php-fpm 占 1.8G | ⚠️ 偏高 |
| 内存一直涨不降 | ❌ 有泄漏 |
| 空闲时还很多进程 | ❌ 配置问题 |
你可以贴出:
free -hps aux | grep php-fpm/etc/php/*/fpm/pool.d/www.conf 内容我可以直接帮你算 该设多少 max_children 最合理。