Interface

ethtool 從哪裡獲取資訊?

  • August 11, 2019

當我執行命令ethtool -S wlp2s0時,我得到以下資訊:

NIC statistics:
    rx_packets: 63
    rx_bytes: 14163
    rx_duplicates: 2
    rx_fragments: 58
    rx_dropped: 30
    tx_packets: 60
    tx_bytes: 9668
    tx_filtered: 0
    tx_retry_failed: 0
    tx_retries: 39
    sta_state: 4
    txrate: 115600000
    rxrate: 130000000
    signal: 189
    channel: 0
    (...) 

但是,當我轉到該/sys/class/net/wlp2s0/statistics文件夾時,統計資訊與 ethtool 不同(它們似乎是 ifconfig 列印的)。例如,當我rx_dropped從文件夾中顯示時,結果總是0.

這是ifconfig界面的顯示:

wlp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
       inet 192.168.1.115  netmask 255.255.255.0  broadcast 192.168.1.255
       inet6 fe80::6f9d:4eac:5bec:1ea6  prefixlen 64  scopeid 0x20<link>
       ether 88:b1:11:6a:1d:82  txqueuelen 1000  (Ethernet)
       RX packets 42483  bytes 55964467 (55.9 MB)
       RX errors 0  dropped 0  overruns 0  frame 0
       TX packets 9309  bytes 1393476 (1.3 MB)
       TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

我的問題是,如果我想以 1 秒為間隔了解丟棄的數據包,我從哪裡可以獲得該資訊?ethtool似乎是一個不錯的選擇,但我不知道它從哪裡獲取資訊,我不明白為什麼資訊與統計文件夾不同……

另外, rx_dropped 中的 30 值是什麼意思?是介面啟動後丟棄的數據包嗎?

ethtool使用 ioctl 獲取統計資訊SIOCETHTOOL,它接受一個指向struct ethtool_stats. 要獲取統計資訊,cmd結構的欄位應該具有 value ETHTOOL_GSTATS。在呼叫該 ioctl 之前,您必須使用另一個 ethtool ioctl(也SIOCETHTOOL可以struct ethtool_sset_info使用其cmd欄位初始化為ETHTOOL_GSSET_INFO的指針,或者struct ethtool_drvinfocmd欄位初始化為 的指針ETHTOOL_GDRVINFO)來了解驅動程序即將返回的不同統計值的數量,所以你可以為struct ethtool_stats.

…如果您不使用 C 程式,那麼上面非常密集、術語豐富的描述可能對您毫無意義。如果您需要ethtool在腳本中訪問統計資訊,我建議使用具有可用 ethtool 介面綁定的腳本語言,例如 Perl(模組Linux::Ethtool)或 Python(顯然是https://pypi.org/project/netifaces/)。這些應該使訪問統計數據更加直接。

當然,您始終可以解析ethtool命令的輸出,但是如果您想每秒輪詢一次統計資訊,那麼每次需要統計資訊時消除vfork()一兩個新程序的需要可能是有益的。

結果值來自 NIC 驅動程序。驅動程序開發人員還沒有添加程式碼來訪問相關統計資訊的事實也 via/sys/class/net/<name>/statistics或 via /proc/net/devwhere ifconfigget them from 這表明驅動程序定義這些值的方式可能與/proc/net/dev和/或/sys/class/net/*/statistics… 或者它可能只是表明驅動程序不幸的是,實施並不完美。

(開發人員可能已經選擇首先實現ethtoolAPI,因為它是最新的,並且“當我有時間時”使舊的統計介面不完整。另請注意,ifconfig大多數發行版都棄用了該命令,因為它不是保養得很好。)

要了解詳細資訊,您可能必須閱讀實際驅動程序的文件和/或原始碼註釋。由於您沒有指定網卡型號或驅動程序名稱,因此沒有其他人可以為您完成。的輸出對於ethtool -i wlp2s0辨識 NIC 驅動程序非常有用。

引用自:https://unix.stackexchange.com/questions/535006