«

PHP FPM进程过多导致服务器卡顿优化

时间:2026-10-8 08:29     作者:emer     分类: 无


前言

PHP FPM进程太多,把服务器内存吃满,网站卡顿甚至502?本文讲怎么优化PHP FPM进程数。

一、为什么FPM进程多会卡

PHP FPM每处理一个请求,就开一个进程。

进程开多了:

二、查看当前进程数

查看PHP FPM进程

ps aux | grep php-fpm

数一下有多少个进程。

看每个进程占多少内存

ps aux | grep php-fpm | awk '{print $6/1024 "MB"}'

算一下总内存

ps aux | grep php-fpm | awk '{sum+=$6} END {print sum/1024 "MB"}'

三、FPM配置文件在哪

CentOS

/etc/php-fpm.d/www.conf

或者:

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

Ubuntu

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

四、进程管理模式

PHP FPM有三种进程管理模式:

1. static(静态)

固定进程数,启动就开这么多。

pm = static
pm.max_children = 50

2. dynamic(动态)

默认模式,按需开进程。

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

3. ondemand

没人访问的时候不开进程,来了请求才开。

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

五、怎么算合适的进程数

公式

pm.max_children = 可用内存 / 每个进程平均内存

例子

pm.max_children = 1024 / 40 ≈ 25

所以设25个进程差不多。

别设太大

设太大了,内存不够用,就会OOM。

六、推荐配置

小服务器(1G内存)

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

中服务器(2-4G内存)

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

大服务器(8G以上)

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

七、其他优化参数

request_terminate_timeout

单个请求最长执行时间,超时就杀掉。

request_terminate_timeout = 30s

slow log

慢日志,看看哪个请求慢。

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

php_admin_value[memory_limit]

每个PHP进程的内存限制。

php_admin_value[memory_limit] = 128M

八、改完配置重载

systemctl reload php-fpm

或者:

systemctl restart php-fpm

九、验证效果

看进程数

ps aux | grep php-fpm | wc -l

看内存

free -h

看负载

top

十、常见坑

坑1:max_children设太大

比如2G内存设了100个进程,内存直接爆。

解决: 按上面的公式算,别拍脑袋。

坑2:改完配置不生效

忘了重载。

解决:

systemctl reload php-fpm

坑3:进程数一直涨

有慢请求,占着进程不放。

检查:

request_terminate_timeout = 30s

设个超时,超时就杀。

坑4:502 Bad Gateway

进程都忙不过来,Nginx连不上FPM。

解决: 加max_children,或者优化慢请求。

坑5:用了static模式

static固定进程数,不用就浪费内存。

推荐: 用dynamic或ondemand。

十一、排查步骤

第一步:看是不是FPM进程多

ps aux | grep php-fpm | wc -l

第二步:看内存够不够

free -h

第三步:看有没有慢请求

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

第四步:调整配置

改www.conf里的pm.max_children等参数。

第五步:重载验证

systemctl reload php-fpm

总结

记住:

  1. 进程数别设太大,按内存算
  2. 公式:可用内存 / 每个进程平均内存
  3. 推荐用dynamic模式
  4. 设个request_terminate_timeout,防慢请求占着进程
  5. 改完记得reload

推荐配置:

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

遇到问题加QQ23979811 协助处理

标签: 性能优化 PHP FPM 进程优化 服务器卡顿 max_children