接口统计

概述

本文档是 Linux 网络接口统计信息的指南。

Linux 中有三个主要的接口统计信息来源

  • 基于 struct rtnl_link_stats64 的标准接口统计信息;

  • 协议特定统计信息;以及

  • 可通过 ethtool 获得的驱动程序定义的统计信息。

标准接口统计信息

有多个接口可以访问标准统计信息。最常用的是来自 iproute2ip 命令

$ 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

与任何特定功能无关的通用以太网统计信息通过 ethtool -S $ifc 通过指定 --groups 参数公开

$ 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 文件记录在 ABI 文件测试/sysfs-class-net-statistics 中。

ethtool

Ethtool IOCTL 接口允许驱动程序报告特定于实现的统计信息。从历史上看,它也用于报告其他 API 不存在的统计信息,例如每个设备队列的统计信息或基于标准的统计信息(例如 RFC 2863)。

统计信息及其字符串标识符是分开检索的。标识符通过 ETHTOOL_GSTRINGS,其中 string_set 设置为 ETH_SS_STATS,值通过 ETHTOOL_GSTATS。用户空间应使用 ETHTOOL_GDRVINFO 来检索统计信息的数量 (.n_stats)。

debugfs

一些驱动程序通过 debugfs 公开额外的统计信息。

驱动程序作者的说明

驱动程序应专门通过 .ndo_get_stats64 报告 struct rtnl_link_stats64 中具有匹配成员的所有统计信息。通过 ethtool 或 debugfs 报告此类标准统计信息将不被接受。

驱动程序必须确保尽可能符合 struct rtnl_link_stats64。请注意,例如,详细的错误统计信息必须添加到常规 rx_error / tx_error 计数器中。

.ndo_get_stats64 回调不能休眠,因为通过 /proc/net/dev 访问。如果驱动程序在从设备检索统计信息时可能会休眠,则应定期异步执行此操作,并且仅从 .ndo_get_stats64 返回最近的副本。 Ethtool 中断合并接口允许设置刷新统计信息的频率(如果需要)。

检索 ethtool 统计信息是一个多系统调用过程,建议驱动程序保持统计信息数量不变,以避免与用户空间尝试读取它们发生竞争条件。

统计信息必须在例行操作(如关闭和启动接口)之间保持不变。

内核内部数据结构

以下结构是内核内部的,其成员在转储时转换为 netlink 属性。驱动程序不得使用 0 覆盖它们不报告的统计信息。