登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  linux

Linux 怎样读取网卡丢包统计

来源:17golang原创

时间:2026-10-18 14:56:48 101浏览 收藏

Linux 上发现接口丢包时,不要只盯着一个名为 dropped 的数字。标准接口统计可以先告诉我们 RX 或 TX 方向是否有丢弃,ethtool -S 再补充网卡驱动和硬件队列暴露的计数。两套统计的字段、采集位置和命名可能不同,所以正确做法是先读标准值,再按当前驱动提供的字段解释。

官方资料:https://www.kernel.org/doc/html/latest/networking/statistics.html;https://man7.org/linux/man-pages/man8/ethtool.8.html

最短路径是:用 ip -s link show dev eth0 看标准 dropped,用 ethtool -S eth0 看驱动/NIC 细分计数,再用接口状态和驱动信息确定这些字段能否支持你的判断。

下面的接口名均是示例,命令是给读者在目标 Linux 主机上执行的只读诊断步骤;本文没有把示例输出冒充成某台机器的运行结果。

先把标准接口统计读完整

第一步先看内核提供的标准计数。它适合回答“这个网络设备从主机视角是否记录了接收或发送丢弃”,不负责告诉你每个 NIC 队列、驱动环形缓冲区或硬件模块的细节。

# 把 eth0 换成目标主机真实存在的接口名,先读取标准 RX/TX 计数。
ip -s link show dev eth0

# 只筛选接口的标准统计行,方便与下一次采样比较。
ip -s -s link show dev eth0

输出中的 RX 和 TX 行通常包含 packets、errors、dropped 等字段。重点不是某一刻数字大不大,而是连续两次采样时哪个方向的 dropped 在增长。若只看到 RX dropped 增长,先沿接收路径排查;TX dropped 增长则看发送队列、设备状态和上层发送压力。

ip -s link 的 dropped 是标准接口统计,不等于所有硬件丢包的总和。内核文档还提醒,带内部交换能力的设备可能按端口统计,计数不一定只对应当前主机接口,因此不要把一个数字直接解释成“某个应用丢了多少包”。

Linux标准接口统计与ethtool驱动统计的分层关系说明图
图1:统计分层说明图。标准接口层提供 RX/TX dropped,ethtool 层提供驱动和 NIC 细分字段;两者是互补观察面,不是同一个计数器的重复显示。

用 ethtool -S 找到驱动层的丢包字段

标准计数出现增长后,再看设备和驱动能提供什么细分。-S(--statistics)用于查询标准统计或 NIC、驱动专用统计;不同厂商的字段命名没有统一保证。

# 查看接口能提供的驱动/NIC 统计;字段由当前驱动决定。
sudo ethtool -S eth0

# 只保留常见线索词,避免把筛选结果当成完整统计集合。
sudo ethtool -S eth0 | grep -Ei 'drop|miss|discard|fifo|error|overrun'

# 如果工具和驱动支持标准统计分组,可请求标准组而不是猜字段名。
sudo ethtool -S eth0 --groups eth-phy eth-mac eth-ctrl rmon

常见线索包括 rx_dropped、tx_dropped、rx_missed、rx_fifo_errors 或带队列编号的字段,但它们只代表“当前设备选择这样命名并暴露了这个计数”。没有某个字段,不表示设备绝对没有对应丢弃点;有某个字段,也不能凭名字断定它和 ip -s link 的 dropped 一一相等。

把命令输出保存为两次采样的差异更有用:同一字段持续增长,才能说明该设备统计面观察到了新的事件。不要在不同机器、不同驱动之间直接比较字段总量,也不要把一次重启后的清零误判成问题已经消失。

先确认接口状态和驱动身份

当 ethtool -S 输出很多字段时,先确认接口确实是目标设备,并记录链路与驱动信息。这样后续看到厂商特有字段时,才有上下文可以回到驱动文档或现场配置继续解释。

# 查看链路速率、双工和 link detected 等基础状态。
ethtool eth0

# 查看当前使用的内核驱动、固件和总线信息。
ethtool -i eth0

# 查看标准接口计数与链路信息,保留同一接口名进行对照。
ip -s link show dev eth0

如果链路没有建立,先处理接口状态;如果链路正常但 rx_missed 或队列相关计数持续增长,再检查接收队列、CPU 处理能力、环形缓冲区和驱动说明。这里的顺序是排查建议,不是说每个 dropped 都由某一个固定组件造成。

接口状态驱动身份与丢包统计解释边界说明图
图2:诊断边界说明图。接口状态、驱动身份、标准计数和驱动细分共同限定解释范围;任何单一字段都不能独立还原完整链路路径。

按计数增长方向收束排查

现象先看什么能得到的判断
RX dropped 增长ip -s link、ethtool -S 的接收字段主机或设备接收侧记录了丢弃,需要继续区分队列、缓冲区和驱动语义
TX dropped 增长发送字段、链路状态和发送队列发送路径存在丢弃记录,不能直接等同于远端未收到
标准值不变,驱动字段增长驱动字段定义和采集位置细分统计观察到事件,但未必会映射到标准接口计数
字段不存在ethtool -i 与驱动文档先确认能力和命名,不要用另一个驱动的字段名强行查询

最后要记住,丢包统计是定位线索,不是端到端证明。网卡、内核、虚拟交换设备、物理链路和远端主机可能各自拥有不同计数面。只有在同一时间窗口对齐多端数据,才适合继续判断丢包发生在哪一段。

常见问题

为什么 ethtool -S 没有 rx_dropped?

字段名由驱动和设备实现决定,可能使用 rx_missed、队列字段或其他厂商名称,也可能只提供标准接口统计。先看完整输出和 ethtool -i,不要把缺少某个名字当成缺少所有统计。

ip -s link 和 ethtool -S 的 dropped 应该相加吗?

通常不应该直接相加。它们可能来自不同统计层,事件范围也可能重叠或互不相同。把它们作为互补观察面,按字段定义和连续采样解释。

计数清零是不是丢包问题解决了?

不一定。重启接口、驱动或主机都可能重置计数。应保留采样时间、接口状态、驱动信息和产生流量的窗口,再观察同一字段是否重新增长。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>