接口统计¶
概述¶
本文档是 Linux 网络接口统计信息的指南。
Linux 中有三个主要的接口统计信息来源
基于
struct rtnl_link_stats64
的标准接口统计信息;协议特定的统计信息;以及
通过 ethtool 提供的驱动程序定义的统计信息。
标准接口统计信息¶
有多个接口可以访问标准统计信息。最常用的是来自 iproute2 的 ip 命令
$ ip -s -s link show dev ens4u1u1
6: ens4u1u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
link/ether 48:2a:e3:4c:b1:d1 brd ff:ff:ff:ff:ff:ff
RX: bytes packets errors dropped overrun mcast
74327665117 69016965 0 0 0 0
RX errors: length crc frame fifo missed
0 0 0 0 0
TX: bytes packets errors dropped carrier collsns
21405556176 44608960 0 0 0 0
TX errors: aborted fifo window heartbeat transns
0 0 0 0 128
altname enp58s0u1u1
请注意,-s 已指定两次,以查看 struct rtnl_link_stats64
的所有成员。如果 -s 指定一次,则不会显示详细的错误信息。
ip 通过 -j 选项支持 JSON 格式。
队列统计信息¶
可以通过 netdev netlink 系列访问队列统计信息。
目前没有广泛分发的 CLI 可以访问这些统计信息。内核开发工具 (ynl) 可以用来进行实验,请参阅 使用 Netlink 协议规范。
协议特定的统计信息¶
协议特定的统计信息通过相关的接口公开,这些接口与用于配置它们的接口相同。
ethtool¶
Ethtool 公开通用的底层统计信息。所有标准统计信息都应由设备而不是驱动程序维护(与下一节中描述的混合软件和硬件统计的驱动程序定义的统计信息相反)。对于包含非托管交换机(例如,旧版 SR-IOV 或多主机 NIC)的设备,计数的事件可能并不完全与发送到本地主机接口的数据包有关。换句话说,事件可能在网络端口(MAC/PHY 模块)进行计数,而没有对不同的主机端(PCIe)设备进行区分。当内部交换机由 Linux 管理时(NIC 的所谓 switchdev 模式),不应存在这种歧义。
可以使用用于配置的接口访问标准 ethtool 统计信息。例如,用于配置暂停帧的 ethtool 接口可以报告相应的硬件计数器
$ ethtool --include-statistics -a eth0
Pause parameters for eth0:
Autonegotiate: on
RX: on
TX: on
Statistics:
tx_pause_frames: 1
rx_pause_frames: 1
与任何特定功能无关的通用以太网统计信息通过指定 --groups
参数,通过 ethtool -S $ifc
公开
$ ethtool -S eth0 --groups eth-phy eth-mac eth-ctrl rmon
Stats for eth0:
eth-phy-SymbolErrorDuringCarrier: 0
eth-mac-FramesTransmittedOK: 1
eth-mac-FrameTooLongErrors: 1
eth-ctrl-MACControlFramesTransmitted: 1
eth-ctrl-MACControlFramesReceived: 0
eth-ctrl-UnsupportedOpcodesReceived: 1
rmon-etherStatsUndersizePkts: 1
rmon-etherStatsJabbers: 0
rmon-rx-etherStatsPkts64Octets: 1
rmon-rx-etherStatsPkts65to127Octets: 0
rmon-rx-etherStatsPkts128to255Octets: 0
rmon-tx-etherStatsPkts64Octets: 2
rmon-tx-etherStatsPkts65to127Octets: 3
rmon-tx-etherStatsPkts128to255Octets: 0
驱动程序定义的统计信息¶
可以使用 ethtool -S $ifc 转储驱动程序定义的 ethtool 统计信息,例如
$ ethtool -S ens4u1u1
NIC statistics:
tx_single_collisions: 0
tx_multi_collisions: 0
uAPI¶
procfs¶
历史性的 /proc/net/dev 文本接口允许访问接口列表及其统计信息。
请注意,即使此接口在内部使用 struct rtnl_link_stats64
,它也会合并一些字段。
sysfs¶
sysfs 中的每个设备目录都包含一个 statistics 目录(例如 /sys/class/net/lo/statistics/),其中包含与 struct rtnl_link_stats64
的成员对应的文件。
此简单接口非常方便,尤其是在无法访问工具的受限/嵌入式环境中。但是,在读取多个统计信息时效率低下,因为它会在内部执行 struct rtnl_link_stats64
的完整转储,并且仅报告与访问的文件对应的统计信息。
Sysfs 文件在 Documentation/ABI/testing/sysfs-class-net-statistics 中进行了文档化。
netlink¶
rtnetlink (NETLINK_ROUTE) 是访问 struct rtnl_link_stats64
统计信息的首选方法。
统计信息会在链路信息请求的响应 (RTM_GETLINK) 和统计信息请求 (RTM_GETSTATS,当 IFLA_STATS_LINK_64 位在请求的 .filter_mask 中设置时) 中报告。
netdev (netlink)¶
netdev 通用 netlink 系列允许访问页面池和每个队列的统计信息。
ethtool¶
Ethtool IOCTL 接口允许驱动程序报告特定于实现的统计信息。历史上,它也曾被用于报告其他 API 不存在的统计信息,例如每个设备的队列统计信息或基于标准的统计信息(例如 RFC 2863)。
统计信息及其字符串标识符是分开检索的。标识符通过 ETHTOOL_GSTRINGS,string_set 设置为 ETH_SS_STATS,值通过 ETHTOOL_GSTATS。用户空间应使用 ETHTOOL_GDRVINFO 来检索统计信息的数量 (.n_stats)。
ethtool-netlink¶
Ethtool netlink 是旧 IOCTL 接口的替代方案。
可以通过在 ETHTOOL_A_HEADER_FLAGS 中设置 ETHTOOL_FLAG_STATS 标志,在 get 命令中请求与协议相关的统计信息。目前以下命令支持统计信息
ETHTOOL_MSG_PAUSE_GET
ETHTOOL_MSG_FEC_GET
ETHTOOL_MSG_MM_GET
debugfs¶
某些驱动程序通过 debugfs 公开额外的统计信息。
struct rtnl_link_stats64¶
-
struct rtnl_link_stats64¶
主要设备统计信息结构。
定义:
struct rtnl_link_stats64 {
__u64 rx_packets;
__u64 tx_packets;
__u64 rx_bytes;
__u64 tx_bytes;
__u64 rx_errors;
__u64 tx_errors;
__u64 rx_dropped;
__u64 tx_dropped;
__u64 multicast;
__u64 collisions;
__u64 rx_length_errors;
__u64 rx_over_errors;
__u64 rx_crc_errors;
__u64 rx_frame_errors;
__u64 rx_fifo_errors;
__u64 rx_missed_errors;
__u64 tx_aborted_errors;
__u64 tx_carrier_errors;
__u64 tx_fifo_errors;
__u64 tx_heartbeat_errors;
__u64 tx_window_errors;
__u64 rx_compressed;
__u64 tx_compressed;
__u64 rx_nohandler;
__u64 rx_otherhost_dropped;
};
成员
rx_packets
接口接收的良好数据包数量。对于硬件接口,计数从设备到主机接收的所有良好数据包,包括主机必须在处理的各个阶段(甚至在驱动程序中)丢弃的数据包。
tx_packets
成功传输的数据包数量。对于硬件接口,计数主机能够成功移交给设备的数据包,这并不一定意味着数据包已成功从设备传输出去,仅表示设备确认它已从主机内存中复制了这些数据包。
rx_bytes
接收的良好字节数,对应于 rx_packets。
对于 IEEE 802.3 设备,应计算不包括 FCS 的以太网帧的长度。
tx_bytes
传输的良好字节数,对应于 tx_packets。
对于 IEEE 802.3 设备,应计算不包括 FCS 的以太网帧的长度。
rx_errors
在此网络设备上接收的错误数据包总数。此计数器必须包括由 rx_length_errors、rx_crc_errors、rx_frame_errors 和其他未以其他方式计数的错误计数的事件。
tx_errors
传输问题总数。此计数器必须包括由 tx_aborted_errors、tx_carrier_errors、tx_fifo_errors、tx_heartbeat_errors、tx_window_errors 和其他未以其他方式计数的错误计数的事件。
rx_dropped
接收但未处理的数据包数量,例如由于资源不足或不支持的协议。对于硬件接口,此计数器可能包括由于 L2 地址过滤而丢弃的数据包,但不应包括由于缓冲区耗尽而由设备丢弃的数据包,这些数据包在 rx_missed_errors 中单独计数(因为 procfs 将这两个计数器折叠在一起)。
tx_dropped
在传输过程中丢弃的数据包数量,例如由于资源不足。
multicast
接收的多播数据包。对于硬件接口,此统计信息通常在设备级别计算(与 rx_packets 不同),因此可能包括未到达主机的数据包。
对于 IEEE 802.3 设备,此计数器可能等同于
30.3.1.1.21 aMulticastFramesReceivedOK
collisions
数据包传输期间发生的冲突次数。
rx_length_errors
由于长度无效而丢弃的数据包数量。属于 /proc/net/dev 中的聚合“帧”错误。
对于 IEEE 802.3 设备,此计数器应等效于以下属性的总和
30.3.1.1.23 aInRangeLengthErrors
30.3.1.1.24 aOutOfRangeLengthField
30.3.1.1.25 aFrameTooLongErrors
rx_over_errors
接收器 FIFO 溢出事件计数器。
历史上是溢出事件的计数。此类事件可以在接收描述符中或通过中断报告,并且可能与丢弃的数据包不一一对应。
对于高速接口的推荐解释是 - 由于数据包不适合主机提供的缓冲区而丢弃的数据包数量,例如大于 MTU 的数据包或环中的下一个缓冲区不可用于分散传输的数据包。
属于 /proc/net/dev 中的聚合“帧”错误。
此统计信息在历史上与 rx_fifo_errors 互换使用。
此统计信息对应于硬件事件,通常不用于软件设备。
rx_crc_errors
接收的具有 CRC 错误的数据包数量。属于 /proc/net/dev 中的聚合“帧”错误。
对于 IEEE 802.3 设备,此计数器必须等同于
30.3.1.1.6 aFrameCheckSequenceErrors
rx_frame_errors
接收器帧对齐错误。属于 /proc/net/dev 中的聚合“帧”错误。
对于 IEEE 802.3 设备,此计数器应等效于
30.3.1.1.7 aAlignmentErrors
rx_fifo_errors
接收器 FIFO 错误计数器。
历史上是溢出事件的计数。这些事件可以在接收描述符中或通过中断报告,并且可能与丢弃的数据包不一一对应。
此统计信息与 rx_over_errors 互换使用。不建议在高速接口的驱动程序中使用。
此统计信息用于软件设备,例如,计数软件数据包队列溢出(can)或排序错误(GRE)。
rx_missed_errors
主机丢失的数据包计数。折叠到 /proc/net/dev 中的“drop”计数器中。
计数由于缺少缓冲区空间而由设备丢弃的数据包数量。这通常表示主机接口比网络接口慢,或者主机无法跟上接收数据包的速率。
此统计信息对应于硬件事件,不用于软件设备。
tx_aborted_errors
属于 /proc/net/dev 中的聚合“载波”错误的一部分。对于能够进行半双工操作的 IEEE 802.3 设备,此计数器必须等同于
30.3.1.1.11 aFramesAbortedDueToXSColls
高速接口可以将此计数器用作通用设备丢弃计数器。
tx_carrier_errors
由于传输过程中载波丢失导致的帧传输错误数。是 /proc/net/dev 中聚合的“载波”错误的一部分。
对于 IEEE 802.3 设备,此计数器必须等同于
30.3.1.1.13 aCarrierSenseErrors
tx_fifo_errors
由于设备 FIFO 下溢/欠载导致的帧传输错误数。当设备开始传输帧但无法及时将整个帧传递给发射器进行传输时,会出现这种情况。是 /proc/net/dev 中聚合的“载波”错误的一部分。
tx_heartbeat_errors
旧式半双工以太网的心跳/SQE 测试错误数。是 /proc/net/dev 中聚合的“载波”错误的一部分。
对于 IEEE 802.3 设备,可能等同于
30.3.2.1.4 aSQETestErrors
tx_window_errors
由于延迟冲突(对于以太网 - 在传输的前 64B 之后)导致的帧传输错误数。是 /proc/net/dev 中聚合的“载波”错误的一部分。
对于 IEEE 802.3 设备,此计数器必须等同于
30.3.1.1.10 aLateCollisions
rx_compressed
正确接收的压缩数据包数。此计数器仅对支持数据包压缩的接口(例如 CSLIP、PPP)有意义。
tx_compressed
传输的压缩数据包数。此计数器仅对支持数据包压缩的接口(例如 CSLIP、PPP)有意义。
rx_nohandler
由于设备未被指定为接收数据包(例如,绑定中的备用链路)而由网络堆栈丢弃的接口上接收的数据包数。
rx_otherhost_dropped
由于目标 MAC 地址不匹配而丢弃的数据包数。