Apache内存占用主要由MPM决定:prefork以进程为单位(高内存开销),worker/event以线程为单位(共享内存、更高效);需先用httpd -V确认MPM类型,再依实测RSS和公式计算MaxRequestWorkers,配合MaxConnectionsPerChild、KeepAliveTimeout等参数优化,并通过smem或ps验证效果。

Apache 的内存占用主要由 MPM(多处理模块)决定,不同 MPM 的并发单位和内存模型差异很大。优化的关键不是盲目调大参数,而是根据服务器真实内存、单进程/线程实际开销、业务类型(静态/动态)来匹配合理的并发能力。
确认当前使用的 MPM 类型
先执行命令查看当前启用的模块:
httpd -V | grep -i mpm
输出如 MPM: event 或 MPM: prefork。这是后续所有调整的前提——prefork 用“进程”为单位,worker/event 用“线程”为单位,配置指令和计算逻辑完全不同。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
按 MPM 类型精准设置核心参数
不要套用通用数值,需结合实测内存占用计算:
-
prefork(适合 mod_php 等非线程安全环境):每个请求独占一个进程,内存开销最大。重点控制 MaxRequestWorkers(旧称 MaxClients)。公式:
MaxRequestWorkers ≤ (可用内存 × 0.7) ÷ 单进程 RSS(用ps -u apache -o pid,rss,comm --sort=-rss | head -5查看中位数 RSS,再乘以 0.5–0.7 估算独占部分)。 -
worker/event(推荐搭配 PHP-FPM):共享进程内存,线程更轻量。关键约束是 MaxRequestWorkers = ServerLimit × ThreadsPerChild,且 ThreadLimit ≥ ThreadsPerChild。例如设
ThreadsPerChild 25、ServerLimit 6,则最多支持 150 并发;若设MaxRequestWorkers 200而未同步调高 ServerLimit,Apache 会自动截断并报错。
统一优化生命周期与空闲资源
无论哪种 MPM,以下参数都直接影响内存稳定性:
- MaxConnectionsPerChild(或 MaxRequestsPerChild):设为 1000–5000,强制回收长期运行的进程/线程,缓解内存碎片和隐性泄漏。设为 0 表示永不回收,不推荐生产环境使用。
-
StartServers / MinSpare* / MaxSpare*:降低空闲池规模。例如从默认的
MinSpareServers 5改为2,避免低负载时仍驻留大量空闲进程占用内存。 - KeepAliveTimeout:建议设为 2–5 秒。时间过长会导致连接保持期间线程/进程无法释放,尤其在 event 模式下会拖慢事件循环效率。
验证与监控不可跳过
改完配置后必须验证:
- 重启服务:sudo systemctl restart httpd
- 检查是否生效:httpd -V 和 apachectl -M
- 观察内存变化:smem -P httpd 或 free -h && ps aux --sort=-%mem | grep httpd
- 压测对比:ab -n 1000 -c 100 http://localhost/,关注
Requests per second和内存波动。

















