php-fpm 在 Ubuntu 上内存占用高,通常不是“PHP 本身有问题”,而是配置和站点负载的组合结果。下面按最常见原因 → 排查方法 → 优化方案系统说明。
php-fpm 默认使用 多进程模型(prefork),每个 PHP 请求都会占用一个进程。
常见配置:
pm = dynamic
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 40
pm.max_children = 100
问题点:
✅ 尤其是:
常见原因:
查看单个进程内存:
ps -eo pid,user,%mem,%cpu,rss,cmd --sort=-rss | grep php-fpm
或:
top
# 然后按 M
新手常见错误:
pm.max_children = 500
结果:
pm = static
pm.max_children = 200
含义:
✅ 适合大内存服务器
❌ 不适合小内存 VPS
例如:
结果:
有时并不是真泄漏:
查看真实可用内存:
free -h
重点看:
available
ps aux | grep php-fpm | wc -l
再对比:
cat /etc/php/*/fpm/pool.d/www.conf | grep pm.max_children
ps -ylC php-fpm --sort:rss
或:
top -p $(pgrep php-fpm | head -10 | tr '\n' ',')
tail -f /var/log/php*-fpm.log
并开启慢日志:
slowlog = /var/log/php-fpm-slow.log
request_slowlog_timeout = 5s
估算公式:
max_children = 可用内存 / 单进程内存
例如:
(4096 - 1024) / 80 ≈ 38
建议设置:
pm.max_children = 40
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
pm = ondemand
pm.max_children = 20
pm.process_idle_timeout = 10s
✅ ondemand 不会常驻进程
memory_limit = 128M
避免:
memory_limit = 512M
opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000
file_get_contents()php-fpm 在 Ubuntu 上内存高,90% 是进程数 + 单进程内存 + 配置不合理导致的。
如果你愿意,可以把下面信息发我,我可以直接帮你算最优配置:
pm = ?pm.max_children = ?我可以给你一份可直接用的 php-fpm 配置。