Linux 丢包定位:从网卡到应用逐层缩小范围

结合 ethtool、内核统计、qdisc 与抓包判断丢包发生在物理层、协议栈、防火墙还是应用队列。

文章目录 · 4 节

“网络丢包”不能直接指向交换机。数据包可能在网卡 ring buffer、内核 backlog、防火墙、qdisc、socket 队列或对端任意一层被丢弃。

建立分层证据

ip -s link show dev eth0
ethtool -S eth0 | grep -Ei 'drop|miss|error|timeout'
nstat -az | grep -Ei 'drop|retrans|error'
tc -s qdisc show dev eth0

网卡 missedno_buffer 增长指向收包能力;TCP retrans 增长只说明未收到确认,不能单独证明本机丢包。qdisc drop 则通常与发送队列和整形有关。

用抓包确定边界

tcpdump -ni eth0 -w /tmp/loss.pcap 'host 192.0.2.10'
ss -mti dst 192.0.2.10
sar -n DEV,ETCP 1

在链路两端同时抓包,比较序列号和时间戳,才能判断包在哪一段消失。限制抓包范围、文件大小和持续时间,避免排障工具反过来压垮节点。

常见误判

  • 用 ICMP 丢包率直接代表业务 TCP 质量
  • 只在一端抓包就断定运营商丢包
  • 忽略 CPU softirq、队列亲和性和容器 veth
  • 清零统计计数前没有保存基线

收尾清单

修复后对照吞吐、重传、各层 drop 和业务尾延迟。将关键接口错误率按包速率归一化,避免低流量下单个错误触发噪声告警。