輸出毫秒 毫秒級網路監控(網路示波器)

2021-10-12 21:38:37 字數 1791 閱讀 4765

網路監控的工具很多,但沒有找到精確到毫秒/微秒級別的,於是自己做了乙個。可以檢視/除錯網路活動的內部細節,比如網路流量的波動,多網絡卡網路活動的時序。最快可以精確到0.4ms的取樣週期。

在linux下,統計網路活動的工具有很多。比如:最常用的ifconfig 就可以顯示指定介面的收/發的資料(位元組數和包的數目),以及丟包數,錯誤數等。

類似的工具還有:

當然,proc檔案系統裡也有,甚至中斷的統計值也有:

用下面的命令,就可以用「實時的」方式檢視網路收發資料的狀況了。當然,不是那麼直觀。

watch -n 0.1 cat "/proc/net/dev | grep enp"
為了達到最快的速度,我們需要使用源頭的資料。

源頭在 /sys/class/net/(nic)/statistics 目錄,因為這個目錄裡的檔案是單一的,乙個檔案對應於乙個計數項。

現在我們可以用 watch 假裝實時地觀察感興趣的計數器了。

/sys/class/net/enp1s0/statistics$ watch -n 0.1 cat rx_bytes tx_bytes
對上面的計數器定時取樣,就可以得到網路活動的波動。主要有下面一些選項:

下面是這個工具的命令列選項及執行示意。

資料輸出為csv檔案。為了方便,時間戳已使用相對時間(以取樣開始作為時間0點),資料也使用相對值(即每個週期的資料增量)。

輸出的csv檔案可以用excel顯示為圖表。為了方便,用pandas寫了幾行指令碼生成圖表,在python notebook裡執行。

最後的圖表也可以用累加方式顯示。看哪種更直觀。

最初是用python寫的取樣程式,取樣週期只能到大約2ms,如果取樣的計數器較多,可能只能到20ms.

最後還是改用c++,取樣週期可以到20μs. 但是,作業系統對計數器的更新頻率遠沒有這麼高,估計是400μs的樣子。也許核心裡可以設定這個更新頻率?沒有深究,因為0.4ms的取樣週期已經足夠用了。

因為不可能無限地取樣,所以什麼時候開始取樣,是比較重要的乙個環節。模仿示波器的思路,增加了對觸發條件的支援。

觸發的條件是:當取樣的資料超過某個閾值才開始取樣。比如取樣的計數器是 rx_bytes, 閾值是 8000, 取樣週期是1ms,則表示:在1ms內收到的資料超過8000位元組,即開始取樣。

對於多網絡卡/多計數器,則有乙個聚合函式來處理這些計數器:

在linux系統中,/sys/class/net/(nic)/statistics 目錄包含了各種網路狀態的計數器。對它們進行取樣,可以實現毫秒級的網路監控,可用於診斷/調優網路活動細節及時序。

這個工具實現了命令列下的取樣,包含多種觸發取樣條件,最高有效取樣週期達0.4ms(受限於作業系統的網路狀態更新頻率)。另外提供了指令碼對資料進行視覺化。總體上相當於乙個簡易的「網路示波器」。

**已開源:github/loblab/netmon

c 毫秒級計時

建立乙個hiperftimer類實現毫秒級計時,如下 注意使用的命名空間 using system using system.runtime.interopservices using system.componentmodel using system.threading namespace 計時...

Linux獲取毫秒級時間

linux獲取毫秒級時間 moakap 在軟體設計中經常會用到關於時間的處理,用來計算語句 函式的執行時間,這時就需要精確到毫秒甚至是微妙的時間。int gettimeofday struct timeval tv struct timezone tz int settimeofday const ...

Linux獲取毫秒級時間

在軟體設計中經常會用到關於時間的處理,用來計算語句 函式的執行時間,這時就需要精確到毫秒甚至是微妙的時間。int gettimeofday struct timeval tv,struct timezone tz int settimeofday const struct timeval tv,co...