ifconfig 的 dropped 和 overruns 仅反映内核收包末端丢弃,无法覆盖网卡硬件层和驱动 ring buffer 丢包;需结合 ethtool -S 和 netstat -s 交叉验证。
ifconfig 显示的 dropped 和 overruns 是关键指标,但不能单看它下结论——它只反映内核收包路径末端的丢弃,漏掉了网卡硬件层和驱动环形缓冲区(ring buffer)的丢包。
ifconfig 输出里哪些字段真有用
执行 ifconfig eth0 后,重点关注 RX(接收)段的这几个字段:
-
dropped:表示已成功进入内核协议栈、但因套接字缓冲区满、无监听进程或内存不足等原因被丢弃的包。常见于 UDP 服务未启动或net.core.rmem_max过小 -
overruns:更关键——它通常意味着网卡 ring buffer 溢出,即数据包到达太快,驱动还没来得及取走,新包就覆盖了旧包。这是典型的“硬件级丢包”信号 -
errors和frame:多由物理链路问题引起(如网线接触不良、光衰过大、双工不匹配),但现代网卡较少见;若持续增长,优先查物理连接和ethtool -D eth0的驱动调试日志
注意:ifconfig 在较新系统中已被 ip -s link show eth0 取代,但字段含义一致,ip 输出中的 rx_dropped 和 rx_over_errors 对应原 dropped 和 overruns。
为什么 ifconfig 的 dropped=0 不代表没丢包
因为 ifconfig 统计的是“内核软中断处理完之后”的丢弃,而真正的大头常发生在更早环节:
- 网卡 DMA 写入 ring buffer 时,buffer 满了 → 包直接被网卡硬件丢弃,
ifconfig完全不统计(需用ethtool -S eth0 | grep -i "drop\|fifo\|overflow"查rx_fifo_errors或rx_missed_errors) - 驱动未及时从 ring buffer 取包,导致后续包被覆盖 →
overruns会上升,但若驱动实现绕过了标准路径(如某些 DPDK 或 XDP 应用),overruns也可能为 0 - iptables 或 nftables 规则在 PREROUTING 链显式
DROP→ 这类丢包不计入ifconfig,得看iptables -t raw -L -v -n或nft list ruleset
对比验证:必须配合 ethtool 和 netstat -s
单靠 ifconfig 容易误判,建议三步交叉确认:
必应图像创建器
微软必应出品的AI绘图工具
- 查硬件层丢包:
ethtool -S eth0 | grep -E "(rx_|tx_).*[dD]rop|fifo|miss",重点关注rx_fifo_errors(ring buffer 溢出)、rx_missed_errors(驱动取包太慢)、rx_bad_count(校验失败) - 查协议栈丢包:
netstat -s -u看Udp:段下的packets to unknown port received(端口无监听)、packet receive errors(套接字缓冲区溢出) - 查实时变化:用
watch -n1 'cat /proc/net/dev | grep eth0'观察rx_dropped和rx_over_errors是否持续上涨,比静态截图更有说服力
如果 ifconfig 的 overruns 为 0,但 ethtool -S 中 rx_fifo_errors 持续增长,说明 ring buffer 太小,该调大了——这时改 ifconfig 没用,得用 ethtool -G eth0 rx 4096。
容易忽略的兼容性陷阱
有些虚拟化环境(如 KVM + virtio_net)或容器网络(如 Cilium 使用 eBPF)会让 ifconfig 统计失效:
-
ethtool -S eth0可能返回no stats available,此时只能依赖/proc/net/dev和netstat -s - 使用 SR-IOV 或 DPDK 的网卡,
ifconfig显示的其实是 PF 接口统计,VF 的丢包需单独查 VF 设备名(如eth0v0) - systemd-networkd 管理的接口可能不更新
ifconfig的历史计数器,优先用ip -s link show
真实排查中,ifconfig 只是第一眼快筛工具,它的数字安静不代表链路干净——尤其对 UDP 流量,ring buffer 和套接字缓冲区两道关卡,一个没守住,包就无声消失了。