介面統計¶
概述¶
本文件是 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
與任何特定功能無關的通用乙太網統計資訊透過 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 中。
netlink¶
rtnetlink (NETLINK_ROUTE) 是訪問 struct rtnl_link_stats64 統計資訊的首選方法。
統計資訊在連結資訊請求 (RTM_GETLINK) 和統計資訊請求 (RTM_GETSTATS,當請求的 .filter_mask 中設定 IFLA_STATS_LINK_64 位時) 的響應中報告。
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 地址不匹配而丟棄的資料包數。