ネットワーク

iperf3の使い方|Windows・Linuxでの帯域測定とオプション一覧

iperf3 は2点間のネットワーク帯域を測定するツール。サーバ側とクライアント側の2台を用意し、実際にトラフィックを流して実効速度を測る。

回線が遅いという申告を受けたとき、どの区間で落ちているのかを切り分けるのに使う。WindowsとLinuxの両方で動く。

準備

測定には2台必要になる。片方をサーバ、もう片方をクライアントにして、対向で試験する。

インストールがまだなら先に済ませておく。

→ iperf3のダウンロードとインストール|Windows最新版の入手方法

試験構成

ここではサーバ側を 192.168.1.200 とする。

[クライアント] ─── ネットワーク ─── [サーバ 192.168.1.200]

測定したい区間の両端に置くのが基本になる。拠点間の速度を測りたいなら各拠点に、VPN越しの速度を測りたいならトンネルの両端に配置する。

サーバ側の実行

iperf3 -s

Server listening on 5201 と表示されれば待ち受け状態になる。

ポートを変えたい場合は -p で指定する。

iperf3 -s -p 5202

接続できない場合はファイアウォールを疑う。サーバ側で5201番(TCP/UDP)の受信を許可しておく必要がある。

クライアント側の実行

iperf3 -c 192.168.1.200

デフォルトではTCPで10秒間測定する。サーバ側にも同じ結果が表示される。

結果の見方

TCP測定の出力はこうなる。

[ ID] Interval        Transfer     Bitrate         Retr  Cwnd
[  5] 0.00-1.00 sec   112 MBytes   940 Mbits/sec    0    1.05 MBytes
列 意味
Interval 測定区間の時間
Transfer その区間で転送した容量
Bitrate 実効速度。これが知りたい数字
Retr 再送回数。0でないならパケットロスが起きている
Cwnd 輻輳ウィンドウサイズ

Retr が重要になる。速度が出ないときにここが増えていれば、経路のどこかでパケットが落ちている。ケーブル不良、デュプレックス不一致、機器の輻輳などを疑う。

最後にサマリが2行出る。

[  5] 0.00-10.00 sec  1.09 GBytes  938 Mbits/sec   0   sender
[  5] 0.00-10.00 sec  1.09 GBytes  936 Mbits/sec       receiver

receiver の値が実際に届いた速度になる。sender と大きく差があるなら、途中で失われている。

TCPでよく使うオプション

オプション 説明
-t 30 測定時間を秒で指定する。デフォルトは10秒
-n 10M 容量で区切る。10Mバイト流した結果を測定する
-i 5 途中経過を表示する間隔(秒)。デフォルトは1秒
-P 4 並列ストリーム数。1本では上限まで出ない高速回線で使う
-R 通信方向を逆にする(サーバ→クライアント)
--bidir 上りと下りを同時に測定する
-O 3 最初の3秒を測定から除外する
-p 5202 接続先ポートを指定する
-f m 単位を固定する(k/m/g で bit、K/M/G で Byte)
-w 512K TCPウィンドウサイズを指定する
--get-server-output サーバ側の結果もクライアント側に表示する

-n と -t は同時に指定できない。

-O を使う理由

TCPにはスロースタートがあり、測定開始直後は速度が上がりきらない。短時間の測定ではこれが平均値を下げる。

iperf3 -c 192.168.1.200 -t 30 -O 3

最初の3秒を捨てることで、安定した状態の速度だけを測れる。短時間の測定で数値がばらつくときに効く。

-P を使う場面

1本のTCPセッションでは、遅延の大きい回線や10Gを超える回線で上限まで出ない。

iperf3 -c 192.168.1.200 -P 8

拠点間VPNや広域回線では、-P なしの測定値だけを見て「遅い」と判断すると誤る。並列でも出ないなら、本当に経路側の問題になる。

上り下りを両方測る

iperf3 -c 192.168.1.200 --bidir

非対称な回線では、上りと下りで大きく差が出ることがある。片方向だけ測って終わらせない。

実行例

iperf3 -c 192.168.1.200 -t 30 -i 10 -O 3 --get-server-output

30秒測定、10秒ごとに経過表示、最初の3秒を除外し、最後にサーバ側の結果も表示する。

UDPでの測定

iperf3 -c 192.168.1.200 -u -b 100M --get-server-output
オプション 説明
-u UDPで計測する
-b 100M 帯域を指定する。指定しないと1Mbpsになる
-b 0 上限なしで流す
-l 1472 送信するデータサイズを指定する

-b の指定を忘れないこと。UDPはデフォルトが1Mbpsなので、指定しないと帯域測定にならない。

パケットサイズを1500にしたい場合

-l に1472を指定する。

データ1472 + UDPヘッダ8 + IPヘッダ20 = 1500

MTUの検証をするときは、この計算を意識して指定する。

UDPの結果の見方

[ ID] Interval   Transfer   Bitrate   Jitter    Lost/Total Datagrams
[  5] 0.00-10.00 sec  119 MBytes  100 Mbits/sec  0.045 ms  0/86580 (0%)
  • Jitter … 到達間隔のばらつき。音声や映像で重要。数ms を超えると品質に影響が出る
  • Lost/Total … 損失パケット数と総数。0%が理想

指定した帯域(例では100Mbps)どおりに Bitrate が出ていて、Lost が0%なら、その帯域は問題なく流せている。

UDPは輻輳制御がないため、回線の実力を超えて流せてしまう。-b を上げていき、どこからロスが出始めるかを見るのが実践的な使い方になる。

Linuxでバックグラウンド実行する

長時間の測定では nohup と & を使う。

サーバ側

nohup iperf3 -s -i 30 &

クライアント側

nohup iperf3 -c 1.1.1.1 -n 10M -i 30 --get-server-output > test.txt &

結果をカレントディレクトリの test.txt に保存する。SSH接続が切れても測定が続く。

結果をJSONで出力する

iperf3 -c 192.168.1.200 -J > result.json

定期的に測定して記録を残す用途では、こちらのほうが扱いやすい。cronで回してグラフ化するといった使い方ができる。

速度が出ないときの切り分け

測定値が期待より低い場合、次の順に確認する。

確認すること 見るポイント
1. 並列で改善するか -P 8 で上がるなら1セッションの限界。経路の問題ではない
2. Retr が出ていないか 0でなければパケットロス。物理層や機器を疑う
3. 方向で差がないか -R や --bidir で片方向だけ遅くないか確認する
4. UDPでも出ないか UDPで出るならTCPのチューニング問題
5. 端末の性能 古いPCやVMではCPUが先に頭打ちになることがある

1番は特に見落とされやすい。遅延の大きい回線では、1セッションのTCPスループットは理論上の上限より大幅に低くなる。

うまくいかないときの確認ポイント

症状 原因と対処
Connection timed out サーバ側の5201番がファイアウォールで塞がれている
unable to connect to server サーバ側で iperf3 -s が動いていない。IPアドレスも確認
the server is busy running a test 前回の測定が残っている。サーバ側を再起動する
速度が全く出ない(UDP) -b を指定していない。デフォルトの1Mbpsになっている
10G回線で上限まで出ない -P で並列ストリームを増やす
数値がばらつく -t を長くし、-O で最初の数秒を除外する
Windowsで 認識されていません パスが通っていない

関連記事

-ネットワーク