ethtool 從哪裡獲取資訊?
當我執行命令
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
結構的欄位應該具有 valueETHTOOL_GSTATS
。在呼叫該 ioctl 之前,您必須使用另一個 ethtool ioctl(也SIOCETHTOOL
可以struct ethtool_sset_info
使用其cmd
欄位初始化為ETHTOOL_GSSET_INFO
的指針,或者struct ethtool_drvinfo
其cmd
欄位初始化為 的指針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/dev
whereifconfig
get them from 這表明驅動程序定義這些值的方式可能與/proc/net/dev
和/或/sys/class/net/*/statistics
… 或者它可能只是表明驅動程序不幸的是,實施並不完美。(開發人員可能已經選擇首先實現
ethtool
API,因為它是最新的,並且“當我有時間時”使舊的統計介面不完整。另請注意,ifconfig
大多數發行版都棄用了該命令,因為它不是保養得很好。)要了解詳細資訊,您可能必須閱讀實際驅動程序的文件和/或原始碼註釋。由於您沒有指定網卡型號或驅動程序名稱,因此沒有其他人可以為您完成。的輸出對於
ethtool -i wlp2s0
辨識 NIC 驅動程序非常有用。