核心原因是默认配置未适配高并发短连接场景,需用bybusyness算法替代轮询以实时感知后端负载,强制启用keepalive减少TCP建连开销,关闭非必要模块与缓冲,并缩短健康检查retry时间至5–10秒实现快速故障隔离。Apache 负载均衡在大规模集群中出现分发延迟,核心原因不是算法本身慢,而是默认配置未适配高并发、多节点、连接短频的场景。解决关键在于**降低请求调度开销、提升后端感知灵敏度、减少连接建立成本**,而非单纯换算法。
用 bybusyness 替代轮询,让分配决策更“实时”
轮询(byrequests)只按顺序计数,不看后端当前是否正忙;大规模集群中,某台服务器可能刚处理完一个长任务,连接池却还堆积着未释放的空闲连接,轮询仍会继续派发新请求,造成响应堆积。
改用 bybusyness 算法可直接读取每个后端的活跃连接数,优先选连接最少的节点:
- 需显式启用模块:
LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so - 配置示例:
ProxySet lbmethod=bybusyness - 它天然适合小包、API轮询、微服务调用等高频短连接场景
强制复用连接,避免每次新建 TCP 的开销
大规模集群下,延迟常来自 SYN 握手、TLS 协商、TIME_WAIT 等网络层耗时,尤其当每秒数百请求都走新连接时,内核连接队列和端口耗尽风险陡增。
必须开启并收紧代理层 keepalive:
Apache Superset 是一个广泛采用的开源 BI 平台,用于 SQL 探索、图表构建和仪表板交付。当代理需要查询仓库数据、组装仪表板或使用成熟的分析界面解释指标而不是临时笔记本代码时,此技能非常有用。
ProxySet keepalive=On-
ProxySet timeout=5(避免空闲太久占资源) -
ProxySet max=100(单后端最大复用连接数) - 后端服务(如 Spring Boot、Tomcat)也要同步开启 keep-alive,例如 Tomcat 设置
keepAliveTimeout="5000"和maxKeepAliveRequests="100"
关闭非必要模块与缓冲,缩短路径
Apache 默认启用的模块和缓冲机制,在大规模低延迟场景下反而成为瓶颈:
- 禁用
mod_proxy_html、mod_xml2enc等与负载均衡无关的重写/解析模块 - 关闭输出缓冲:
EnableSendfile off(避免零拷贝干扰小响应调度) - 慎用
BufferedLogs,日志写入延迟可能间接拖慢主线程 - 不启用 HTTP 流水线(pipelining),多数后端不支持,易触发重试或超时
配合健康检查与快速故障隔离
延迟也常源于向已卡顿但未标记为失败的节点持续转发请求。Apache 的 retry 参数默认是 60 秒,太长:
- 设为
retry=5或retry=10,让故障节点更快被跳过 - 搭配
maxattempts=2,避免单次请求反复尝试失败节点 - 若后端支持,可加
ping探针:BalancerMember http://s1:8080 ping=5,5 秒内无响应即跳过

















