2018年5月8日火曜日

Linuxのpingコマンドを使って、簡単にネットワーク帯域を計測する


ネットワーク帯域を計測する際にpingコマンドを使うことで計測することができる。詳細は以下サイトの記事にある。

pingでネットワークの速度を調査する
http://www.atmarkit.co.jp/ait/articles/0511/26/news012.html

上記記事を参考に、帯域計測用のコマンドを作ってみた。

ちなみに、Windowsでも同様の計測方法を試そうとしたが、Windowsのpingコマンドや、PowerShellのTest-Connectionは、1ms以下の精度でPing応答を表示することができないため、計測するには誤差が大きすぎて使えないので、今回はLinuxで計測手順のみ記載する。

事前準備

計測には電卓で計算でもよいのだが、Linuxには数式計算ができるbcコマンドがあるため、それを使う。bcコマンドがインストールされていない場合は、yum等を利用してインストールしておこう。

# yum install bc

今回pingコマンドで利用するオプションは以下の通り。
  • -c:試行回数。今回は10回に設定する
  • -s:データサイズ。今回は、上限の65507バイトで設定する。65507バイトにIPヘッダ20バイトとICMPヘッダ8バイトが加わって、合計65535バイトのパケットが送信がされる。
実際にpingを飛ばすと以下のような結果となる。最後に応答時間(RTT :
Round-Trip Time)の平均値が表示されるので、その値を用いて帯域の計算を行う。

# ping -c 10 -s 65507 192.168.11.112
------------------------------
PING 192.168.11.112 (192.168.11.112) 65507(65535) bytes of data.
65515 bytes from 192.168.11.112: icmp_seq=1 ttl=64 time=0.354 ms
65515 bytes from 192.168.11.112: icmp_seq=2 ttl=64 time=0.333 ms
65515 bytes from 192.168.11.112: icmp_seq=3 ttl=64 time=0.443 ms
65515 bytes from 192.168.11.112: icmp_seq=4 ttl=64 time=0.360 ms
65515 bytes from 192.168.11.112: icmp_seq=5 ttl=64 time=0.416 ms
65515 bytes from 192.168.11.112: icmp_seq=6 ttl=64 time=0.266 ms
65515 bytes from 192.168.11.112: icmp_seq=7 ttl=64 time=0.331 ms
65515 bytes from 192.168.11.112: icmp_seq=8 ttl=64 time=0.406 ms
65515 bytes from 192.168.11.112: icmp_seq=9 ttl=64 time=0.288 ms
65515 bytes from 192.168.11.112: icmp_seq=10 ttl=64 time=0.284 ms

--- 192.168.11.112 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9000ms
rtt min/avg/max/mdev = 0.266/0.348/0.443/0.057 ms
------------------------------

計算式は以下の通りとなる。

 送受信データ量 (bit) = 65536 * 8 * 2 ・・・①
 ① / RTT (ms) / 1000 = 帯域 (Mbps)

実際に計測してみる

それでは実際に計測をしてみよう。簡単に計測するために、以下3行のコマンドを作成した。1行目の変数の中身だけ変更して他はそのまま実行すれば、帯域計測が実施できる。

------------------------------
# dst=<送信先IPアドレス / ホスト名>
# rtt=`ping -q -c 10 -s 65507 ${dst} | grep avg | cut -d"/" -f 5` ; echo "${rtt} ms"
# speed=`echo "scale=2; (65535 * 8 * 2) / $rtt / 1000" | bc` ; echo "${speed} Mbps"
------------------------------

①同一ESXiサーバー内の仮想マシン間の帯域を計測

同じvSwitchに接続されている仮想マシン同士で帯域を計測してみる。

# rtt=`ping -q -c 10 -s 65507 ${dst} | grep avg | cut -d"/" -f 5` ; echo "${rtt} ms"
------------------------------
0.385 ms
------------------------------
# speed=`echo "scale=2; (65535 * 8 * 2) / $rtt / 1000" | bc` ; echo "${speed} Mbps"
------------------------------
2723.53 Mbps
------------------------------

以下の過去記事に記載した通り、仮想マシンは1Gbps以上の帯域で通信が可能となる。pingによる計測においても確認することができた。

ESXiの仮想ネットワークアダプタ「E1000」は、1Gbps以上の速度が出る


②1000BASE-Tで接続されたNASとの帯域を計測

物理的にUTPケーブルを使った1000BASE-Tで接続されているNASに対して、帯域計測を行う。

# rtt=`ping -q -c 10 -s 65507 ${dst} | grep avg | cut -d"/" -f 5` ; echo "${rtt} ms"
------------------------------
1.772 ms
------------------------------

# speed=`echo "scale=2; (65535 * 8 * 2) / $rtt / 1000" | bc` ; echo "${speed} Mbps"
------------------------------
591.73 Mbps
------------------------------

1Gbpsといっても、実際は6割程度の帯域となることが確認できた。

③インターネット回線の帯域を計測

ping応答を返してくれる適当なドメインを指定して計測を行う。www.yahoo.co.jpが応答を返してくれるので、今回はそちら宛てにpingを飛ばして速度計測を行う。

# rtt=`ping -q -c 10 -s 65507 ${dst} | grep avg | cut -d"/" -f 5` ; echo "${rtt} ms"
------------------------------
18.309 ms
------------------------------

# speed=`echo "scale=2; (65535 * 8 * 2) / $rtt / 1000" | bc` ; echo "${speed} Mbps"
------------------------------
57.27 Mbps
------------------------------

なお、上記計測結果はかなりのムラがあり、速い時では170Mbps程度のこともあったので、数回計測することをお勧めする。

まとめ

OS標準のpingコマンドを使うことで、簡単に帯域を計測することができた。帯域計測用にツール等を導入する必要がないため、ざっくりと帯域を計測したい場合は非常に便利である。

0 件のコメント:

コメントを投稿

人気の投稿