sar -n TCP 无效,无法监控TCP重传率;应通过/proc/net/snmp或nstat实时计算重传率=重传段数/总发出段数,并用ss -i定位异常连接。

Linux 中 sar -n TCP 并不能直接监控 TCP 重传率——这是个常见误解。sar -n 后支持的协议类型(如 DEV, EDEV, SOCK, IP, EIP)中,没有 TCP 这一有效选项;执行 sar -n TCP 会报错或静默忽略,无法获取重传统计。
要实时评估链路稳定性,关键指标是 TCP 重传率 = 重传段数 / 总发出段数,而这个比率必须从内核网络统计中提取并动态计算。sar 本身不提供 TCP 重传字段,但可配合 /proc/net/snmp 实现近实时监控。以下是实用、可靠的操作路径:
直接读取 /proc/net/snmp 计算瞬时重传率
该文件输出符合 MIB-II 标准,包含稳定、轻量、无需额外依赖的 TCP 基础计数器:
-
执行命令获取当前值:
cat /proc/net/snmp | awk '/^Tcp:/ {print $15, $11}' # TCPRetransSegs 和 TcpOutSegs -
每秒采样并计算增量重传率(推荐脚本化):
# 保存上一次值(示例用变量,生产环境建议写临时文件) prev_retrans=0; prev_out=0 while true; do read retrans out < <(cat /proc/net/snmp | awk '/^Tcp:/ {print $15, $11}') if [ "$prev_retrans" != "0" ]; then delta_r=$((retrans - prev_retrans)) delta_o=$((out - prev_out)) if [ "$delta_o" -gt 0 ]; then rate=$(printf "%.2f" $(echo "$delta_r / $delta_o * 100" | bc -l)) echo "$(date +%H:%M:%S) | 重传率: ${rate}% ($delta_r/$delta_o)" fi fi prev_retrans=$retrans; prev_out=$out sleep 1 done
✅ 优势:无额外包依赖,容器内可用,开销极低
⚠️ 注意:TcpOutSegs包含纯 ACK(不含数据),实际重传率略偏保守,但趋势判断完全可靠
结合 nstat 实现实时差值监控(更简洁)
nstat 是 sysstat 提供的专用网络统计工具,自动处理差值和单位:
watch -n 1 'nstat -z -t 1 | grep -E "TcpRetransSegs|TcpOutSegs"'
输出类似:
TcpRetransSegs 1234567 0.0 TcpOutSegs 9876543 0.0
第二列是自上次运行以来的增量值(-t 1 表示按 1 秒窗口聚合),直接用 1234567 / 9876543 ≈ 12.5% 即为该秒重传率。
辅助定位:用 ss -i 查单连接重传行为
当全局重传率异常(如 >3%),需快速聚焦问题连接:
# 列出重传次数 > 0 的活跃连接
ss -ti | awk '$NF ~ /retrans:[1-9]/ {print $0}'
# 示例输出:ESTAB 0 0 192.168.1.100:443 10.0.2.5:56789 ... retrans:5retrans:N 字段表示该连接自建立以来发生的重传次数,持续增长即说明该流路径存在丢包。
不建议依赖的方法
- ❌
sar -n TCP:无效参数,不工作 - ❌
netstat -s:只给累计值,无时间窗口,难算实时率 - ❌
iftop/nethogs:面向流量而非协议行为,看不到重传
重传率超过 1–2% 就值得警惕,持续高于 5% 通常表明物理链路干扰、网卡驱动异常、中间设备限速或拥塞。结合 ethtool 看协商速率、sar -n EDEV 查 RX/TX 错误包,能快速闭环排查。
本质上,这不是 sar 的功能场景,而是用 sar 生态中的 nstat 或底层 proc 接口完成的精准协议栈观测。


















