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で 認識されていません |
パスが通っていない |