网卡丢包排查应优先关注RX-OVR和RX-DRP:RX-OVR>0表示Ring Buffer溢出丢包,RX-DRP>0且RX-OVR==0说明内核处理阶段丢包,RX-ERR>0则指向物理链路问题。

先看网卡统计:RX-OVR 和 RX-DRP 是关键入口
丢包不一定在应用层,往往从网卡收包那一刻就开始了。真正该盯的第一个指标,是 netstat -i 输出里的 RX-OVR(Ring Buffer 溢出)和 RX-DRP(内核处理阶段丢包)。
-
RX-OVR > 0:说明网卡收包太快,内核来不及取走,Ring Buffer 满了直接丢——常见于高吞吐 + 单核软中断集中、或 Ring Buffer 太小(默认常为 256) -
RX-DRP > 0且RX-OVR == 0:包已进缓冲区,但被内核主动丢弃,原因可能是内存不足、softnet_stat第2列持续增长、或 NAPI 轮询延迟高 -
RX-ERR > 0:物理链路大概率有问题,比如光衰超标、线缆接触不良、协商失败(ethtool eth0看link detected: no或speed: Unknown!)
别跳过这步直接抓包——如果 RX-OVR 已经在涨,tcpdump 就根本看不到那些“消失”的包。
检查 tc 规则:QoS 丢包不写进网卡计数器
网卡清白 ≠ 没丢包。tc 配置的 netem、policer、fq_codel 等策略,会在协议栈更上层直接丢包,完全绕过 /proc/net/dev 统计。
- 运行
tc -s qdisc show dev eth0,重点找含loss、limit、rate的行,例如:qdisc netem 800d: root ... loss 5% - 若看到
dropped X且数值持续上升,基本就是它干的——尤其是测试环境残留的netem,生产环境必须禁用 - 清除规则用
tc qdisc del dev eth0 root(注意:不是所有场景都能直接删,确认无业务依赖)
很多人查完 netstat -i 没异常就放弃,结果漏掉这个最“安静”的丢包源。
盯住软中断和 Ring Buffer 设置
即使 RX-OVR == 0,也可能因 Ring Buffer 偏小 + CPU 负载高导致消费滞后。这时要交叉验证:
- 查中断分布:
cat /proc/interrupts | grep eth0,看是否全压在 CPU0 上;若某核SI(softirq)软中断长期 >70%,说明 NAPI 处理不过来 - 查 softnet 队列状态:
cat /proc/net/softnet_stat,第1列(processed)和第2列(dropped)比值骤降,或第2列稳定上涨,就是 softnet backlog 溢出 - 调大 Ring Buffer:
ethtool -G eth0 rx 4096 tx 4096(需驱动支持,部分虚拟网卡不生效) - 启用 RPS 分散软中断:
echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus(十六进制掩码,f=全开前4核)
Ring Buffer 不是越大越好——过大会增加 cache miss,一般 1024~4096 是较安全的起步值。
别绕过物理层和驱动日志
最基础的环节,反而最容易被跳过。很多“随机丢包”其实是线缆松动、光模块老化、或驱动 bug 导致的。
- 用
ethtool eth0确认:Link detected: yes、Speed: 10000Mb/s、Duplex: Full、FEC: auto;若出现Auto-negotiation: off或failed,手动协商或换线 - 查驱动报错:
dmesg | grep -i "eth\|nic\|firmware\|dma",重点关注DMA timeout、firmware hang、reset failed - 旧版 Intel X710 / Mellanox CX-5 驱动存在 Ring Buffer 竞态丢包缺陷,更新固件和驱动常能一招解决
真正的瓶颈,往往不在你怀疑的地方——它可能就藏在 ethtool 输出里一行不起眼的 Link detected: no 后面。










