什么是PHP进程池的空闲与活跃比例
PHP进程池是php-fpm服务管理的一组工作进程,其中活跃进程指的是正在处理用户请求的进程,空闲进程则是处理完请求处于等待状态的进程。两者的比例直接反映了当前进程池的负载情况,如果活跃比例长期过高,说明进程数量不足,需要增加进程池的最大进程数;如果空闲比例长期过高,则说明进程配置过多,存在资源浪费。

通过宝塔面板自带的监控功能查看
宝塔面板内置了基础的进程监控模块,可以快速查看php-fpm的进程状态:
- 登录宝塔面板,进入左侧导航栏的「软件商店」,找到已安装的PHP版本,点击右侧的「设置」按钮
- 在弹出的设置窗口中,切换到「状态」选项卡,这里会显示php-fpm的运行状态、总进程数、内存占用等基础信息
- 部分版本的宝塔面板还会在「监控」页面的进程监控板块,单独展示php-fpm的进程数量变化趋势,可以直观看到进程数量的波动情况
不过面板自带的状态信息不会直接拆分空闲和活跃进程的数量,需要更详细的数据可以参考下面的方法。
开启php-fpm状态页面获取详细数据
php-fpm本身提供了内置的状态页面,开启后可以返回所有进程的详细状态,包括每个进程是空闲还是活跃:
步骤1:修改php-fpm配置文件
在宝塔面板的PHP设置中,切换到「配置修改」选项卡,找到pm.status_path配置项,如果没有则手动添加,设置路径为/fpm-status,同时确认ping.path配置没有被占用,修改后重启php-fpm服务:
; 开启fpm状态页面 pm.status_path = /fpm-status ; 允许访问状态页面的IP,这里设置为允许所有,生产环境建议限制指定IP listen.allowed_clients = 127.0.0.1
步骤2:配置Nginx访问规则
如果是Nginx作为Web服务,需要在对应站点的配置文件中添加状态页面的访问规则,允许通过特定路径访问状态数据:
location = /fpm-status {
# 只允许本地访问,避免状态信息泄露
allow 127.0.0.1;
deny all;
# 转发到php-fpm的状态路径
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
# 这里的sock路径需要和php-fpm的监听路径一致,宝塔默认路径如下
fastcgi_pass unix:/tmp/php-cgi-74.sock;
}
步骤3:查询状态数据
配置完成后,可以通过命令行访问状态页面,获取详细的进程信息:
# 访问状态页面,获取纯文本格式的结果 curl http://127.0.0.1/fpm-status?plain&full
返回的结果中,每个进程的状态会标注为Idle(空闲)或者Running(活跃),可以统计两者的数量计算比例:
pool: www process manager: dynamic start time: 01/Jan/2024:10:00:00 +0800 start since: 3600 accepted conn: 1200 listen queue: 0 max listen queue: 2 listen queue len: 128 idle processes: 5 active processes: 3 total processes: 8 max active processes: 6
上面的结果中,空闲进程是5个,活跃进程是3个,空闲活跃比例就是5:3,空闲占比62.5%,活跃占比37.5%。
通过命令行工具直接统计进程状态
如果不想配置状态页面,也可以通过系统命令行直接统计php-fpm的进程状态:
# 统计所有php-fpm进程的状态,Idle为空闲,Running为活跃
ps -eLf | grep "php-fpm: pool" | awk '{print $12}' | sort | uniq -c
返回的结果会分别显示Idle和Running的进程数量,比如:
5 Idle 3 Running
同样可以快速得到两者的数量和比例。
自定义脚本实现自动监控与告警
如果需要长期监控比例变化,还可以编写简单的Shell脚本,定期统计比例并在超出阈值时发送告警:
#!/bin/bash
# 获取空闲进程数
idle_num=$(ps -eLf | grep "php-fpm: pool" | grep -c "Idle")
# 获取活跃进程数
active_num=$(ps -eLf | grep "php-fpm: pool" | grep -c "Running")
# 计算总进程数
total_num=$((idle_num + active_num))
# 避免除以0的错误
if [ $total_num -eq 0 ]; then
echo "未检测到php-fpm进程"
exit 1
fi
# 计算活跃比例
active_rate=$(echo "scale=2; $active_num / $total_num * 100" | bc)
echo "当前PHP进程池状态:"
echo "总进程数:$total_num"
echo "空闲进程数:$idle_num"
echo "活跃进程数:$active_num"
echo "活跃进程占比:${active_rate}%"
# 如果活跃占比超过80%,输出告警信息,可对接宝塔的告警接口或者发送邮件
if [ $(echo "$active_rate > 80" | bc) -eq 1 ]; then
echo "告警:PHP进程池活跃占比过高,建议调整进程池配置"
fi
可以将这个脚本添加到宝塔面板的计划任务中,设置每分钟或者每5分钟执行一次,实现自动化的监控。
根据比例调整进程池配置
拿到空闲活跃比例后,可以根据实际情况调整php-fpm的进程池参数,相关参数在宝塔面板的PHP「配置修改」中可以找到:
| 参数名 | 作用 | 调整建议 |
|---|---|---|
| pm.max_children | 进程池最大进程数 | 如果活跃占比长期超过70%,可以适当调大这个值 |
| pm.start_servers | 启动时的初始进程数 | 可以设置为最大进程数的1/2左右 |
| pm.min_spare_servers | 最小空闲进程数 | 保证空闲进程数不低于这个值,避免请求到来时没有可用进程 |
| pm.max_spare_servers | 最大空闲进程数 | 如果空闲占比长期超过60%,可以适当调小这个值,减少资源占用 |
调整配置后记得重启php-fpm服务,让配置生效,之后再次观察比例变化,直到比例处于30%-70%的合理区间即可。