スループット計測ツールとしてiperfというものが存在します。
拠点間のスループットなどを手軽に計測できるフリーツールでマルチキャストの配信などもできるすぐれものです。また、LinuxのみならずWindowsにも対応しており、コマンドラインが苦手な人はiperfのGUI版であるjperfというのも存在します。
iperfにはサーバモードとクライアントモードの2つのモードがあり、それぞれが必要となりますのでサーバまたは端末が2台必要です。2台の間でメモリtoメモリでデータを転送するのでリアルな値を取得できるのですが、やはり端末上で実行するということでどうしてもその端末のスペックに依存してくる部分もでてきますので古い端末などでは実際のスループットよりも低くなることもありえるので注意が必要です。
ここでは次のような単純な構成を前提としてメモ書きを残します。
それぞれのLinuxにiperfをインストールします。
# yum install iperf # rpm -qa | grep iperf iperf-2.0.5-3.el6.i686 |
オプションを何も指定しない場合、以下のようにしてiperfを起動します。
●サーバ側
# iperf -s ------------------------------------------------------------ Server listening on TCP port 5001 TCP window size: 85.3 KByte (default) ------------------------------------------------------------ |
●クライアント側
# iperf -c 192.168.12.21 ------------------------------------------------------------ Client connecting to 192.168.12.21, TCP port 5001 TCP window size: 21.6 KByte (default) ------------------------------------------------------------ [ 3] local 192.168.12.20 port 34460 connected with 192.168.12.21 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0-10.0 sec 1.06 GBytes 913 Mbits/sec |
上記結果から秒間913Mbpsのスループットがでていることがわかります。1GのNICを直結してるのでほぼワイヤレートがでていますね。上記では10秒間の平均値がでているわけですが、これを1秒間ごとに出力する場合は-iオプションで出力する間隔を指定します。例えば-i 1を指定すると1秒ごとにレポートが出力されます。
# iperf -c 192.168.12.21 -i 1 ------------------------------------------------------------ Client connecting to 192.168.12.21, TCP port 5001 TCP window size: 21.6 KByte (default) ------------------------------------------------------------ [ 3] local 192.168.12.20 port 34465 connected with 192.168.12.21 port 5001 [ ID] Interval Transfer Bandwidth [ 3] 0.0- 1.0 sec 111 MBytes 930 Mbits/sec [ 3] 1.0- 2.0 sec 108 MBytes 909 Mbits/sec [ 3] 2.0- 3.0 sec 108 MBytes 909 Mbits/sec [ 3] 3.0- 4.0 sec 108 MBytes 910 Mbits/sec [ 3] 4.0- 5.0 sec 109 MBytes 918 Mbits/sec [ 3] 5.0- 6.0 sec 109 MBytes 911 Mbits/sec [ 3] 6.0- 7.0 sec 109 MBytes 911 Mbits/sec [ 3] 7.0- 8.0 sec 108 MBytes 910 Mbits/sec [ 3] 8.0- 9.0 sec 109 MBytes 912 Mbits/sec [ 3] 9.0-10.0 sec 108 MBytes 908 Mbits/sec [ 3] 0.0-10.0 sec 1.06 GBytes 913 Mbits/sec |
他にもiperfには以下のオプションがあります。
一般オプション | |
オプション | 意味 |
-f [kmKM] | レポートの単位を指定。k=Kbits , m=Mbits , K=KBytes , M=MBytes。 |
-i [num] | 途中経過のレポートを[num]毎に出力する。 |
-l [num][KM] | 読み書きのバッファサイズを指定。デフォルトは8KByte。 |
-m | TCPセグメントサイズをレポートに出力。 |
-o <filename> | レポートを特定のファイルに出力する。 |
-p <num> | ポート番号を指定する。デフォルトは5001。 |
-u | UDPを使用する。 |
-w [num][KM] | TCPウィンドウサイズを指定する。 UDPで指定した場合はデータグラムとなる。 |
-B <host> | マルチキャストアドレスの指定。サーバ側で-Bで指定し、クライアント側は-cで指定する。 マルチキャスト使用の際にはUDPモードで使用する。 |
-M [num] | TCP MSSサイズを指定する。 |
サーバ側オプション | |
オプション | 意味 |
-s | サーバモードで起動する。 |
-u | UDPモードで起動する。 |
-D | デーモンとして起動する。 |
クライアント側オプション | |
オプション | 意味 |
-b [num][KM] | 帯域幅を指定する。( パケットサイズではない )。 デフォルトは1MbpsでありUDPモードに限る。 |
-c <host> | クライアントモードを指定し、サーバIPを指定する。 |
-t [time] | データを送る秒数を指定する。デフォルトは10秒。 |
-F <filename> | データ転送する際、特定のファイルからデータを読み込む。 |
-P <num> | 同時並行でデータ転送をするスレッド数を指定する。デフォルトは1。 |
-T <num> | マルチキャストのTTLの値を指定する。デフォルトは1。 |
-d | 双方向で通信テストを行う。 |
以下、使用例です。
●TCPスループット計測
2秒間隔でレポートを出力し合計60秒間、同時に3つのスレッドでスループットを計測する。
※サーバ側 # iperf -s ※クライアント側 # iperf -c 192.168.12.21 -i 2 -t 60 -P 3 |
●UDPスループット計測
2秒間隔でレポートを出力し合計60秒間、帯域幅が50Mでデータを送出する。
※サーバ側 # iperf -u -s ※クライアント側 # iperf -u -c 192.168.12.21 -i 2 -t 60 -b 50M |
●マルチキャストアドレス配信
224.10.1.1にサーバがjoinする。そのアドレス宛に対して帯域幅50Mでデータを送信する。
※サーバ側 # iperf -s -u -B 224.10.1.1 ※クライアント側 # iperf -u -c 224.10.1.1 -i 1 -T 10 -b 50M |
iperfのオプションは上記の一覧に書かれてある通りでバッファサイズやウィンドウサイズを指定することが可能です。ただ、スループットを計測する際に大きく影響するのがパケットサイズで、これは-Mオプションで0~1460の間でMSSを指定することになります。但し、TCPに限ります。
何も指定しない場合、どれだけのサイズで送信されているのかWindowsXP同士で通信している最中にWiresharkでキャプチャしてみたところTCPに関しては1300バイト固定であり、UDPの場合は1518バイトでMTUの値を超えており1300バイトと218バイトにフラグメント ( 分割 ) されてパケットが送出されていました。
UDPの場合は再送処理などないためフラグメントは気にせず出来るだけ大きなサイズで送信しようとするのでこうなっているのだと思います。