Prefork MPM采用多进程无多线程模型,稳定兼容但内存占用高;核心参数MaxRequestWorkers需据内存与Java后端协同调优,配合ServerLimit、StartServers等参数及运行时监控动态优化。
apache 的 prefork mpm(multi-processing module)是为 unix/linux 系统设计的多进程模型,每个请求由一个独立子进程处理。它不使用线程,因此稳定、兼容性好,但内存占用较高。最大子进程数(maxrequestworkers,旧版本中叫 maxclients)是影响并发能力和资源消耗的核心参数,调优需结合服务器硬件与应用特征。
根据可用内存合理设定 MaxRequestWorkers
Prefork 每个子进程会独占一份内存(含 JVM 堆、本地栈、加载的类等),尤其在 Java 应用(如 Tomcat 通过 mod_jk 或 mod_proxy_ajp 与 Apache 集成)场景下,Apache 本身虽轻量,但若后端 Java 进程内存已高,Apache 子进程仍需预留足够内存应对 SSL、模块加载、缓冲区等开销。常见做法是:
- 用
ps -o pid,rss,comm -C httpd查看典型子进程 RSS 内存(单位 KB),例如平均 25–40 MB/进程 - 预留系统基础内存(如 1–2 GB)和 Java 后端所需内存后,剩余内存 ÷ 单进程平均 RSS ≈ 理论上限
- 建议保留 20% 余量防突发请求导致 OOM,例如 8 GB 可用内存、单进程 30 MB →
MaxRequestWorkers = (8×1024×0.8) / 30 ≈ 218,取整为 200
配合 ServerLimit 和 StartServers 控制启动与扩展行为
MaxRequestWorkers 不能超过 ServerLimit(默认 256),若需设更高值,必须同步增大 ServerLimit 并重启 Apache(热重载不生效)。同时,StartServers 应设为预期平均并发的 30%–50%,避免冷启动时大量 fork 延迟;MinSpareServers 和 MaxSpareServers 控制空闲进程池大小,建议按流量波峰波谷设定,例如:
- 日常并发约 80 →
StartServers 40,MinSpareServers 30,MaxSpareServers 100 - 避免
MaxSpareServers过高造成内存浪费,过低则频繁 fork 影响响应延迟
监控实际负载并动态验证效果
仅靠理论计算不够,需观察运行时指标:
- 启用
mod_status(ExtendedStatus On),访问/server-status?auto查看IdleWorkers、BusyWorkers、CPULoad - 若
BusyWorkers长期接近MaxRequestWorkers,且出现排队(Scoreboard: _中W或K多),说明瓶颈在进程数,可适当上调 - 若
IdleWorkers持续 >70%,或系统free -h显示大量空闲内存,说明设置偏保守,可优化提升利用率
注意 Java 应用集成带来的间接影响
Apache Prefork 本身不运行 Java,但若通过 mod_proxy_ajp 或 mod_jk 转发请求到 Tomcat,需确保后端连接池(如 AJP connector 的 maxThreads)与 Apache 的 MaxRequestWorkers 匹配:
立即学习“Java免费学习笔记(深入)”;
- Tomcat AJP
maxThreads应 ≥ ApacheMaxRequestWorkers,否则请求会在 Apache 端排队等待后端连接 - 若使用 HTTP 代理(
mod_proxy_http),还需关注ProxyTimeout和后端 KeepAlive 设置,避免连接复用失效放大进程压力 - 禁用 Apache 的
KeepAlive Off可降低单进程生命周期,但会增加 TCP 握手开销;权衡后通常建议开启(KeepAlive On),并调小KeepAliveTimeout(如 2–5 秒)










