在 Ubuntu 上 PHP-FPM 占用内存高 是很常见的问题,通常不是“PHP 本身有 bug”,而是配置和实际访问模式不匹配导致的。下面按「常见原因 → 排查方法 → 解决建议」来说明。
PHP-FPM 默认会启动多个 worker 进程,每个进程都会加载:
例如:
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20
✅ 问题点:pm.max_children 设得太大
pm = staticpm = static
pm.max_children = 50
static 模式会 常驻启动 max_children 个进程,不管有没有请求。
➡ 内存永远拉满
OPcache 本身省 CPU,但:
opcache.memory_consumption = 256
opcache.max_accelerated_files = 10000
如果站点很多(WordPress + 插件 + Laravel),OPcache 会吃不少内存。
常见“内存杀手”扩展:
xdebug(生产环境千万别开)imagickgrpcswoole(误用)file_get_contents()collection 处理百万数据ps -eo pid,user,rss,comm | grep php-fpm
或:
top -c
ps aux | grep php-fpm | wc -l
编辑 pool 配置:
pm.status_path = /status
Nginx 配置:
location = /status {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
include fastcgi_params;
}
访问:
http://yourdomain/status
可以看到:
公式(经验):
max_children ≈ 可用内存 / 单进程内存
例如:
(4096 - 1536) / 40 ≈ 64
保守一点:
pm.max_children = 30~50
pm = dynamic
pm.max_children = 40
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15
pm.max_requests = 500
每处理 500 个请求重启进程,避免内存慢慢涨。
; zend_extension=xdebug.so
opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000
PHP-FPM 内存看起来高,但服务器不卡、不 swap
✅ 这可能是 Linux 缓存机制 + OPcache 不一定真的“有问题”
pm 配置内容我可以直接帮你写一份最优 PHP-FPM 配置。