現在のネットワーク使用率をどのように判断すればよいですか?


9

Webサイト上のDebianボックスの1つのインターフェースの現在のネットワーク使用状況(帯域幅使用状況)を表示したい。「52 Mbit / s」のような単純な数値だけであり、非常に精巧で正確であるとは想定されていません。

などの一般的なネットワーク帯域幅モニターでは、このiftopような値を簡単に抽出する方法がありません。

どうすればそれを取得できますか?

たとえば、/proc/net/dev数分おきに解析すると思います。これが本当にこれを行う最善の方法であるかどうかはわかりません。

回答:


10

ifstatがあなたを助けると思います:

[root @ localhost〜]#ifstat -i eth0 -q 1 1
       eth0
 KB /秒(KB /秒)
 3390.26 69.69

7

それを行うための最良の方法は、おそらく解析することです/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

sleepwhileループでの操作にかかる時間は考慮されていないため、これは(ごくわずかに)不正確であることに注意してください。私の600MHz銅鉱山では、ループに0.011秒かかります。これは、ほとんどの目的で無視できるほどの誤差です。(コメントアウトされた)キロバイト/メガビット出力を使用する場合も、bashは整数演算のみを理解することに注意してください。


これが選ばれるべき答えだと思います。他のすべてのソリューションは、/proc/net/devこの魔法が何がどのように発生するかを実際に理解せずに、舞台裏で解析を中継します。
エラン

このソリューションは、ルーター/ busyboxで私に役立ちました。
クローンマン2016

使用date +%s.%Nすべての反復のためのUNIXタイムスタンプを取得し、タイムスタンプの差によってバイト差を分割します。次に、ループの反復が1秒より長くなる問題を回避します。
Arnavion

3

トラフィックの 毎月の記録を保持するvnstatなどのネットワークトラフィックモニターや、カーネルに保存されている値から直接値を取得するslurmがあります。ほとんどのディストリビューションリポジトリで利用できます。

これが私が走ったときに私が見るものですslurm -i ra0

ここに画像の説明を入力してください


1

これを計算するための非常に単純なシェルスクリプトを次に示します。

#!/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


1
これについて少し説明してもらえますか?正確には、パラメーターはどうあるべきですか?の意味は何125ですか?コメントで返信しないでください。回答を編集して、より明確で完全なものにします。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.