关键在于启用event mpm并按物理核数调优startservers与threadsperchild,配合keepalive两端对齐、bybusyness算法及内核参数优化,使请求路径与多核硬件并行能力精准匹配。

要让 Apache 负载均衡在多核 CPU 上真正“跑起来”,关键不是堆参数,而是让请求处理路径与硬件并行能力对齐。Apache 本身不自动绑定 CPU 核心,必须靠 MPM 模型选择 + 线程/进程配比 + 内核协同三者配合,否则再多核也只用上 1–2 个。
必须启用 event MPM 并禁用其他 MPM
prefork 和 worker 在高并发反向代理场景下会成为瓶颈:prefork 是纯进程模型,每个连接一个进程,CPU 切换开销大;worker 虽引入线程,但对长连接(如 Keep-Alive、HTTP/2)仍存在线程阻塞问题。event MPM 才是为多核设计的异步事件模型,能用少量线程管理大量空闲连接。
- 运行 httpd -V | grep -i mpm 确认当前加载模块,若显示 prefork 或 worker,需修改配置
- 在 httpd.conf 或 mods-enabled/ 中只保留:
LoadModule mpm_event_module modules/mod_mpm_event.so
并注释掉所有其他 mpm_*.so 行 - 重启后再次验证,确保输出含 MPM: event
按物理核心数调优线程与子进程参数
event MPM 的并发能力 = StartServers × ThreadsPerChild,这个乘积要匹配你的 CPU 总逻辑核数(含超线程),但不能盲目拉满——内存和后端吞吐才是硬约束。
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
- StartServers:设为物理 CPU 核数(例如 8 核服务器设为 8),避免启动时进程不足导致请求排队
- ThreadsPerChild:建议 100–200,过高易触发 OOM(尤其开启 mod_cache 或 SSL 卸载时);可先设 128,压测后微调
- MaxRequestWorkers:必须 ≥ 后端集群总并发容量(如 3 台 Tomcat 各支持 300 连接,则设 ≥ 900)
- MinSpareThreads / MaxSpareThreads:设为 75 / 250,减少空闲线程动态伸缩抖动
负载均衡层与后端协同优化
Apache 做反向代理时,自身性能再高,卡在后端响应慢或连接复用不匹配上,多核优势就白费。
- KeepAlive 必须两端对齐:Apache 设 KeepAliveTimeout 5、MaxKeepAliveRequests 300;后端(如 Tomcat)的 connectionTimeout 和 maxKeepAliveRequests 也要设为相近值,否则代理复用而上游断连,引发重连风暴
- 健康检查频率控制在 15 秒:用 hcinterval 15 hcfail 3 hcsuccess 2,避免探测请求反成压力源
- 算法选 bybusyness(最少连接):比轮询更适应真实负载波动,配置为 proxyset lbmethod=bybusyness
- 关闭非必要响应头:加 Header unset Server X-Powered-By,降低小响应体的网络开销,对高频 API 尤其有效
别忽略系统级配合
Apache 配置再优,若内核未调优或资源被抢占,多核利用率依然上不去。
- 确认 /proc/sys/net/core/somaxconn ≥ 65535,防止连接队列溢出丢包
- 启用 tcp_tw_reuse 和 tcp_fin_timeout 缩短 TIME_WAIT 状态,提升连接周转率
- 若用 SSL 卸载,确保 OpenSSL 版本 ≥ 1.1.1,启用 SSLSessionCache shmcb 共享会话缓存,避免每进程重复握手
- 避免与其他高 CPU 应用(如数据库)共用同一组 CPU 核,可用 taskset 绑定 httpd 主进程









