温馨提示×

ubuntu php-fpm为何占用高

小樊
36
2026-09-22 15:47:50
栏目: 编程语言

在 Ubuntu 上 php-fpm 占用 CPU / 内存很高,通常不是 php-fpm 本身“坏了”,而是请求量、代码、配置或外部依赖导致的。下面按最常见原因 → 排查方法 → 解决思路给你一个系统性的说明。


一、最常见原因(按出现频率)

1️⃣ PHP 代码性能差(最常见)

  • 死循环 / 递归过深
  • 大量 file_get_contents()、glob()、正则
  • 未缓存的数据库查询
  • 同步调用第三方接口(超时但进程不释放)

✅ 表现:

  • 单个 php-fpm 进程 CPU 100%
  • 请求数不多但负载高

2️⃣ 网站访问量突然增大

  • 被爬虫狂刷
  • 被 CC / 轻微 DDoS
  • 接口被恶意调用

✅ 表现:

  • php-fpm 进程数暴涨
  • pm = dynamic 下 active processes 很快打满

3️⃣ php-fpm 进程数配置不合理

典型问题:

  • pm.max_children 设太大 → 内存爆
  • 设太小 → 请求排队、CPU 飙高
  • request_terminate_timeout 没设 → 慢请求堆积

4️⃣ 数据库连接问题

  • 数据库慢查询
  • 连接数用光
  • PHP 一直等待 MySQL 返回

✅ 表现:

  • php-fpm 进程状态全是 Idle 但数量很多
  • 实际在等 DB

5️⃣ PHP 版本或扩展问题

  • 升级 PHP 后兼容问题
  • OPcache 没开
  • 某个扩展有内存泄漏(如 Redis / MongoDB)

6️⃣ 磁盘 / IO 瓶颈

  • session 写文件
  • 日志疯狂写
  • 临时文件没清理

二、快速排查方法(Ubuntu 实战)

1️⃣ 看 php-fpm 状态

systemctl status php8.1-fpm

或:

ps aux | grep php-fpm

看:

  • 哪些进程 CPU 高
  • 内存占用

2️⃣ 开启 php-fpm status 页面(强烈推荐)

编辑 pool 配置:

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

启用:

pm.status_path = /status

Nginx:

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

访问:

/status?full

重点看:

  • active processes
  • slow requests
  • request duration

3️⃣ 查慢日志(非常关键)

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

然后:

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

能直接看到哪行 PHP 代码慢


4️⃣ 看实时请求

htop

或

iftop

三、常见优化方案(直接可用)

✅ 必开:OPcache

opcache.enable=1
opcache.memory_consumption=128

✅ 合理设置 pm

示例(2G 内存服务器):

pm = dynamic
pm.max_children = 30
pm.start_servers = 5
pm.min_spare_servers = 5
pm.max_spare_servers = 10
request_terminate_timeout = 30s

✅ 限制恶意请求

  • Nginx 限流
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
  • 封 IP
  • 封 UA

✅ 数据库优化

  • 加索引
  • 开慢查询日志
  • 使用连接池 / 缓存

四、一句话总结

Ubuntu 上 php-fpm 占用高,90% 是“慢 PHP 请求 + 进程堆积”造成的,不是 php-fpm 本身的问题。


如果你愿意,可以直接把下面信息发我,我可以帮你精准判断:

  • Ubuntu 版本
  • PHP 版本
  • pm 配置
  • 是否 WordPress / Laravel / 自研
  • top 或 htop 截图

我可以一步一步帮你定位到具体哪一行代码或哪个接口在吃资源。

0 踩