如何计算发送和接收的网络利用率

时间:2009-10-06 13:14:17

标签: c linux bash embedded-linux

如何使用C或shell脚本计算传输和接收的网络利用率?

我的系统是嵌入式Linux。我当前的方法是记录接收的字节数(b1),等待1秒,然后再次记录(b2)。然后知道链路速度,我计算所用接收带宽的百分比。

接收利用率=(((b2 - b1)* 8)/ link_speed)* 100

有更好的方法吗?

2 个答案:

答案 0 :(得分:3)

查看类似的开源程序。

我的搜索出现了一个名为vnstat的小工具。

它尝试查询/ proc文件系统(如果可用),并对没有它的系统使用getifaddrs。然后它获取正确的AF_LINK接口,获取相应的if_data结构,然后读出发送和接收的字节,如下所示:

ifinfo.rx = ifd->ifi_ibytes;
ifinfo.tx = ifd->ifi_obytes;

还要记住,sleep()的睡眠时间可能超过1秒,因此您应该在等式中使用高分辨率(挂钟)计时器 - 或者您可以深入研究if函数和结构,看看是否找到适合你任务的任何东西。

答案 1 :(得分:0)

感谢'csl'将我指向vnstat的方向。在这里使用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;