maxrequestworkers是apache并发处理的硬上限,设低导致请求排队、503增多,设高引发内存溢出;需通过server-status确认busyworkers是否长期逼近该值,并按内存(非cpu)计算合理值:可用内存×0.8÷单进程rss,再同步调优serverlimit、startservers及min/maxspareservers。

Apache响应缓慢,十有八九不是代码慢,而是MaxRequestWorkers卡在了瓶颈线上。它不是“能开多大就开多大”的参数,而是一道内存与并发的平衡阀——设低了,请求排队;设高了,内存爆掉、系统杀进程。关键不在调数字,而在看清当前到底卡在哪一环。
先确认是不是MaxRequestWorkers真瓶颈
别急着改配置,先用真实数据说话:
- 打开
mod_status(确保ExtendedStatus On),访问http://localhost/server-status?auto - 重点看两行:
BusyWorkers: XX和IdleWorkers: YY - 如果
BusyWorkers长期稳定在接近或等于你当前MaxRequestWorkers值(比如设了256,Busy常年240+),且Scoreboard里出现大量W(sending reply)或K(keepalive),基本就是它了 - 再查错误日志:反复出现
server reached MaxRequestWorkers setting或大量503 Service Unavailable,也是强信号
按内存算出合理值,不是按CPU核数
这个值由内存说了算,不是CPU。每个Apache子进程(prefork)或线程(event/worker)都要吃内存:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 执行
ps -o pid,rss,comm -C httpd --sort=-rss | head -n 5,看几个典型worker的RSS值(单位KB),取中间值,比如32 MB → 32768 KB - 可用内存 = 总物理内存 × 0.7(预留系统、DB、监控等)
- 计算:
MaxRequestWorkers ≈ (可用内存 KB) × 0.8 ÷ 单进程 RSS KB(留20%余量防突发) - 举例:16 GB服务器,单进程实测32 MB → 可用≈11264 MB → 11264 × 0.8 ÷ 32 ≈ 281 → 建议取整为256或240
改完必须同步调的三个关联参数
MaxRequestWorkers不是单打独斗,尤其在prefork模式下,以下三项必须一起动:
-
ServerLimit:必须 ≥ 你设的MaxRequestWorkers,否则重启会报错被截断;只能写在主配置里,改完必须重启(不能reload) -
StartServers:建议设为MaxRequestWorkers × 0.1~0.2,避免冷启动时fork跟不上流量 -
MinSpareServers和MaxSpareServers:分别设为MaxRequestWorkers × 0.05和× 0.3,太少则扩容慢,太多则白占内存
别忘了后端匹配和系统限制
Apache只是“门卫”,后面还有PHP-FPM或Tomcat在干活:
- 如果接PHP-FPM,
pm.max_children必须 ≥MaxRequestWorkers,否则请求卡在FPM队列,表现是延迟飙升+504 - 如果用AJP连Tomcat,检查
maxThreads是否匹配,避免Apache能发1000个请求,Tomcat只接得住200个 - 检查系统级限制:
ulimit -n至少65536,否则大量连接会报unable to create or open stream










