Cまたはシェルスクリプトを使用して、送信と受信の両方のネットワーク使用率を計算するにはどうすればよいですか?
私のシステムは組み込みLinuxです。私の現在の方法は、受信したバイトを記録し(b1)、1秒間待ってから、再度記録する(b2)ことです。次に、リンク速度を知って、使用された受信帯域幅のパーセンテージを計算します。
受信使用率=(((b2-b1)* 8)/ link_speed)* 100
より良い方法はありますか?
Cまたはシェルスクリプトを使用して、送信と受信の両方のネットワーク使用率を計算するにはどうすればよいですか?
私のシステムは組み込みLinuxです。私の現在の方法は、受信したバイトを記録し(b1)、1秒間待ってから、再度記録する(b2)ことです。次に、リンク速度を知って、使用された受信帯域幅のパーセンテージを計算します。
受信使用率=(((b2-b1)* 8)/ link_speed)* 100
より良い方法はありますか?
同様のことを行うオープンソース プログラムを調べてください。
私の検索では、 vnstatという小さなツールが見つかりました。
/proc ファイル システムが利用可能な場合はクエリを実行し、システムにない場合はgetifaddrsを使用します。次に、正しい AF_LINK インターフェイスをフェッチし、対応する if_data 構造体をフェッチしてから、送受信されたバイトを次のように読み取ります。
ifinfo.rx = ifd->ifi_ibytes;
ifinfo.tx = ifd->ifi_obytes;
また、sleep() は正確に 1 秒よりも長くスリープする可能性があるため、おそらく式で高解像度 (ウォール クロック) タイマーを使用する必要があります。または、if 関数と構造を調べて、適切なものが見つかるかどうかを確認することもできます。あなたの仕事のために。
vnstat の方向を教えてくれた「csl」に感謝します。ここで vnstat の例を使用して、ネットワーク使用率を計算する方法を示します。
#define FP32 4294967295ULL
#define FP64 18446744073709551615ULL
#define COUNTERCALC(a,b) ( b>a ? b-a : ( a > FP32 ? FP64-a-b : FP32-a-b))
int sample_time = 2; /* seconds */
int link_speed = 100; /* Mbits/s */
uint64_t rx, rx1, rx2;
float rate;
/*
* Either read:
* '/proc/net/dev'
* or
* '/sys/class/net/%s/statistics/rx_bytes'
* for bytes received counter
*/
rx1 = read_bytes_received("eth0");
sleep(sample_time); /* wait */
rx2 = read_bytes_received("eth0");
/* calculate MB/s first the convert to Mbits/s*/
rx = rintf(COUNTERCALC(rx1, rx2)/(float)1048576);
rate = (rx*8)/(float)sample_time;
percent = (rate/(float)link_speed)*100;