SLB 后面挂了四台四核八 G 的后端,监控显示第一台 CPU 七成、其余三台只有两成,压测时第一台先被打满,调度算法是最小连接数。

把日志和配置对完,能解释这个现象的基本就这几处。客户端用长连接,连接建立后一直打同一台;后端返回的 keepalive 时间比负载均衡长;会话保持开着,同一用户被固定到一台;新机器上线时没有预热,权重也没调整。

先看各后端的活动连接分布

ss -tan state established | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -rn | head

再往下确认是否种了会话保持的 cookie

curl -s -I http://10.0.1.10/healthz | grep -i set-cookie

缩短后端 keepalive 让连接重新分配

grep -n 'keepalive_timeout' /etc/nginx/nginx.conf

调整后端权重并观察分布

curl -s -o /dev/null -w '%{http_code}\n' http://10.0.1.11/healthz

别只看报错消失,验证要多做一步。四台后端的 CPU 占用差距缩到一成以内,压测时不再出现单台先满,整体吞吐提升三成。

补一句。长连接会让负载均衡形同虚设,服务端 keepalive 要比负载均衡短;扩缩容后旧连接不会自动迁移,需要滚动重启。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189