一、PHP-FPM进程模型简介
PHP-FPM(FastCGI Process Manager)通过预启动多个PHP进程,由Web服务器(如Nginx/Apache)将请求转发给这些进程处理。
进程数太少:并发低,排队等待,响应慢。
进程数太多:内存耗尽,频繁切换,服务器负载高。
二、核心配置参数说明
在php-fpm.conf
或www.conf
中:
- pm:进程管理方式(
static
、dynamic
、ondemand
) - pm.max_children:最大同时存活的PHP进程数(最重要!)
- pm.start_servers:启动时的进程数(dynamic模式)
- pm.min_spare_servers:最小空闲进程数(dynamic模式)
- pm.max_spare_servers:最大空闲进程数(dynamic模式)
- pm.max_requests:每个进程处理多少请求后重启(防止内存泄漏)
三、如何合理设置进程数
1. 计算公式
最大进程数 ≈ 服务器总内存 / 单个PHP进程最大内存占用
- 例如:服务器8GB内存,单个PHP进程最大占用50MB
8GB / 50MB ≈ 160
,建议pm.max_children
设为120~140,留出系统和其他服务空间。
2. 实际配置建议
- 小型网站:
pm.max_children
10~30 - 中型网站:
pm.max_children
50~200 - 大型/高并发:结合压测和内存监控动态调整
四、配置示例
/etc/php-fpm.d/www.conf
或 /usr/local/php/etc/php-fpm.conf
:
; 进程管理方式
pm = dynamic
; 最大进程数
pm.max_children = 80
; 启动时进程数
pm.start_servers = 10
; 最小空闲进程数
pm.min_spare_servers = 5
; 最大空闲进程数
pm.max_spare_servers = 20
; 每个进程最大请求数
pm.max_requests = 500
五、调优与排查流程
1. 监控进程数和内存
ps aux | grep php-fpm | wc -l
查看当前进程数top
或htop
监控内存、CPUfree -m
查看剩余内存
2. 查看FPM状态页
在www.conf
中开启:
pm.status_path = /status
Nginx配置:
location ~ ^/(status|ping)$ {
fastcgi_pass 127.0.0.1:9000;
include fastcgi_params;
allow 127.0.0.1;
deny all;
}
访问http://127.0.0.1/status
,可看到active processes
、max children reached
等指标。
3. 常见问题与解决
-
进程数不足(max_children太小)
- 表现:高并发时响应慢、502、排队等待
- 解决:增大
pm.max_children
,加内存,优化代码
-
进程数过多(max_children太大)
- 表现:内存耗尽、swap、服务器卡死
- 解决:减小
pm.max_children
,优化单进程内存占用
-
max_children reached频繁
- 表现:FPM日志有
[WARNING] pm.max_children
警告 - 解决:增大
pm.max_children
,优化慢请求
- 表现:FPM日志有
-
内存泄漏
- 表现:进程内存持续增长
- 解决:调小
pm.max_requests
,定期重启进程
六、优化建议
- 定期压测,根据实际并发和内存占用调整参数
- 优化PHP代码,减少单进程内存和执行时间
- 开启OPcache,提升性能,减少内存占用
- 监控FPM状态页,自动报警
- 合理分配服务器资源,避免与MySQL/Redis等抢内存
七、总结
- 合理设置PHP-FPM进程数,是高并发网站性能的关键
- 结合服务器内存、业务并发、代码效率动态调整
- 监控、压测、优化三管齐下