Apache 状态页里的 busy workers 和 idle workers 是什么意思?
Apache busy/idle workers 含义:busy=正在处理请求的工作进程/线程,idle=空闲待命;通过 server-status 查看,两者比例反映负载,附调优方向与 FAQ。
busy workers = 此刻正在处理请求的 worker(进程或线程);idle workers = 空闲待命、随时可以接新请求的 worker。 两者加起来是 Apache 当前拉起的 worker 总数,这个比例是判断服务器负载与容量是否够用的核心信号。
在哪里看
开启 mod_status 后访问 server-status 页:
<Location "/server-status">
SetHandler server-status
Require ip 127.0.0.1 你的管理网段
</Location>
http://your-server/server-status 上会直接显示:
Busy workers: 47, Idle workers: 28
记分板里 _ 是等待连接、W 是正在回包、R 是正在读请求……busy 就是这些非空闲状态的总和。
怎么解读
| 现象 | 含义 | 动作 |
|---|---|---|
| busy 低、idle 充足 | 容量富余 | 无事 |
| busy 持续逼近 MaxRequestWorkers | 即将拒绝新连接(502/超时前兆) | 调大上限或查为什么慢 |
| idle 长期为 0、busy 缓慢爬坡 | 请求处理变慢(下游慢/锁)在堆积 | 查应用与数据库,不是先加 worker |
| busy 高但 CPU/IO 都不忙 | worker 卡在等待(慢后端、长连接) | 找外部依赖或 KeepAlive 设置 |
关键洞察:worker 打满多半不是"请求太多"而是"请求处理变慢"——慢查询、外部 API 超时会让每个请求占着 worker 不放。 只调大上限是在用内存换时间,治标。
相关调优参数(按 MPM 模式)
以 event MPM 为例:
<IfModule mpm_event_module>
StartServers 3
MinSpareThreads 25 # idle 低于它就扩
MaxSpareThreads 75 # idle 高于它就收
ThreadsPerChild 25
MaxRequestWorkers 400 # busy+idle 的硬顶
</IfModule>
观测云对照
busy/idle 是要进时序监控才有意义的指标——单看某一刻的快照判断不了趋势。观测云可采集 Apache 状态指标,把 busy workers 占比、请求速率、响应时长放在同一仪表盘;对"busy/最大 worker > 80% 持续 N 分钟"设告警,容量耗尽之前就有预警,而不是等到用户看到超时。
常见问题(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 长连接占用 worker 的情况优化最好,现代部署默认选它。