Apache 状态页里的 busy workers 和 idle workers 是什么意思?
Apache busy/idle workers 含义:busy=正在处理请求的工作进程/线程,idle=空闲待命;通过 server-status 查看,两者比例反映负载,附调优方向与 FAQ。
busy workers = 此刻正在处理请求的 worker(进程或线程);idle workers = 空闲待命、随时可以接新请求的 worker。 两者反映当前统计的工作单元状态,但不能当作全部连接数或所有进程槽位数;event MPM 还会异步管理部分连接,优雅重启期间也需考虑退出中的进程。
在哪里看
开启 mod_status 后访问 server-status 页:
<Location "/server-status">
SetHandler server-status
Require ip 127.0.0.1 192.0.2.0/24
</Location>
将示例管理网段替换为实际允许的范围,并确认 mod_status 已加载。http://your-server/server-status 上会显示类似:
Busy workers: 47, Idle workers: 28
记分板里 _ 是等待连接、W 是正在回包、R 是正在读请求……并非所有非 _ 字符都计入 busy,例如 . 表示空槽;具体统计需结合 MPM 和版本。
怎么解读
| 现象 | 含义 | 动作 |
|---|---|---|
| busy 低、idle 充足 | 容量富余 | 无事 |
| busy 持续逼近 MaxRequestWorkers | 处理容量接近上限,后续请求可能排队或超时;不能据此断定会返回 502 | 调大上限或查为什么慢 |
| idle 长期为 0、busy 缓慢爬坡 | 请求处理变慢(下游慢/锁)在堆积 | 查应用与数据库,不是先加 worker |
| busy 高但 CPU/IO 都不忙 | worker 卡在等待(慢后端、长连接) | 找外部依赖或 KeepAlive 设置 |
关键洞察:worker 打满可能来自请求量增加,也可能是请求处理变慢——慢查询、外部 API 超时会让每个请求占着 worker 不放。 调大上限前需验证内存、CPU 和后端容量,不能只增加并发而忽略瓶颈。
相关调优参数(按 MPM 模式)
以 event MPM 为例:
<IfModule mpm_event_module>
StartServers 3
# 空闲线程维护阈值
MinSpareThreads 25
MaxSpareThreads 75
ThreadsPerChild 25
# 可同时处理请求的工作线程上限;还受 ServerLimit 等约束
MaxRequestWorkers 400
</IfModule>
观察 worker 是否耗尽时,应连续比较 busy、idle 和请求变化。观测云的 Apache 采集器从受限的 server-status?auto 地址读取指标;接入后先与命令行结果核对,再结合实际 MPM 配置判断容量,不要把一次 busy 偏高直接当作故障。
常见问题(FAQ)
Q:server-status 页面暴露有风险吗?
A:有——它泄露 URI、来源 IP、vhost 等敏感信息。务必用 Require ip 限制访问来源,或只绑本地走跳板看。
Q:busy workers 飙高但重启 Apache 就好了,为什么?
A:可能是应用资源泄漏、阻塞、慢后端等,重启后恢复不能单独证明泄漏。重启是止痛药,根因要查应用;观测堆栈用 APM 看请求卡在哪个环节。
Q:prefork、worker、event 三种 MPM 看这两个指标有区别吗?
A:概念一样,粒度不同:prefork 的 worker 是进程(一个进程同时只处理一个连接),event/worker 是线程。event 可异步处理部分 KeepAlive 等连接,连接数不必与 busy worker 一一对应;选用时还需核对模块兼容性。