PHP FPM进程过多导致服务器卡顿优化
时间:2026-10-8 08:29 作者:emer 分类: 无
前言
PHP FPM进程太多,把服务器内存吃满,网站卡顿甚至502?本文讲怎么优化PHP FPM进程数。
一、为什么FPM进程多会卡
PHP FPM每处理一个请求,就开一个进程。
进程开多了:
- 内存占满
- CPU切换不过来
- 服务器卡顿
- 甚至OOM被杀
二、查看当前进程数
查看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 = 可用内存 / 每个进程平均内存
例子
- 服务器2G内存
- 系统和其他服务占1G
- 剩下1G给PHP
- 每个PHP进程平均占40M
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
总结
记住:
- 进程数别设太大,按内存算
- 公式:可用内存 / 每个进程平均内存
- 推荐用dynamic模式
- 设个request_terminate_timeout,防慢请求占着进程
- 改完记得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