现场是这样的。新加两台机器进负载均衡,一台 8 核一台 2 核,运维按默认权重 1 比 1 配上去,压测时 2 核那台的 CPU 直接到 92%,8 核只用两成,接口 P99 被拖慢三倍。

中间走过弯路,把「会话保持开着,一旦某个 IP 落在慢机器上就一直打过去」当成主因,改完现象没变。

排查方向其实有限,先把可能性排一排。权重代表相对比例不是绝对容量,两台同样权重意味着流量五五分;健康检查间隔太长,慢机器已经过载还没被摘掉;长连接没有重新分配,新加的机器只分到很少的连接。

动手时先看两台机器的实际负载差异

for ip in 10.0.0.11 10.0.0.12; do ssh $ip "top -bn1 | head -3"; done

接着按 CPU 比例调整权重

aliyun slb SetBackendServers --LoadBalancerId lb-xxx --BackendServers '[{"ServerId":"i-1","Weight":80},{"ServerId":"i-2","Weight":20}]'

缩短健康检查间隔快速摘除慢机

aliyun slb SetBackendServers --LoadBalancerId lb-xxx --BackendServers '[{"ServerId":"i-1","Weight":100}]'

复查各后端的连接数与耗时

watch -n2 "ss -tn state established '( dport = :80 )' | awk '{print \$4}' | sort | uniq -c"

恢复的判定其实很直接。两台机器的 CPU 使用率拉平到五成上下,P99 回落到压测前的水平,连接数按权重分布而不是一边倒。

权重是静态配置,机器性能差三倍就该差三倍权重;会话保持与长连接会让实际分布严重偏离配置,调完必须看连接数而不是只看配置。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。

作者 9823189