登录
首页 >  文章 >  linux

Linux网卡丢包排查与ifconfig使用教程

时间:2026-04-24 17:51:39 458浏览 收藏

Linux网卡丢包排查不能只依赖ifconfig的dropped和overruns字段,因为它们仅反映内核协议栈末端的丢弃,完全无法捕捉硬件层(如网卡FIFO溢出)、驱动ring buffer满、iptables规则拦截或DPDK/eBPF等绕过内核路径的真实丢包;真正可靠的诊断必须交叉验证ethtool -S(查rx_fifo_errors、rx_missed_errors等硬件级指标)、netstat -s(定位UDP端口无监听或套接字缓冲区溢出)以及/proc/net/dev实时变化,同时警惕虚拟化、SR-IOV和容器网络带来的统计偏差——看似清零的ifconfig数字,往往掩盖着最致命的无声丢包。

Linux如何查看网卡是否丢包 ifconfig详解

ifconfig 显示的 droppedoverruns 是关键指标,但不能单看它下结论——它只反映内核收包路径末端的丢弃,漏掉了网卡硬件层和驱动环形缓冲区(ring buffer)的丢包。

ifconfig 输出里哪些字段真有用

执行 ifconfig eth0 后,重点关注 RX(接收)段的这几个字段:

  • dropped:表示已成功进入内核协议栈、但因套接字缓冲区满、无监听进程或内存不足等原因被丢弃的包。常见于 UDP 服务未启动或 net.core.rmem_max 过小
  • overruns:更关键——它通常意味着网卡 ring buffer 溢出,即数据包到达太快,驱动还没来得及取走,新包就覆盖了旧包。这是典型的“硬件级丢包”信号
  • errorsframe:多由物理链路问题引起(如网线接触不良、光衰过大、双工不匹配),但现代网卡较少见;若持续增长,优先查物理连接和 ethtool -D eth0 的驱动调试日志

注意:ifconfig 在较新系统中已被 ip -s link show eth0 取代,但字段含义一致,ip 输出中的 rx_droppedrx_over_errors 对应原 droppedoverruns

为什么 ifconfig 的 dropped=0 不代表没丢包

因为 ifconfig 统计的是“内核软中断处理完之后”的丢弃,而真正的大头常发生在更早环节:

  • 网卡 DMA 写入 ring buffer 时,buffer 满了 → 包直接被网卡硬件丢弃,ifconfig 完全不统计(需用 ethtool -S eth0 | grep -i "drop\|fifo\|overflow"rx_fifo_errorsrx_missed_errors
  • 驱动未及时从 ring buffer 取包,导致后续包被覆盖 → overruns 会上升,但若驱动实现绕过了标准路径(如某些 DPDK 或 XDP 应用),overruns 也可能为 0
  • iptables 或 nftables 规则在 PREROUTING 链显式 DROP → 这类丢包不计入 ifconfig,得看 iptables -t raw -L -v -nnft list ruleset

对比验证:必须配合 ethtool 和 netstat -s

单靠 ifconfig 容易误判,建议三步交叉确认:

  • 查硬件层丢包:ethtool -S eth0 | grep -E "(rx_|tx_).*[dD]rop|fifo|miss",重点关注 rx_fifo_errors(ring buffer 溢出)、rx_missed_errors(驱动取包太慢)、rx_bad_count(校验失败)
  • 查协议栈丢包:netstat -s -uUdp: 段下的 packets to unknown port received(端口无监听)、packet receive errors(套接字缓冲区溢出)
  • 查实时变化:用 watch -n1 'cat /proc/net/dev | grep eth0' 观察 rx_droppedrx_over_errors 是否持续上涨,比静态截图更有说服力

如果 ifconfigoverruns 为 0,但 ethtool -Srx_fifo_errors 持续增长,说明 ring buffer 太小,该调大了——这时改 ifconfig 没用,得用 ethtool -G eth0 rx 4096

容易忽略的兼容性陷阱

有些虚拟化环境(如 KVM + virtio_net)或容器网络(如 Cilium 使用 eBPF)会让 ifconfig 统计失效:

  • ethtool -S eth0 可能返回 no stats available,此时只能依赖 /proc/net/devnetstat -s
  • 使用 SR-IOV 或 DPDK 的网卡,ifconfig 显示的其实是 PF 接口统计,VF 的丢包需单独查 VF 设备名(如 eth0v0
  • systemd-networkd 管理的接口可能不更新 ifconfig 的历史计数器,优先用 ip -s link show

真实排查中,ifconfig 只是第一眼快筛工具,它的数字安静不代表链路干净——尤其对 UDP 流量,ring buffer 和套接字缓冲区两道关卡,一个没守住,包就无声消失了。

今天带大家了解了的相关知识,希望对你有所帮助;关于文章的技术知识我们会一点点深入介绍,欢迎大家关注golang学习网公众号,一起学习编程~

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>