sar 不支持 -n TCP 选项监控 TCP 重传或丢包,因其仅采集 /proc/net/snmp 等预定义聚合指标,不包含 TCP 协议栈细粒度事件;需用 netstat -s、ss -i、bcc tcpretrans 或 eBPF 等面向事件的工具捕获。

sar 命令本身不支持直接通过 -n TCP 选项监控 TCP 重传数或丢包率——sar -n 的子选项中**没有 TCP 这一项**,官方文档和内核源码均未定义该参数。试图运行 sar -n TCP 会报错:"Unknown subsystem TCP"。
为什么 sar 不能直接查 TCP 重传和丢包
sar 的网络统计基于内核导出的标准化计数器(如 /proc/net/snmp 和 /proc/net/netstat),它只提供有限聚合维度:接口层(DEV)、错误层(EDEV)、套接字层(SOCK)、IP 层(IP/EIP)、ICMP 层等。但 TCP 重传、超时、丢包等细粒度协议栈行为,**不在 sar 的采集范围内**,需依赖其他机制。
替代方案:用 sar 配合底层指标间接推算
虽然 sar 不输出重传率,但可通过以下组合方式获取接近实时的重传与丢包线索:
-
先用 sar -n EDEV 查接口级错误:执行
sar -n EDEV 1 3,关注rxerr/s(接收错误包/秒)、txerr/s(发送错误包/秒)、coll/s(冲突数)。若这些值持续 >0,说明物理或链路层存在异常,可能诱发上层重传 -
再用 sar -n DEV 看流量模式:高
rxpck/s+ 低rxkB/s可能暗示大量小包(如重传 SYN 或 ACK);突增的txpck/s但txkB/s增长缓慢,也符合重传段(通常较小)特征 -
结合 /proc/net/snmp 计算瞬时重传率:每秒执行一次
cat /proc/net/snmp | awk '/Tcp:/ {print $17}'(TCPRetransSegs 字段),与前一秒值相减,再除以该秒内总发出段数(可用ss -i中的retrans累加估算,或从/proc/net/snmp提取TcpOutSegs差值),即可得近似重传率
真正能实时记录重传与丢包的可靠方法
要获得准确、可记录、带时间戳的 TCP 重传与丢包数据,应使用以下工具组合:
-
netstat -s 持续采样:写脚本循环执行
netstat -s | grep -E "Retrans|Timeout|Drop",提取TCPRetransSegs、TCPRetransFail、TCPDrop等字段,每秒保存一行到日志文件 -
ss -i 跟踪单连接重传:对关键连接(如数据库端口、API 入口)定期运行
ss -ti dst $IP:$PORT,提取retrans和retransmits值,判断是否稳定增长 -
bcc 工具 tcpretrans 实时追踪:安装 bcc-tools 后运行
tcpretrans,它直接挂钩内核 TCP 重传路径,输出每个重传段的源目地址、端口、时间戳和原因(超时 or 快速重传),支持重定向到文件长期记录 -
自定义 eBPF 脚本:用 libbpf 或 bpftrace 编写程序,监听
tcp_retransmit_skb内核函数调用,精确统计并按秒聚合,写入 ring buffer 或 perf event
不复杂但容易忽略:sar 是系统活动「快照汇总」工具,不是协议栈「事件捕获」工具。重传和丢包是瞬态事件,必须用面向事件的机制(eBPF、socket stats、/proc 计数器差分)来捕捉,而非 sar 的周期性轮询统计。


















