Linux网络丢包严重_丢包排查思路

8次阅读

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

Linux网络丢包严重_丢包排查思路

Linux网络丢包严重时,不能只盯着应用或防火墙,得从物理链路开始一层层往上查。真正有效的排查路径是:先确认硬件能不能“接得住”,再看内核能不能“来得及取”,最后检查有没有规则在中间“主动扔掉”。

看网卡统计:揪出 RX-OVR 和 RX-DRP

运行 netstat -icat /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,重点找含 losslimitrate 的规则。
  • 若发现类似 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: yesSpeed 与对端匹配、Duplex: Full;若显示 auto-negotiation failed,尝试手动协商或换线缆。
  • 查驱动和固件异常:dmesg | grep -i “eth|nic|firmware”,关注 DMA timeout、firmware crash、reset failed 等关键词。
  • 检查 conntrack 表满:conntrack -Sinsert_failed 持续上升,会导致新建连接静默丢弃(无 RST,客户端仅超时)。
text=ZqhQzanResources