温馨提示×

ubuntu php fpm为何占用内存高

小樊
42
2026-09-04 13:03:37
栏目: 编程语言

在 Ubuntu 上 PHP-FPM 占用内存高 是很常见的问题,通常不是“PHP 本身有 bug”,而是配置和实际访问模式不匹配导致的。下面按「常见原因 → 排查方法 → 解决建议」来说明。


一、最常见原因

1. PHP-FPM 进程数太多(90% 的情况)

PHP-FPM 默认会启动多个 worker 进程,每个进程都会加载:

  • PHP 解释器
  • 扩展(Redis、Imagick、OPcache 等)
  • 你的业务代码

例如:

  • 每个 PHP-FPM 进程:30–80MB
  • 进程数:50 个 ➡ 内存轻松 2GB+

关键配置

pm = dynamic
pm.max_children = 50
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 20

问题点pm.max_children 设得太大


2. 使用了 pm = static

pm = static
pm.max_children = 50

static 模式会 常驻启动 max_children 个进程,不管有没有请求。

➡ 内存永远拉满


3. OPcache 配置不合理

OPcache 本身省 CPU,但:

opcache.memory_consumption = 256
opcache.max_accelerated_files = 10000

如果站点很多(WordPress + 插件 + Laravel),OPcache 会吃不少内存。


4. PHP 扩展过多

常见“内存杀手”扩展:

  • xdebug(生产环境千万别开)
  • imagick
  • grpc
  • swoole(误用)

5. 代码层面问题

  • 一次性读取大数组
  • 大文件 file_get_contents()
  • 无限循环 / 内存泄漏
  • Laravel 中 collection 处理百万数据

6. 网站被爬 / 被攻击

  • 爬虫并发高
  • CC 攻击 ➡ PHP-FPM 进程瞬间打满

二、如何快速排查

1. 看 PHP-FPM 占了多少内存

ps -eo pid,user,rss,comm | grep php-fpm

或:

top -c

2. 看当前进程数

ps aux | grep php-fpm | wc -l

3. 看 PHP-FPM 状态(推荐)

编辑 pool 配置:

pm.status_path = /status

Nginx 配置:

location = /status {
    fastcgi_pass unix:/run/php/php8.1-fpm.sock;
    include fastcgi_params;
}

访问:

http://yourdomain/status

可以看到:

  • active processes
  • idle processes
  • max children reached(⚠ 重要)

三、推荐优化方案(实战)

✅ 方案 1:合理设置 max_children

公式(经验):

max_children ≈ 可用内存 / 单进程内存

例如:

  • 服务器 4GB
  • 系统 + Nginx + MySQL 用 1.5GB
  • PHP 单进程 40MB
(4096 - 1536) / 40 ≈ 64

保守一点:

pm.max_children = 30~50

✅ 方案 2:用 dynamic 而不是 static

pm = dynamic
pm.max_children = 40
pm.start_servers = 10
pm.min_spare_servers = 5
pm.max_spare_servers = 15

✅ 方案 3:限制请求数(防内存泄漏)

pm.max_requests = 500

每处理 500 个请求重启进程,避免内存慢慢涨。


✅ 方案 4:关闭 xdebug(生产)

; zend_extension=xdebug.so

✅ 方案 5:用 OPcache(但别太大)

opcache.enable=1
opcache.memory_consumption=128
opcache.max_accelerated_files=4000

四、一个常见“正常但吓人”的情况

PHP-FPM 内存看起来高,但服务器不卡、不 swap

✅ 这可能是 Linux 缓存机制 + OPcache 不一定真的“有问题”


五、你可以告诉我这些,我可以精确帮你算

  1. Ubuntu 版本
  2. PHP 版本
  3. pm 配置内容
  4. 服务器内存大小
  5. 网站类型(WordPress / Laravel / 自研)
  6. 是否高并发

我可以直接帮你写一份最优 PHP-FPM 配置

0