Linux网络丢包需逐层排查:先查网卡RX-OVR(Ring Buffer溢出)、RX-DRP(内核处理丢包)、RX-ERR(物理链路问题),再检查tc规则、软中断分布、Ring Buffer设置及物理连接与驱动状态。
Linux网络丢包排查不能只盯着应用或配置,得从底层网卡和链路层开始逐层确认。真正有效的排查,是先看硬件是否“装得下”、驱动是否“来得及取”,再查有没有人为规则在中间截流。
看网卡统计:RX-OVR 和 RX-DRP 是关键指标
执行 netstat -i 查看各网卡收发统计:
-
RX-OVR:Ring Buffer 溢出丢包。说明内核处理速度跟不上网卡收包速度,常见于高吞吐、低配机器或中断未均衡场景。
-
RX-DRP:进入 Ring Buffer 后被丢弃,多因内存不足、软中断延迟高、NAPI 轮询不及时等内核处理瓶颈引起。
-
RX-ERR:校验失败(如 CRC 错误)、帧格式异常,指向物理链路问题(线缆、光衰、端口协商失败)
。
若 RX-OVR 非零,优先用 ethtool -g 查当前 Ring Buffer 大小,并考虑调大(如 ethtool -G rx 4096);若 RX-ERR 高,检查 ethtool 中的 link status、speed/duplex、fec 状态,确认物理连接稳定。
查 tc 规则:QoS 丢包不会出现在网卡统计里
网卡清白 ≠ 没丢包。tc 配置的 netem、fq_codel、policer 等策略会直接丢包,且完全绕过 RX/TX 计数器。
- 运行 tc qdisc show dev ,重点看是否有 loss、limit、rate 或 burst 相关参数。
- 若发现类似
qdisc netem ... loss 5%,说明这是人为注入丢包,用于测试或限流——生产环境应禁用。
- 清除规则:tc qdisc del dev root(慎用,确保无依赖)。
盯住 Ring Buffer 和中断:软中断瓶颈常被忽略
即使 RX-OVR 为 0,也可能是 Ring Buffer 设置偏小 + CPU 负载高导致消费滞后。进一步验证:
- 用 cat /proc/interrupts | grep 观察对应网卡中断是否集中在单个 CPU 上;若某 CPU 的 softirq(SI)持续高于 70%,说明 NAPI 处理不过来。
- 启用 RPS/RFS:echo f > /sys/class/net//queues/rx-0/rps_cpus(按需调整掩码),把软中断分散到多核。
- 检查 /proc/net/softnet_stat 第 1 列(processed)与第 2 列(dropped)比值;第 2 列持续增长,表明 softnet 队列溢出丢包。
排除物理与驱动层干扰
别跳过最基础但最易出错的一环:
- 用 ethtool 确认 link detected yes、speed 匹配对端、duplex full;若显示 auto-negotiation failed,手动协商或换线缆。
- 检查 dmesg | grep -i "eth\|nic\|firmware" 是否有驱动报错、DMA timeout、firmware crash 等日志。
- 更新网卡固件和驱动版本,尤其 Mellanox、Intel X710 等常见企业级网卡,旧版驱动存在已知 Ring Buffer 竞态丢包问题。