linux网络丢包排查应从物理层逐层向上:先查ethtool确认链路状态和协商,再看/proc/net/dev中rx-ovr(ring溢出)、rx-drp(内核丢弃)、rx-err(物理错误);接着检查tc规则是否人为丢包;最后调优ring buffer、rps及softnet队列。

Linux网络丢包严重时,不能只盯着应用或防火墙,得从物理链路开始一层层往上查。真正有效的排查路径是:先确认硬件能不能“接得住”,再看内核能不能“来得及取”,最后检查有没有规则在中间“主动扔掉”。
看网卡统计:揪出 RX-OVR 和 RX-DRP
运行 netstat -i 或 cat /proc/net/dev,重点关注 eth0(或其他实际网卡名)的接收列:
- RX-OVR 非零 → Ring Buffer 溢出丢包。说明网卡收包太快,内核还没来得及取走,常见于高吞吐+单核软中断集中、Ring Buffer 设置过小。
- RX-DRP 持续增长 → 包已进 Ring Buffer,但被内核丢弃。原因多为内存紧张、softirq 处理延迟高、NAPI 轮询不及时或 socket 缓冲区满。
- RX-ERR 上升 → 物理链路异常。比如 CRC 错误、帧对齐失败,需立刻查线缆、光衰、端口协商(用 ethtool eth0 看 link detected、speed/duplex、fec 状态)。
查 tc 规则:QoS 丢包不会出现在网卡计数里
网卡统计清白 ≠ 没丢包。tc 配置的限速、模拟丢包等策略(如 netem、policer)会直接丢包,且完全绕过 RX/TX 计数器。
- 执行 tc qdisc show dev eth0,重点找含 loss、limit、rate 的规则。
- 若发现类似
qdisc netem loss 5%,就是人为注入丢包,生产环境必须清除。 - 清除命令:tc qdisc del dev eth0 root(注意确认无业务依赖后再执行)。
盯住 Ring Buffer 和软中断分布
即使 RX-OVR 为 0,也可能因 Ring Buffer 偏小 + CPU 负载高导致消费滞后。
- 查当前大小:ethtool -g eth0;建议调大(如 ethtool -G eth0 rx 4096)。
- 看中断是否偏科:cat /proc/interrupts | grep eth0,观察是否集中在某一个 CPU。
- 查 softnet 状态:cat /proc/net/softnet_stat,第 2 列(dropped)持续增长,说明 softnet 队列溢出。
- 启用 RPS 分散负载:echo f > /sys/class/net/eth0/queues/rx-0/rps_cpus(按实际 CPU 数调整掩码)。
别跳过最基础但最易错的一环
很多“严重丢包”其实卡在第一步:
- 用 ethtool eth0 确认:Link detected: yes、Speed 与对端匹配、Duplex: Full;若显示 auto-negotiation failed,尝试手动协商或换线缆。
- 查驱动和固件异常:dmesg | grep -i "eth\|nic\|firmware",关注 DMA timeout、firmware crash、reset failed 等关键词。
- 检查 conntrack 表满:conntrack -S 中 insert_failed 持续上升,会导致新建连接静默丢弃(无 RST,客户端仅超时)。










