先把当时的情况摆出来。ss -s 里 retrans 每分钟增长一百多,业务监控没有超时,跨可用区调用的 P99 比平时高二十毫秒,内核是 3.10,链路两端都是 ECS。
把日志和配置对完,能解释这个现象的基本就这几处。链路存在轻微丢包,靠快速重传补上但延迟增加。也可能是接收窗口太小,发送端被迫等待。
不容易想到的是,重传次数上限太大,失败要拖很久才放弃。还有一种情况,中间设备的会话表老化,出现静默丢包。
定位重传集中在哪条连接
ss -tin state established | grep -B1 retrans
连续采样看重传率变化
nstat -az | grep -E 'TcpRetransSegs|TcpOutSegs'
再往下用 mtr 看路径上的丢包节点
mtr -rwc 50 10.0.2.15
收紧重传次数相关参数
sysctl -w net.ipv4.tcp_retries2=8
别只看报错消失,验证要多做一步。重传率降到万分之五以下,跨区调用的 P99 回到正常水平,nstat 的增量趋于平稳。
容易忽略的是,少量重传是 TCP 的自我修复,不用处理;持续超过百分之一才值得查,先看路径再看本机参数。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
