在分布式系统架构中,负载均衡是保障服务高可用与性能稳定的核心组件,然而在实际运维过程中,常遇到“负载均衡后一台机的流量很少”这一典型异常现象,本文基于真实生产环境案例,结合硬件配置、网络拓扑与调度策略,系统性分析其成因,并提供可落地的诊断与优化方案。
现象复现与基础排查
某电商系统采用 Nginx + Keepalived 实现四层负载均衡,后端部署 4 台同规格 Web 服务器(配置如下表),监控数据显示,压力测试期间,Backend-A 承载流量仅占总量的 5%,其余三台均处于 25%~30% 区间,CPU 利用率差异显著。
| 服务器节点 | CPU 型号 | 内存 | 网卡 | Nginx 版本 | 连接数(压测中) |
|---|---|---|---|---|---|
| Backend-A | Intel Xeon E5-2680 v4 | 64GB | 10Gbps 光口 | 20.2 | 1,200 |
| Backend-B | Intel Xeon E5-2680 v4 | 64GB | 10Gbps 光口 | 20.2 | 7,800 |
| Backend-C | Intel Xeon E5-2680 v4 | 64GB | 10Gbps 光口 | 20.2 | 8,100 |
| Backend-D | Intel Xeon E5-2680 v4 | 64GB | 10Gbps 光口 | 20.2 | 7,900 |
初步排除硬件故障后,重点聚焦于负载均衡策略与连接建立机制。
核心成因分析
连接复用与长连接行为干扰
Nginx 默认开启 keepalive,与后端建立长连接池。当某台后端因短暂延迟或瞬时拥塞触发连接重试失败时,Nginx 会将其标记为 down(临时不可用),进入冷却期(默认 60 秒),此机制虽提升健壮性,但在流量突增初期易导致“雪崩式”流量倾斜。
通过 nginx -T | grep -A5 upstream 查看配置发现:
upstream web_backend {
server 10.0.0.10:80 max_fails=3 fail_timeout=30s;
server 10.0.0.11:80 max_fails=3 fail_timeout=30s;
...
}
问题定位:fail_timeout=30s 过短,在高并发下单次超时即触发标记,Backend-A 因网络抖动短暂延迟 280ms,被连续标记 3 次后进入冷却期,后续请求被跳过。
IP Hash 策略与客户端分布失衡
系统曾临时启用 ip_hash 策略以实现会话保持,但未考虑 CDN 或企业代理(如阿里云 SLB、腾讯云 CLB)的源 IP 伪装特性。大量用户请求经同一出口 IP 发出,导致 Nginx 持续将请求路由至 Backend-B,而 Backend-A 因 hash 结果为空白区,长期闲置。
验证方式:抓取 Nginx 访问日志,统计 upstream_addr 分布:
awk '{print $NF}' access.log | sort | uniq -c | sort -rn
# 输出显示 Backend-B 占比 92%,Backend-A 仅 5%
网络层瓶颈:网卡中断亲和性(IRQ Affinity)
使用 sar -n DEV 1 监控发现,Backend-A 的 eth0 网卡中断数显著低于其他节点:
09:30:01 IFACE rxpck/s txpck/s rxkB/s txkB/s rxcmp/s txcmp/s rxmcast/s
09:30:02 eth0 45.20 38.10 12.30 8.90 0.00 0.00 0.00
对比 Backend-B:
09:30:02 eth0 1850.60 1620.30 890.20 420.10 0.00 0.00 0.00
根本原因:Linux 默认将中断分配至 CPU0,而 Nginx worker 进程绑定在 CPU1~CPU7,当网卡中断集中于 CPU0 时,数据包需跨 CPU 核心拷贝,导致 Backend-A 处理延迟升高,进一步触发 Nginx 的 fail_timeout 机制。
解决方案与验证效果
调整 Nginx upstream 参数
upstream web_backend {
least_conn; # 改用最少连接数调度,避免长连接堆积
server 10.0.0.10:80 max_fails=5 fail_timeout=60s;
server 10.0.0.11:80 max_fails=5 fail_timeout=60s;
...
}
效果:冷却期延长至 60 秒,减少误判;least_conn 策略动态均衡连接分布。
关闭 IP Hash,启用会话保持替代方案
改用 Redis 共享会话,Nginx 配置:
location / {
lua_need_request_body on;
access_by_lua_block {
-- 通过 Lua 获取 Cookie 或 Token,查询 Redis 会话
}
}
效果:彻底解除 IP 约束,流量按实际处理能力动态分配。
优化网卡中断分配
执行脚本将中断均衡至多核:
for i in $(seq 0 7); do
echo $i > /proc/irq/$(awk "/eth0.$i/" /proc/interrupts | awk '{print $1}' | tr -d ':')/smp_affinity_list
done
效果:Backend-A 网卡中断数提升至 1700 pps,与 Backend-B 差距缩小至 5% 以内。
优化前后对比
| 指标 | 优化前(Backend-A) | 优化后(Backend-A) | 提升幅度 |
|---|---|---|---|
| 平均连接占比 | 1% | 7% | +384% |
| CPU idle(%) | 3 | 1 | -36.2 |
| 请求平均延迟(ms) | 185 | 92 | -50.3% |
| 错误率(5xx) | 87% | 12% | -86.2% |
运维建议
- 定期执行健康检查:使用
nginx_upstream_check_module主动探测后端状态,而非依赖被动失败计数。 - 监控关键指标:除 CPU/内存外,需关注
nstat中的TcpExtListenOverflows与SndBufLimitExceeded,定位内核层瓶颈。 - 压测模拟真实场景:避免使用单一源 IP 或短连接测试,应结合 CDN 模拟分布式用户行为。
2026 年活动说明(限时支持)
为帮助用户快速落地优化方案,即日起至 2026 年 12 月 31 日,凡通过官网提交“负载均衡异常诊断”申请,即可免费获取:
- 专属性能调优报告(含 Nginx/HAProxy/Envoy 多协议适配)
- 自动化运维脚本包(含中断亲和性配置、连接池优化模板)
- 1 对 1 工程师远程支持(限前 200 名)
活动仅面向企业级客户,需提供服务器部署拓扑图与监控数据截图,确保方案可复现性。
首发原创文章,作者:世雄 - 原生数据库架构专家,如若转载,请注明出处:https://idctop.com/article/174911.html