【问题标题】:How do I calculate network utilization for both transmit and receive如何计算传输和接收的网络利用率
【发布时间】:2009-10-06 13:14:17
【问题描述】:

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

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

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

有没有更好的方法?

【问题讨论】:

  • 为什么将 (b2-b1) 乘以 8?
  • @csl: 我猜链接速度将以比特每秒为单位,这就是为什么将字节更改为比特
  • @Aviator 也许,但它应该已经嵌入到常量 link_speed
  • @csl: 是的,他可以把它写成 link_speed_in_bytes_per_second :)

标签: c linux bash embedded-linux


【解决方案1】:

查看具有类似功能的开源程序。

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

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

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

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

【讨论】:

  • 太棒了! :) 只是在调查它:)
  • vnstat - 看起来很有希望,我会研究一下。
【解决方案2】:

感谢 '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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 2015-03-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多