接口统计

概述

本文档是 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

与任何特定功能无关的通用以太网统计信息通过指定 --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 中进行了文档化。

ethtool

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

统计信息及其字符串标识符是分开检索的。标识符通过 ETHTOOL_GSTRINGSstring_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 计数器中。

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

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

统计信息必须在诸如关闭和启动接口之类的例行操作中保持持久。

内核内部数据结构

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