温馨提示×

ubuntu php-fpm为何占内存

小樊
34
2026-09-16 14:09:09
栏目: 编程语言

在 Ubuntu 上 php-fpm 占内存高 是很常见的问题,通常不是“泄漏”,而是配置和运行模式导致。下面按最常见原因 → 排查方法 → 优化建议来说明。


一、php-fpm 为什么会占内存

1. pm(进程管理方式)配置不当(最常见)

php-fpm 有三种模式:

  • pm = static
    → 固定进程数,最占内存
  • pm = dynamic(默认)
    → 按需增减,相对省内存
  • pm = ondemand
    → 不用不启动,最省内存

如果你用的是 static,内存会直接拉满。


2. 每个 php-fpm 子进程本身就很吃内存

一个空 PHP 进程通常:

  • 20–50 MB(普通业务)
  • 80–200 MB(Laravel / Symfony / WordPress 插件多)

公式估算:

总内存 ≈ 子进程数 × 单进程内存

3. max_children 设置过大

例如:

pm.max_children = 100

如果单进程 50MB → 直接 5GB


4. 请求没结束 / 卡死

以下是“隐形内存杀手”:

  • 死循环
  • 慢 SQL
  • 外部 API 超时
  • 文件上传过大
  • 内存没释放(static 变量、全局数组)

5. opcache / 扩展占用

以下扩展也会吃内存:

  • opcache
  • redis
  • mongodb
  • gd / imagick(处理大图)

6. 系统里不止一个 php-fpm

常见情况:

  • php7.4-fpm
  • php8.1-fpm
  • php8.2-fpm

用:

ps aux | grep php-fpm

看是不是有多个 pool 在跑。


二、如何快速排查

1️⃣ 看 php-fpm 占了多少

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

2️⃣ 看平均进程内存

ps --no-headers -o rss -C php-fpm | awk '{sum+=$1} END {print sum/NR/1024 " MB"}'

3️⃣ 看配置文件位置

php-fpm -i | grep "Loaded Configuration File"

通常在:

/etc/php/*/fpm/pool.d/www.conf

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

✅ 方案 1:用 dynamic(推荐)

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

✅ 方案 2:内存极小服务器用 ondemand

pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 10s

✅ 方案 3:限制单请求内存

php_admin_value[memory_limit] = 128M

✅ 方案 4:控制请求数(防泄漏)

pm.max_requests = 500

每处理 500 次请求重启进程,防止内存慢慢涨


四、典型“正常” vs “异常”

情况 是否正常
1G 内存,php-fpm 占 300–500M ✅ 正常
2G 内存,php-fpm 占 1.8G ⚠️ 偏高
内存一直涨不降 ❌ 有泄漏
空闲时还很多进程 ❌ 配置问题

五、如果你愿意,我可以帮你精确分析

你可以贴出:

  1. free -h
  2. ps aux | grep php-fpm
  3. /etc/php/*/fpm/pool.d/www.conf 内容

我可以直接帮你算 该设多少 max_children 最合理

0