温馨提示×

ubuntu php-fpm为什么卡顿

小樊
47
2026-10-10 07:10:05
栏目: 编程语言

在 Ubuntu 上 PHP-FPM 卡顿通常不是单一原因,而是“连接/进程/资源/代码”中某一环出了问题。下面按最常见 → 较少见的原因帮你系统梳理,并给出排查方法。


一、最常见原因(80% 卡顿在这里)

1. PHP-FPM 进程不够用(重点)

PHP-FPM 是进程模型,请求多了就排队。

表现:

  • 页面偶尔卡、有时 502
  • 负载不高但响应慢
  • request slow log 里有大量等待

查看:

ps aux | grep php-fpm

看 www pool 的进程数是否长期满。

检查配置(/etc/php/*/fpm/pool.d/www.conf):

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

问题点:

  • pm.max_children 太小
  • 并发 > max_children → 排队卡顿

✅ 解决:

  • 提高 pm.max_children
  • 或改 pm = static(高并发更稳)

2. 慢脚本(代码问题)

PHP 本身执行慢,不是服务器问题。

开启慢日志:

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

然后:

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

常见问题:

  • 数据库慢查询
  • 外部 API 超时
  • file_get_contents(http://...)
  • 死循环 / 大数组

3. 数据库拖慢 PHP

PHP 卡,其实是 MySQL 卡。

检查:

mysqladmin processlist

看是否有:

  • Sending data
  • Locked
  • 长时间 Query

✅ 解决:

  • 加索引
  • 减少 SELECT *
  • 缓存结果(Redis / OPcache)

二、系统资源问题

4. CPU / 内存不足

top
htop
free -h

如果:

  • 内存快满 → PHP-FPM 被杀或 swap
  • CPU 100% → 代码或加密/压缩重

✅ 解决:

  • 加内存
  • 限制 pm.max_children
  • 用 OPcache

5. 磁盘 IO 瓶颈

尤其是:

  • 日志写入多
  • session 在文件
  • 临时文件大

检查:

iostat -x 1

✅ 优化:

session.save_handler = redis

三、Nginx + PHP-FPM 通信问题

6. fastcgi 超时

Nginx 等 PHP 太久。

/etc/nginx/nginx.conf 或站点配置:

fastcgi_read_timeout 30s;

PHP-FPM:

request_terminate_timeout = 30s

7. Unix socket 权限问题

如果用 socket:

listen = /run/php/php8.2-fpm.sock

确保 Nginx 用户能访问:

ls -l /run/php/

四、容易被忽略的原因

8. OPcache 没开

PHP 每次都重新编译。

检查:

php -i | grep opcache

✅ 开启:

opcache.enable=1
opcache.memory_consumption=128

9. DNS 解析卡住

PHP 里用了:

  • gethostbyname
  • mail()
  • 外部 HTTP

✅ 解决:

  • 用 IP
  • 设 DNS 缓存
  • 禁用 mail()

五、快速排查顺序(建议照做)

  1. 看 PHP-FPM 进程是否满
  2. 开 slow log
  3. 看 MySQL processlist
  4. 看 CPU / 内存 / IO
  5. 看 Nginx error log
  6. 开 OPcache

六、如果你愿意,我可以直接帮你定位

你可以贴:

  • Ubuntu 版本
  • PHP 版本
  • www.conf 配置
  • 是否用 Nginx/Apache
  • 卡顿是偶发还是持续

我可以直接告诉你该改哪一行配置。

0 踩