maxrequestworkers 是 apache 并发能力的硬限制,需根据实际内存(非 cpu)计算安全值,并同步调优配套参数及系统限制。

MaxRequestWorkers 是 Apache 并发能力的硬闸门,调高它不等于性能自动提升——关键在于让它匹配真实内存承载力,并与关联参数、后端服务协同工作。盲目加大反而触发 OOM 或排队更严重。
先确认是不是这个参数在拖后腿
别急着改配置,先看真实负载信号:
- 访问 http://localhost/server-status?auto(需启用 mod_status),重点看 BusyWorkers 是否长期 ≥ 90% 的 MaxRequestWorkers 值
- 日志里反复出现 "server reached MaxRequestWorkers setting" 或大量 503 Service Unavailable
- 用 curl -s "http://localhost/server-status?auto" | grep 'Waiting for connection' 查连接堆积量
- 压测时 Requests/sec 不升反降,top 中 httpd 进程/线程数飙高但吞吐卡住
算出真正安全的值:只看内存,不看 CPU 核数
每个 worker 进程或线程实际吃多少内存,才是天花板。PHP 扩展、SSL、日志模块都会拉高它:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- 运行 ps aux --sort=-%mem | grep httpd | head -n 5,看 RSS 列(单位 KB),取中间值作为单进程/线程内存估算值
- 可用内存 = 总物理内存 × 0.7(预留系统、数据库等空间)
- MaxRequestWorkers ≈ 可用内存(KB) ÷ 单进程 RSS(KB),结果向下取整(如算出 342,建议设 320)
- 举例:16 GB 机器,实测 worker RSS ≈ 32 MB(32768 KB),可用内存约 11264 MB → 11264 × 1024 ÷ 32768 ≈ 352 → 建议设 320
改完必须同步调优的配套参数
MaxRequestWorkers 不是独立开关,它和 MPM 模式强绑定,必须整体协调:
- prefork 模式:ServerLimit 必须 ≥ MaxRequestWorkers,且只能写在主配置文件;StartServers 设为 MaxRequestWorkers × 0.1~0.2;MinSpareServers / MaxSpareServers 分别设为 × 0.05 和 × 0.3
- event 模式:ThreadsPerChild × ServerLimit 必须 ≥ MaxRequestWorkers;StartServers 建议设为 CPU 核心数;MinSpareThreads / MaxSpareThreads 推荐 75 / 250
- 若用 PHP + php-fpm:pm.max_children 必须 ≥ MaxRequestWorkers,否则请求卡在 fpm 队列,表现为延迟飙升、504 错误
避开常见翻车点
很多人调高后更慢,问题往往不在 Apache 本身:
- 没检查系统级限制:ulimit -n 默认常为 1024,需设到 65536+;内核参数 net.core.somaxconn、fs.file-max 也要同步调高
- MPM 类型错配:还在用 prefork 跑高并发 PHP 应用,应切 event + php-fpm 组合
- KeepAlive 配置失衡:KeepAliveTimeout 过长(如 30 秒)导致线程被空闲连接长期占用,建议 3–5 秒
- 没验证生效:改完必须执行 apachectl configtest,再 reload,最后用 httpd -V | grep MPM 确认当前模式










