iperfはクライアント・サーバ間のネットワークの帯域幅を測定するツールです。
TCP、UDP、SCTPを利用してクライアントからサーバにデータを送信し(逆も可)、その結果から帯域幅を測定します。
様々なオプションによって設定が可能で、結果をjsonでも取得できます。
なお、この記事ではiperf3に限って説明します。
基本的な使い方
- サーバIP: 192.168.1.1
- クライアントIP: 192.168.2.1
注意点として、サーバとクライアントで表示される測定値が異なります。
おそらくですが、サーバはクライアント→サーバの一方向のみで判定しているのに対し、クライアントはクライアント・サーバ間の往復で測定しているのだと思われます。
以下にデフォルトでの使用例を示します。
サーバ
root@user:~# iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.2.1, port 55948
[ 5] local 192.168.1.1 port 5201 connected to 192.168.2.1 port 55950
[ ID] Interval Transfer Bandwidth
[ 5] 0.00-1.00 sec 113 KBytes 927 Kbits/sec
[ 5] 1.00-2.00 sec 93.3 KBytes 764 Kbits/sec
[ 5] 2.00-3.00 sec 91.9 KBytes 753 Kbits/sec
[ 5] 3.00-4.00 sec 94.7 KBytes 777 Kbits/sec
[ 5] 4.00-5.00 sec 93.3 KBytes 765 Kbits/sec
[ 5] 5.00-6.00 sec 91.9 KBytes 753 Kbits/sec
[ 5] 6.00-7.00 sec 93.3 KBytes 765 Kbits/sec
[ 5] 7.00-8.00 sec 94.7 KBytes 777 Kbits/sec
[ 5] 8.00-9.00 sec 93.3 KBytes 764 Kbits/sec
[ 5] 9.00-10.00 sec 93.8 KBytes 769 Kbits/sec
[ 5] 10.00-11.00 sec 93.3 KBytes 765 Kbits/sec
[ 5] 11.00-11.96 sec 90.0 KBytes 768 Kbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 5] 0.00-11.96 sec 0.00 Bytes 0.00 bits/sec sender
[ 5] 0.00-11.96 sec 1.11 MBytes 779 Kbits/sec receiver
クライアント
root@user:~# iperf3 -c 192.168.1.1
Connecting to host 192.168.1.1, port 5201
[ 4] local 192.168.2.1 port 55950 connected to 192.168.1.1 port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 262 KBytes 2.14 Mbits/sec 0 19.8 KBytes
[ 4] 1.00-2.00 sec 141 KBytes 1.16 Mbits/sec 0 24.0 KBytes
[ 4] 2.00-3.00 sec 63.6 KBytes 521 Kbits/sec 0 29.7 KBytes
[ 4] 3.00-4.00 sec 191 KBytes 1.56 Mbits/sec 0 42.4 KBytes
[ 4] 4.00-5.00 sec 191 KBytes 1.56 Mbits/sec 0 66.5 KBytes
[ 4] 5.00-6.00 sec 318 KBytes 2.61 Mbits/sec 0 102 KBytes
[ 4] 6.00-7.00 sec 382 KBytes 3.13 Mbits/sec 0 150 KBytes
[ 4] 7.00-8.00 sec 318 KBytes 2.60 Mbits/sec 0 195 KBytes
[ 4] 8.00-9.00 sec 127 KBytes 1.04 Mbits/sec 0 195 KBytes
[ 4] 9.00-10.00 sec 63.6 KBytes 522 Kbits/sec 0 195 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 2.01 MBytes 1.69 Mbits/sec 0 sender
[ 4] 0.00-10.00 sec 1.11 MBytes 931 Kbits/sec receiver
iperf Done.
オプション一覧
オプションは共通で使用できるもの、サーバのみで指定できるもの、クライアントのみで指定できるものに分類されます。
サーバとして起動する-s
オプション、もしくはクライアントとして起動する-c
オプションのどちらかは必須です。
太字はよく使用すると思われるオプションです。
共通
オプション | 説明 |
---|---|
-p, --port n | サーバなら待ち受けるポート、クライアントなら接続先ポートを指定する。デフォルトは5201。 |
--cport n | クライアント側のポートを指定できる。 |
-f, --format [kmKM] | 出力される結果のbandwidthの単位を指定できる。 'k' = Kbits/sec 'K' = KBytes/sec 'm' = Mbits/sec 'M' = MBytes/sec |
-i, --interval n | n秒ごとにbandwidth、jitter、lossの結果を出す。デフォルトは1。0にすると終了時の統計しか出力しない。 |
-F, --file name | クライアントなら送るデータを設定できる。デフォルトはランダムデータ。サーバならどこに書き込むかを設定できる。デフォルトは書き込まず受け取ったデータを廃棄する。 |
-A, --affinity n/n,m-F | 使用するCPUを指定できる。 |
-B, --bind host | 使用する(待ち受ける)IPアドレスを指定する。NICが複数ある場合に使用する。 |
-V, --verbose | 詳細出力を行う。 |
-J, --json | JSONで出力する。 |
--logfile file | 指定すると結果をファイルに出力する。 |
--d, --debug | デバッグ出力を行う。主に開発者が使うことを想定している。 |
-v, --version | バージョンを出力する。 |
-h, --help | ヘルプを出力する。 |
サーバ
オプション | 説明 |
---|---|
-s, --server | iperfサーバを起動する (一度に一つのコネクションしか許可しない) |
-D, --daemon | デーモンとしてバックグラウンドで動作させる。 |
-I, --pidfile file | pidをファイルに書き出す。サーバが停止したら削除される。バックグラウンドで動作させるときに有用。 |
-1, --one-off | クライアントと1回通信を行った後に終了する。 |
クライアント
オプション | 説明 |
---|---|
-c, --client host | iperfクライアントを起動し、hostに対して接続する。 |
--sctp | TCPではなくSCTPを使用する。(Linux, FreeBSD, Solaris) |
-u, --udp | TCPではなくUDPを使用する。 |
-b, --bandwidth n[KM] | 帯域制限を掛ける。TCPの場合デフォルト無制限、UDPの場合はデフォルト1Mbit/sec。-p オプションによって並列実行している場合、それぞれのストリームに対して制限がかかる(合計ではない)。 |
-t, --time n | n秒間通信を行う。デフォルトは10秒。-n , -k オプションと一緒に指定できない。 |
-n, --num n[KM] | n個のバッファを送信し終えるとiperfクライアントを終了する。-t , -k オプションと一緒に指定できない。 |
-k, --blockcount n[KM] | n個のブロック(パケット)を送信し終えるとクライアントを終了する。-t , -n オプションと一緒に指定できない。 |
-l, --length n[KM] | 書き込むor読み込むバッファの長さを指定する。iperfはlengthバイトの配列を何度も送信して通信の測定を行う。TCPはデフォルト128KB、UDPはデフォルト8KB。 |
-P, --parallel n | n個のコネクションを同時に接続する。デフォルトは1つ。 |
-R, --reverse | サーバが送信、クライアントが受信を行う。(デフォルトはサーバが受信、クライアントが送信) |
-w, --window n[KM] | ソケットのバッファサイズを指定する。TCPの場合、TCPのウィンドウサイズを設定する。 |
-M, --set-mss n | TCPの最大セグメントサイズ(MSS)の設定を試みる。イーサネットの場合、通常1460バイト(MTU1500バイト) |
-N, --no-delay | TCPのno delayオプションをつける。(telnetなどの対話的なアプリケーションと同様に)Nagleアルゴリズムを無効にする。 |
-4, --version4 | IPv4のみ使用する。 |
-6, --version4 | IPv6のみ使用する。 |
-S, --tos n | 送信パケットのTOSフィールドを指定する(多くのルータはTOSフィールドを無視する)。RFC1349に規定されているTOSフ番号(8進数)によって指定する。 |
-L, --flowlabel n | IPv6フローラベルを設定する。(今はLinuxしかサポートしていない) |
-Z, --zerocopy | データの送信に"zero copy"メソッドを使用する。CPUの使用率を下げられる。 |
-O, --omit n | 最初のn秒を切り捨てる。これによりTCPのスロースタート区間をスキップできる。 |
-T, --title str | 出力行ごとにプレフィックスとしてstrをつける。 |
-C, --linux-congestion algo | TCPの輻輳制御アルゴリズムを指定する。(Linuxはiperf3.0より、FreeBSDはiperf3.1より) |
--get-server-output | 測定用の通信終了後、サーバの出力を取得する。サーバで-J オプションが指定されている場合はJSON形式となる。 |
一部オプション使用例
-J, --json
+ --get-server-output
-J, --json
はjson出力を行うオプションです。
--get-server-output
はクライアントでサーバの出力を取得するオプションです。
(逐一ログを書くと非常に長くなるため同時に解説します。)
json出力ではstart
には自分や接続先の情報が記録されます。
intervals
には毎秒ごと(-i
オプションで指定した秒数ごと)の統計情報を配列で記録され、
end
には全体の統計情報が表示されます。
また、--get-server-output
を使用するとクライアントの出力にserver_output_json
が追加され、サーバの情報が丸々表示されます。
--get-server-output
の出力フォーマットはサーバに依存します。
サーバ側で-J
が使用されている場合はserver_output_json
がクライアントに追加され、フォーマットはjsonとなります。
-J
が使用されていない場合はserver_output_text
が追加され、出力はhuman readableな形になります。
以下に使用例を示します。(ログを短くするため、-t
オプションで2秒のみ実行しています。)
サーバ
root@user:~# iperf3 -s -J
{
"start": {
"connected": [{
"socket": 6,
"local_host": "192.168.1.1",
"local_port": 5201,
"remote_host": "192.168.2.1",
"remote_port": 55896
}],
"version": "iperf 3.1.3",
"system_info": "Linux user 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64",
"timestamp": {
"time": "Mon, 22 Oct 2018 11:43:09 GMT",
"timesecs": 1540208589
},
"accepted_connection": {
"host": "192.168.2.1",
"port": 55894
},
"cookie": "user.1540208589.347668.465df0c74fa7c",
"tcp_mss_default": 1448,
"test_start": {
"protocol": "TCP",
"num_streams": 1,
"blksize": 131072,
"omit": 0,
"duration": 2,
"bytes": 0,
"blocks": 0,
"reverse": 0
}
},
"intervals": [{
"streams": [{
"socket": 6,
"start": 0,
"end": 1.000122,
"seconds": 1.000122,
"bytes": 7851120,
"bits_per_second": 62801308.797608,
"omitted": false
}],
"sum": {
"start": 0,
"end": 1.000122,
"seconds": 1.000122,
"bytes": 7851120,
"bits_per_second": 62801308.797608,
"omitted": false
}
}, {
"streams": [{
"socket": 6,
"start": 1.000122,
"end": 2.000173,
"seconds": 1.000051,
"bytes": 8340480,
"bits_per_second": 66720435.818218,
"omitted": false
}],
"sum": {
"start": 1.000122,
"end": 2.000173,
"seconds": 1.000051,
"bytes": 8340480,
"bits_per_second": 66720435.818218,
"omitted": false
}
}, {
"streams": [{
"socket": 6,
"start": 2.000173,
"end": 2.039380,
"seconds": 0.039207,
"bytes": 347520,
"bits_per_second": 70909819.689381,
"omitted": false
}],
"sum": {
"start": 2.000173,
"end": 2.039380,
"seconds": 0.039207,
"bytes": 347520,
"bits_per_second": 70909819.689381,
"omitted": false
}
}],
"end": {
"streams": [{
"sender": {
"socket": 6,
"start": 0,
"end": 2.039380,
"seconds": 2.039380,
"bytes": 0,
"bits_per_second": 0
},
"receiver": {
"socket": 6,
"start": 0,
"end": 2.039380,
"seconds": 2.039380,
"bytes": 16539120,
"bits_per_second": 64879017.493887
}
}],
"sum_sent": {
"start": 0,
"end": 2.039380,
"seconds": 2.039380,
"bytes": 0,
"bits_per_second": 0
},
"sum_received": {
"start": 0,
"end": 2.039380,
"seconds": 2.039380,
"bytes": 16539120,
"bits_per_second": 64879017.493887
},
"cpu_utilization_percent": {
"host_total": 0.280553,
"host_user": 0.149538,
"host_system": 0.131039,
"remote_total": 0,
"remote_user": 0,
"remote_system": 0
}
}
}
クライアント
root@user:~# iperf3 -c 192.168.1.1 -J -t 2 --get-server-output
{
"start": {
"connected": [{
"socket": 4,
"local_host": "192.168.2.1",
"local_port": 55896,
"remote_host": "192.168.1.1",
"remote_port": 5201
}],
"version": "iperf 3.1.3",
"system_info": "Linux user 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64",
"timestamp": {
"time": "Mon, 22 Oct 2018 11:43:09 GMT",
"timesecs": 1540208589
},
"connecting_to": {
"host": "192.168.1.1",
"port": 5201
},
"cookie": "user.1540208589.347668.465df0c74fa7c",
"tcp_mss_default": 1448,
"test_start": {
"protocol": "TCP",
"num_streams": 1,
"blksize": 131072,
"omit": 0,
"duration": 2,
"bytes": 0,
"blocks": 0,
"reverse": 0
}
},
"intervals": [{
"streams": [{
"socket": 4,
"start": 0,
"end": 1.000226,
"seconds": 1.000226,
"bytes": 10049120,
"bits_per_second": 80374793.623801,
"retransmits": 0,
"snd_cwnd": 367792,
"rtt": 20369,
"omitted": false
}],
"sum": {
"start": 0,
"end": 1.000226,
"seconds": 1.000226,
"bytes": 10049120,
"bits_per_second": 80374793.623801,
"retransmits": 0,
"omitted": false
}
}, {
"streams": [{
"socket": 4,
"start": 1.000226,
"end": 2.000355,
"seconds": 1.000129,
"bytes": 8535960,
"bits_per_second": 68278873.087020,
"retransmits": 0,
"snd_cwnd": 367792,
"rtt": 20316,
"omitted": false
}],
"sum": {
"start": 1.000226,
"end": 2.000355,
"seconds": 1.000129,
"bytes": 8535960,
"bits_per_second": 68278873.087020,
"retransmits": 0,
"omitted": false
}
}],
"end": {
"streams": [{
"sender": {
"socket": 4,
"start": 0,
"end": 2.000355,
"seconds": 2.000355,
"bytes": 18585080,
"bits_per_second": 74327126.739364,
"retransmits": 0,
"max_snd_cwnd": 367792,
"max_rtt": 20369,
"min_rtt": 20316,
"mean_rtt": 20342
},
"receiver": {
"socket": 4,
"start": 0,
"end": 2.000355,
"seconds": 2.000355,
"bytes": 16539120,
"bits_per_second": 66144739.134701
}
}],
"sum_sent": {
"start": 0,
"end": 2.000355,
"seconds": 2.000355,
"bytes": 18585080,
"bits_per_second": 74327126.739364,
"retransmits": 0
},
"sum_received": {
"start": 0,
"end": 2.000355,
"seconds": 2.000355,
"bytes": 16539120,
"bits_per_second": 66144739.134701
},
"cpu_utilization_percent": {
"host_total": 2.032571,
"host_user": 0.482924,
"host_system": 1.549694,
"remote_total": 0.280553,
"remote_user": 0.149538,
"remote_system": 0.131039
}
},
"server_output_json": {
"start": {
"connected": [{
"socket": 6,
"local_host": "192.168.1.1",
"local_port": 5201,
"remote_host": "192.168.2.1",
"remote_port": 55896
}],
"version": "iperf 3.1.3",
"system_info": "Linux user 4.15.0-36-generic #39-Ubuntu SMP Mon Sep 24 16:19:09 UTC 2018 x86_64",
"timestamp": {
"time": "Mon, 22 Oct 2018 11:43:09 GMT",
"timesecs": 1540208589
},
"accepted_connection": {
"host": "192.168.2.1",
"port": 55894
},
"cookie": "user.1540208589.347668.465df0c74fa7c",
"tcp_mss_default": 1448,
"test_start": {
"protocol": "TCP",
"num_streams": 1,
"blksize": 131072,
"omit": 0,
"duration": 2,
"bytes": 0,
"blocks": 0,
"reverse": 0
}
},
"intervals": [{
"streams": [{
"socket": 6,
"start": 0,
"end": 1.000122,
"seconds": 1.000122,
"bytes": 7851120,
"bits_per_second": 62801308.797608,
"omitted": false
}],
"sum": {
"start": 0,
"end": 1.000122,
"seconds": 1.000122,
"bytes": 7851120,
"bits_per_second": 62801308.797608,
"omitted": false
}
}, {
"streams": [{
"socket": 6,
"start": 1.000122,
"end": 2.000173,
"seconds": 1.000051,
"bytes": 8340480,
"bits_per_second": 66720435.818218,
"omitted": false
}],
"sum": {
"start": 1.000122,
"end": 2.000173,
"seconds": 1.000051,
"bytes": 8340480,
"bits_per_second": 66720435.818218,
"omitted": false
}
}, {
"streams": [{
"socket": 6,
"start": 2.000173,
"end": 2.039380,
"seconds": 0.039207,
"bytes": 347520,
"bits_per_second": 70909819.689381,
"omitted": false
}],
"sum": {
"start": 2.000173,
"end": 2.039380,
"seconds": 0.039207,
"bytes": 347520,
"bits_per_second": 70909819.689381,
"omitted": false
}
}],
"end": {
"streams": [{
"sender": {
"socket": 6,
"start": 0,
"end": 2.039380,
"seconds": 2.039380,
"bytes": 0,
"bits_per_second": 0
},
"receiver": {
"socket": 6,
"start": 0,
"end": 2.039380,
"seconds": 2.039380,
"bytes": 16539120,
"bits_per_second": 64879017.493887
}
}],
"sum_sent": {
"start": 0,
"end": 2.039380,
"seconds": 2.039380,
"bytes": 0,
"bits_per_second": 0
},
"sum_received": {
"start": 0,
"end": 2.039380,
"seconds": 2.039380,
"bytes": 16539120,
"bits_per_second": 64879017.493887
},
"cpu_utilization_percent": {
"host_total": 0.280553,
"host_user": 0.149538,
"host_system": 0.131039,
"remote_total": 0,
"remote_user": 0,
"remote_system": 0
}
}
}
}
サーバで-J
オプションが使用されてない場合のserver_output_text
"server_output_text": "Accepted connection from 192.168.2.1, port 55900\n[ 5] local 192.168.1.1 port 5201 connected to 192.168.2.1 port 55902\n[ ID] Interval Transfer Bandwidth\n[ 5] 0.00-1.00 sec 5.06 MBytes 42.5 Mbits/sec \n[ 5] 1.00-2.00 sec 5.41 MBytes 45.4 Mbits/sec \n[ 5] 2.00-2.02 sec 113 KBytes 38.5 Mbits/sec \n- - - - - - - - - - - - - - - - - - - - - - - - -\n[ ID] Interval Transfer Bandwidth\n[ 5] 0.00-2.02 sec 0.00 Bytes 0.00 bits/sec sender\n[ 5] 0.00-2.02 sec 10.6 MBytes 43.9 Mbits/sec receiver\n"
-u
-u
オプションは測定にUDPを使用するオプションです。
TCP仕様時とは異なり、ロス・遅延(ジッタ)が表示されます。
注意点として、クライアント側で出力されるbandwidthは測定値ではなく、クライアントの送信帯域となります。
TCPと異なりサーバからACKが帰ってこないため、測定ができないのだと思われます。
また、iperfの制御用通信は常にTCPの指定ポート(デフォルト5201)で行われます。
以下使用例です。
サーバ
root@user:~# iperf3 -s
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 192.168.2.1, port 39926
[ 5] local 192.168.1.1 port 5201 connected to 192.168.2.1 port 43902
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 5] 0.00-1.00 sec 80.0 KBytes 655 Kbits/sec 3.268 ms 4/14 (29%)
[ 5] 1.00-2.00 sec 72.0 KBytes 590 Kbits/sec 6.837 ms 6/15 (40%)
[ 5] 2.00-3.00 sec 80.0 KBytes 655 Kbits/sec 9.455 ms 6/16 (38%)
[ 5] 3.00-4.00 sec 80.0 KBytes 655 Kbits/sec 11.324 ms 6/16 (38%)
[ 5] 4.00-5.00 sec 80.0 KBytes 656 Kbits/sec 11.901 ms 6/16 (38%)
[ 5] 5.00-6.00 sec 80.0 KBytes 655 Kbits/sec 12.634 ms 6/16 (38%)
[ 5] 6.00-7.00 sec 80.0 KBytes 656 Kbits/sec 12.423 ms 6/16 (38%)
[ 5] 7.00-8.00 sec 80.0 KBytes 655 Kbits/sec 12.726 ms 6/16 (38%)
[ 5] 8.00-9.00 sec 88.0 KBytes 721 Kbits/sec 12.561 ms 6/17 (35%)
[ 5] 9.00-10.00 sec 72.0 KBytes 590 Kbits/sec 12.321 ms 6/15 (40%)
[ 5] 10.00-10.12 sec 16.0 KBytes 1.07 Mbits/sec 12.619 ms 1/3 (33%)
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 5] 0.00-10.12 sec 0.00 Bytes 0.00 bits/sec 12.619 ms 59/160 (37%)
クライアント
root@user:~# iperf3 -c 192.168.1.1 -u
Connecting to host 192.168.1.1, port 5201
[ 4] local 192.168.2.1 port 43902 connected to 192.168.1.1 port 5201
[ ID] Interval Transfer Bandwidth Total Datagrams
[ 4] 0.00-1.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 1.00-2.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 2.00-3.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 3.00-4.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 4.00-5.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 5.00-6.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 6.00-7.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 7.00-8.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 8.00-9.00 sec 128 KBytes 1.05 Mbits/sec 16
[ 4] 9.00-10.00 sec 128 KBytes 1.05 Mbits/sec 16
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.00-10.00 sec 1.25 MBytes 1.05 Mbits/sec 12.619 ms 59/160 (37%)
[ 4] Sent 160 datagrams
iperf Done.
公開サーバ
こちらのページに公開されているiperf3のサーバの一覧が載っています。
とりあえずiperfを試す場合はこちらを利用するのも良いでしょう。