我应该如何确定当前的网络利用率?

我应该如何确定当前的网络利用率?

我想在网站上显示 Debian 盒子的一个接口的当前网络利用率(带宽使用情况)。它不应该非常复杂或精确,只是一个简单的数字,例如“52 Mbit/s”。

典型的网络带宽监视器无法iftop让我简单地提取这样的值。

我怎样才能最好地找回它?

例如,我想我可能会/proc/net/dev每隔几分钟解析一次。但不确定这是否真的是最好的方法。

答案1

我认为 ifstat 会帮助你:

[root@localhost ~]# ifstat -i eth0 -q 1 1
       以太网0
 KB/秒输入 KB/秒输出
 3390.26 69.69

答案2

最好的简单方法可能是解析/proc/net/dev(请注意,这/proc是不可移植的)。这是bash我快速编写的一个脚本,应该能够计算它:

#!/bin/bash

_die() {
    printf '%s\n' "$@"
    exit 1
}

_interface=$1

[[ ${_interface} ]] || _die 'Usage: ifspeed [interface]'
grep -q "^ *${_interface}:" /proc/net/dev || _die "Interface ${_interface} not found in /proc/net/dev"

_interface_bytes_in_old=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { sub(/^.*:/, "") ; print $1 } else { print $2 } }' /proc/net/dev)
_interface_bytes_out_old=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { print $9 } else { print $10 } }' /proc/net/dev)

while sleep 1; do
    _interface_bytes_in_new=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { sub(/^.*:/, "") ; print $1 } else { print $2 } }' /proc/net/dev)
    _interface_bytes_out_new=$(awk "/^ *${_interface}:/"' { if ($1 ~ /.*:[0-9][0-9]*/) { print $9 } else { print $10 } }' /proc/net/dev)

    printf '%s: %s\n' 'Bytes in/sec'  "$(( _interface_bytes_in_new - _interface_bytes_in_old ))" \
                      'Bytes out/sec' "$(( _interface_bytes_out_new - _interface_bytes_out_old ))"

    # printf '%s: %s\n' 'Kilobytes in/sec'  "$(( ( _interface_bytes_in_new - _interface_bytes_in_old ) / 1024 ))" \
    #                   'Kilobytes out/sec' "$(( ( _interface_bytes_out_new - _interface_bytes_out_old ) / 1024 ))"

    # printf '%s: %s\n' 'Megabits in/sec'  "$(( ( _interface_bytes_in_new - _interface_bytes_in_old ) / 131072 ))" \
    #                   'Megabits out/sec' "$(( ( _interface_bytes_out_new - _interface_bytes_out_old ) / 131072 ))"

    _interface_bytes_in_old=${_interface_bytes_in_new}
    _interface_bytes_out_old=${_interface_bytes_out_new}
done

请记住,sleep没有考虑在 while 循环中执行操作所需的时间,因此这是(非常轻微)不准确的。在我的 600mhz 铜矿上,循环需要 0.011 秒——对于大多数用途来说,这个误差可以忽略不计。还要记住,当使用(注释掉的)千字节/兆位输出时,bash 仅理解整数算术。

答案3

这是一个非常简单的 shell 脚本来计算这个:

#!/bin/sh

dev=$1

grep -q "^$dev:" /proc/net/dev || exec echo "$dev: no such device"

read rx <"/sys/class/net/$dev/statistics/rx_bytes"
read tx <"/sys/class/net/$dev/statistics/tx_bytes"

while sleep 1; do
    read newrx <"/sys/class/net/$dev/statistics/rx_bytes"
    read newtx <"/sys/class/net/$dev/statistics/tx_bytes"

    # convert bytes to kbit/s: bytes * 8 / 1000 => bytes / 125
    echo "$dev  {rx: $(((newrx-rx) / 125)), tx: $(((newtx-tx) / 125))}"

    rx=$newrx
    tx=$newtx
done

只需启动传递接口名称的脚本,例如。./shtraf eth1

答案4

我无法发表评论,因为我没有足够的声誉,所以我只会发布另一个答案,但不值得我赞扬,它与发布的脚本完全相同特克诺拉弗这里。我只是添加了一个空格以使其在大方上起作用。

因此,如果您像我一样正在寻找一种方法来监视 xiaomi-dafang-hacks 上的带宽使用情况并且无法安装工具,那么此脚本将起作用。唯一的区别是 /proc/net/dev 开头的空间。不知道为什么,在大方上,这条线不是从界面开始的,而是从空间和界面开始的。希望这可以帮助别人。

#!/bin/sh

dev=$1

grep -q "^ $dev:" /proc/net/dev || exec echo "$dev: no such device"

read rx <"/sys/class/net/$dev/statistics/rx_bytes"
read tx <"/sys/class/net/$dev/statistics/tx_bytes"

while sleep 1; do
    read newrx <"/sys/class/net/$dev/statistics/rx_bytes"
    read newtx <"/sys/class/net/$dev/statistics/tx_bytes"

    # convert bytes to kbit/s: bytes * 8 / 1000 => bytes / 125
    echo "$dev  {rx: $(((newrx-rx) / 125)), tx: $(((newtx-tx) / 125))}"

    rx=$newrx
    tx=$newtx
done

相关内容