【linux】【bash】【network】サーバのトラフィックを監視するワンライナー

サーバのトラフィックをリアルタイムで監視するワンライナーを書きました。

もしかしたら需要があるかもしれないと考え、晒させていただきます!

経緯

  • 別ネットワークに存在するサーバ間で、大量のデータを転送したい
  • 回線圧迫を避けるためにrsyncで帯域制限をかけながら転送。でも本当に意図通りの制限がかかっているか不安。
  • CactiMRTGではリアルタイム監視できないし…
  • iftopとか入れて使うのもありだけれど、別サーバで需要がある度にインストールするのもな…

と悩んで方法を色々探していたのですが、発見できませんでした。

そこで、ひとまず以下の形で落ち着きました。

方法

以下を実行していただければリアルタイムで確認できると思います。( 無理やりなワンライナーであることは気にしないでください。 )

tcコマンドを使って計算しています。

while : ; do _T1=$( /sbin/tc -s qdisc | fgrep -m 1 Sent | cut -d" " -f 3); sleep 1; _T2=$( /sbin/tc -s qdisc | fgrep -m 1 Sent | cut -d" " -f 3); echo "$(expr \( $_T2 - $_T1 \) \* 8 ) bps"; done

LANのインターフェースが複数あるサーバは注意してください。
上記ですと、一番最初のインターフェースが監視されます。

別インターフェースを監視したい場合は、 fgrep -mの引数をいじってあげるなどして調整してください。

bondingでRound Robinなどしている場合には、あまりお役に立てないかと思います。

実行結果

結果は以下の様な形で、一秒ごとのトラフィックが出力されます。bpsから単位を変えたい場合はexprあたりをいじってあげてください。

[sai@sai-pc ~]$ while : ; do _T1=$( /sbin/tc -s qdisc | fgrep -m 1 Sent | cut -d" " -f 3); sleep 1; _T2=$( /sbin/tc -s qdisc | fgrep -m 1 Sent | cut -d" " -f 3); echo "$(expr \( $_T2 - $_T1 \) \* 8 ) bps"; done
8734304 bps
8734400 bps
7997024 bps

( 環境: CentOS 5.3 )

おまけ

rsyncで帯域制限をかげたい時は --bwlimit を使えばOKです。単位はKBなので、bpsに直す時はご注意くださいませ。

例えば、上記で監視を行っていたときに実行していたrsyncは以下です。

rsync -avz --bwlimit=1000 hoge@xxx.xxx.xxx.xxx:~/src ~/dst

大体 8Mbps で収えたくてこの制限にしたのですが、監視結果もおおよそその位の値となっています。良かったです。


こんな事しなくてももっと良い方法があるよ!という事や、もっと綺麗に書けるだろう!という事がございましたら、ご教授頂けると幸いですm(_ _)m

お読みくださりありがとうございました。