温馨提示×

php-fpm为何占用ubuntu内存高

小樊
38
2026-07-01 00:04:30
栏目: 编程语言

php-fpm 在 Ubuntu 上内存占用高,通常不是“PHP 本身有问题”,而是配置和站点负载的组合结果。下面按最常见原因 → 排查方法 → 优化方案系统说明。


一、php-fpm 为什么会吃掉大量内存(核心原因)

1️⃣ 进程数太多(最常见)

php-fpm 默认使用 多进程模型(prefork),每个 PHP 请求都会占用一个进程。

常见配置:

pm = dynamic
pm.start_servers = 20
pm.min_spare_servers = 10
pm.max_spare_servers = 40
pm.max_children = 100

问题点:

  • php-fpm 进程数 × 单进程内存 = 总内存
  • 一个 php-fpm 进程通常在 30MB~150MB
  • 100 个进程 × 80MB ≈ 8GB 内存

✅ 尤其是:

  • WordPress
  • Laravel
  • 有缓存/插件
  • 高并发访问

2️⃣ 单个 PHP 进程内存太大

常见原因:

  • Laravel / ThinkPHP / Symfony
  • 使用大量 composer 包
  • 开启 debug / opcache 没配置好
  • 内存泄漏(长期运行)

查看单个进程内存:

ps -eo pid,user,%mem,%cpu,rss,cmd --sort=-rss | grep php-fpm

或:

top
# 然后按 M

3️⃣ 没有限制最大进程数(或设置过高)

新手常见错误:

pm.max_children = 500

结果:

  • 并发一高
  • 直接内存爆炸
  • 甚至触发 OOM

4️⃣ 静态模式(pm = static)导致常驻内存

pm = static
pm.max_children = 200

含义:

  • 一启动就创建 200 个进程
  • 长期占用内存,不管有没有请求

✅ 适合大内存服务器
❌ 不适合小内存 VPS


5️⃣ 请求处理慢,进程堆积

例如:

  • 慢 SQL
  • 外部 API 调用
  • file_get_contents()
  • 死循环

结果:

  • 请求占着 php-fpm 不放
  • 新请求继续创建进程
  • 内存持续上涨

6️⃣ Ubuntu 的“假象内存占用”

有时并不是真泄漏:

  • Linux 会把 文件缓存 / page cache 算进 used
  • php-fpm 退出后内存不会立刻释放

查看真实可用内存:

free -h

重点看:

available

二、快速定位是哪一类问题

✅ 1. 看 php-fpm 进程数

ps aux | grep php-fpm | wc -l

再对比:

cat /etc/php/*/fpm/pool.d/www.conf | grep pm.max_children

✅ 2. 看单个进程内存

ps -ylC php-fpm --sort:rss

或:

top -p $(pgrep php-fpm | head -10 | tr '\n' ',')

✅ 3. 看是否是慢请求

tail -f /var/log/php*-fpm.log

并开启慢日志:

slowlog = /var/log/php-fpm-slow.log
request_slowlog_timeout = 5s

三、优化方案(强烈推荐)

✅ 1️⃣ 合理设置 pm.max_children(最重要)

估算公式:

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

例如:

  • 内存 4GB
  • 单进程 80MB
  • 其他服务占用 1GB
(4096 - 1024) / 80 ≈ 38

建议设置:

pm.max_children = 40

✅ 2️⃣ 推荐配置(中等服务器)

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

✅ 3️⃣ 小内存机器(1~2G)

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

ondemand 不会常驻进程


✅ 4️⃣ 限制 PHP 脚本内存

memory_limit = 128M

避免:

memory_limit = 512M

✅ 5️⃣ 开启 Opcache(降低 CPU & 内存)

opcache.enable=1
opcache.memory_consumption=128
opcache.interned_strings_buffer=16
opcache.max_accelerated_files=10000

✅ 6️⃣ 优化程序本身

  • 减少 composer 包
  • 少用 file_get_contents()
  • 数据库加索引
  • 使用 Redis 缓存

四、如果是突然暴涨,还要排查

  • 是否被攻击(大量请求)
  • 是否爬虫疯狂访问
  • 是否定时任务(cron)同时跑多个 PHP

五、一句话总结

php-fpm 在 Ubuntu 上内存高,90% 是进程数 + 单进程内存 + 配置不合理导致的。

如果你愿意,可以把下面信息发我,我可以直接帮你算最优配置

  1. 服务器内存(如 2G / 4G)
  2. pm = ?
  3. pm.max_children = ?
  4. 网站类型(WordPress / Laravel / API)
  5. 并发人数(大概)

我可以给你一份可直接用的 php-fpm 配置

0