【負荷試験ツール】iPerfの仕組みと使い方,オプション,Ubuntuでのインストール方法,遅い時の対処

iPerf とは

iPerf は回線の負荷試験(性能試験)を行うツールです。2 台の PC に iPerf をインストールしてコマンドを打てば簡単に試験ができます。現在の最新バージョンは 3 (iPerf3) です。

iPerf の仕組み

仕組みとしては単純で、PCを2台用意し、各々に iPerf の実行ファイルをインストールし、一方をサーバモードで起動した後、もう一方からクライアントモードで繋ぎに行くだけです。

試験パケットはクライアントから TCP もしくは UDP を指定して接続しに行きますが、UDP 試験であっても最初に TCP で接続して制御用通信を行います。

iPerf をインストールするPCの注意点

インストールする PC を選定する際には十分気を付けて下さい

CPU やメモリのスペックは余裕を持った機器にインストールして下さい。回線は問題ないのに PC 側でパケットを取りこぼすと試験が期待と異なる結果になってしまいます。また、同様の理由で、色々なプログラムが動作している PC も避けて下さい。

有線の試験なのか、無線の試験なのか、それによって有線のインタフェースはあるのか、無線は最新規格 (IEEE802.11ac 等) に対応しているか、等を確認して下さい。

Windows ? or Linux ?

iPerf は Windows 版もありますが、Linux 版がお奨めです。

Windows 版では以下のような不具合が確認されています

  • 複数コネクションオプション (-P) を使った場合、UDP だと結果が 1 コネクション分しか表示されない
  • TCP の MSS 調整オプション (-M) が効かず、MSS の調整ができない

後述しますが、ネットワークの実力値を測定しやすいのは UDP ですが、UDP 1 コネクションだけだとワイヤースピードに達しない場合が多いです。そのため、複数コネクション (-P) で動作させるのは必須です

物理環境 ? or 仮想環境 ?

iPerf を VMware Workstation Player や Oracle VirtualBox 等の仮想環境で実行すると、ホストとゲストの両方に十分なリソースが必要になることや、NIC のエミュレート等による性能劣化の恐れがあります。

なので仮想環境は性能調査目的には不向きです。

ただ、Linux をインストールするマシンもそうそう見つからない、、、

そんな悩みを解消してくれるのが Ubuntu Live USB です。いわゆる USB ブートの Ubuntu です。

USB ブートなのでマシンの HDD にインストールする必要はありません。なので Ubuntu を使うときは USB を差して USB ブート、Windows を使うときは普通に HDD からブート、という利用が可能です。しかも仮想環境ではない Native なデバイス制御が行われるため、性能面でも安心です。

準備もそんなに難しくありません。詳細は以下をご参照下さい。

【Ubuntu】UEFIでUSBブートして設定変更保存も可能にする方法
【Ubuntu】UEFIでUSBブートして設定変更保存も可能にする方法
Windows 端末しかないけどちょっとした所用で Linux も使いたいなんて...

TCP ? or UDP ?

TCP と UDP では特性がだいぶ異なります

一般に UDP のほうがネットワーク層(レイヤー3)の実力値が分かり易いです。一方、TCP はパケットの取りこぼしにより輻輳制御が走るため、速度が低下しやすいです。特性を見るためにも、両方試験したほうがよいでしょう。

有線 ? or 無線 ?

有線はワイヤースピード近く出ることが多いですが、無線は基本は規格理論値の数字は出ません。実際やってみてもそうですし、論文や無線に強い会社のレポートを見ても理論値の 1/3 ~ 1/2 くらいが精々のようです。

Ubuntu での iPerf インストール方法

Ubuntu が起動したら、Terminal を開きます。

ubuntu@ubuntu:~$ sudo vi /etc/apt/sources.list

そして編集画面で以下のように下3行の最後に ”universe” を追記します。

:wq (英語配列の場合 : は Shiftを押しながら; で入力可能)で編集完了後、さらに以下のコマンドを実行

ubuntu@ubuntu:~$ sudo apt update
ubuntu@ubuntu:~$ sudo apt-get install iperf3

途中で y を打ち Enter。これでインストールが完了します。

WAN回線の速度測定のコマンド例

以下ではフレッツ VPN ワイド等の WAN 回線の速度を計測するケースを考えます。フレッツ VPN では MTU 値が 1454 なのでその点を考慮します。

IP ヘッダ : 20 Byte, TCP ヘッダ : 20 Byte, UDP ヘッダ : 8 Byte なので、データ長をこの分を MTU 1454 から差し引きます。つまり、、、

TCP の場合は IP ヘッダと TCP ヘッダの 40 Byte 分を差し引きます。具体的には、"-M 1414" オプションで TCP ペイロード (=MSS) : 1414 を指定します。
UDP の場合は IP ヘッダと UDP ヘッダの 28 Byte 分を差し引きます。具体的には、"-l 1426" オプションで UDP ペイロード : 1426 を指定します。

TCP 測定の場合

iPerf サーバ=192.168.1.1/24 , iPerf クライアント=192.168.2.1/24 とします。

サーバ側はオプションを特に気にする必要はありません。

ubuntu@ubuntu:~$ iperf3 -s

クライアント側はオプションを以下のように指定します。-c の後には iPerf サーバの IP アドレス、-M の後には MSS 値、-t の後には試験実行時間(秒)、-P の後には並行(Parallel) コネクション数です。--logfile は結果を(コンソールではなく)テキストファイルに出力します。

ubuntu@ubuntu:~$ iperf3 -c 192.168.1.1 -M 1414 -t 60 -P 5 --logfile result.txt

UDP 測定の場合

サーバ側はオプションを特に気にする必要はありません。

ubuntu@ubuntu:~$ iperf3 -s

クライアント側はオプションを以下のように指定します。-c の後には iPerf サーバの IP アドレス、-u は UDP で動作することを意味します。-l の後には UDP ペイロード長、-t の後には試験実行時間(秒)、-P の後には並行(Parallel) コネクション数です。-b では目標帯域を指定します。TCP ではデフォルト無制限ですが、UDP の場合はデフォルト 1Mbps のため、回線帯域など適切な値を指定します。

ubuntu@ubuntu:~$ iperf3 -c -l 1426 -t 60 -P 5 -b 1000M --logfile result.txt

TCP や UDP で速度が出ない!遅い!というときは

以下、前述のものもありますが、

  1. VMware Workstation Player や Oracle VirtualBox 等の仮想環境を使っている場合は、物理 PC に変更しましょう。Linux をインストールできない場合は Ubuntu Live USB を検討しましょう。
  2. "-P" オプションをつけないと、1 コネクションのみで測定をしますが、ワイヤースピードに達しないことが多いので、"-P 5" 等で複数コネクションで試験しましょう。
  3. UDP の場合はデフォルトで目標帯域幅が 1 Mbps になっています。-b オプションで帯域を指定しましょう。
  4. TCP の場合はバッファサイズをデフォルトの 128KB から増やすことで速度向上が見込めます。TCP のバッファサイズ変更は "-l 256K" や "-l 10M" 等と指定します。

いきなり本番環境で実施するとその速度がネットワーク環境によるものなのかマシン性能に引き摺られているのかが不明確です。必ず事前に動作確認をしましょう

事前確認では利用する PC を 2 台とも同じ L2 スイッチに接続し、-P オプションで同時接続コネクション数を増やしてワイヤースピードに達する最小限を確認しましょう。つまり、SUM (合計速度) がワイヤースピード近くになるまで -P の値を増やしていくのです。

サーバ、クライアント共通オプション

-p : ポート変更(デフォルト=5201)

iperf3 -s -p 6001 とするとサーバの待ち受けポートが 6001 になり、iperf3 -c 1.1.1.1 -p 6001 でクライアントからの接続ポートが 6001 になる。

-f : 速度結果表示の単位を変更。(デフォルト=適切な単位)

デフォルトでは大きさに合わせて勝手に GBits/sec や MBits/sec で調整してくれるが、揃えたいときは -f を使う。Kbits/sec に揃える場合は "-f k", MBytes/sec に揃える場合は "-f M" 等。

-i : 結果表示の間隔秒数(デフォルト=1秒)

デフォルトでは1秒間隔に途中結果が画面に表示される。-i 10 を指定すると10秒間隔に変更となる。-i 0 を指定すると途中結果は表示されず、最後だけ結果が表示される。

-F : ファイルの読み書き(デフォルト=ランダム)

デフォルトの動作ではクライアントはランダム文字列を投げ、サーバはそれを捨てる。クライアント側でこのオプションでクライアント側に存在するファイルパスを指定すると、そのファイルを読み込んでそれをサーバ側へ投げる。サーバ側でこのオプションを指定するとクライアントから受信したデータを指定ファイルへ書き込む。

-A : CPU の Affinity(デフォルト:指定なし)

どの CPU を積極的に使うかを指定します。-A 1 とすれば、CPU番号#1を積極的に使います。(このオプションは Linux と FreeBSD のみ有効です)

-B : インタフェースの指定(デフォルト:全IPで待ち受け、ソースIPはルーティングテーブルに従う)

サーバはこのオプションを指定するとその IP アドレスのみで待ち受けします。クライアントはこのオプションで送信元 IP を指定することができます。

-V : 詳細のアウトプットを表示する

-J : 結果を JSON 形式で表示する

--logfile : 結果を指定ファイルに出力する

--forceflush : 途中結果を毎回コンソールに上書き表示する

-d : debug モード(開発者向け)

-v : バージョンを表示する

-h : ヘルプを表示する

サーバ側のオプション

-s : サーバモードで動作

-D : デーモンとしてバックグラウンドで動作

-I : PID ファイルを作成することにより、重複起動を避ける

-1 : クライアント 1 接続のみに対処した後、サービスを終了させる

クライアント側のオプション

-c : クライアントモードで動作

--sctp : TCP ではなく SCTP で動作(FreeBSD と Linux のみ有効)

-u : TCP ではなく UDP で動作

-b : 帯域を指定

目標帯域を指定。TCPの場合はデフォルトは無制限、UDP の場合はデフォルトは 1 Mbps。UDP で 1Gbps を出力させるためには -b 1000M と指定する。

--fq-rate : Fair-Queueing ベーススケジューラのレート

Fair-Queueing ベーススケジューラのレートを bps 単位で指定します。これは -b オプションと競合するものではなく、フロー制御を実現するものです。

-t : 転送(測定)時間(デフォルト:10秒)

指定した時間が経過した後、転送(測定試験)を終了します。

-n : 転送(測定)バイト数

これを指定すると、-t で指定した時間経過で終了するのではなく、転送バイト数に達した時点で試験を終了します。

-k : 転送(測定)パケット数

これを指定すると、-t で指定した時間経過で終了するのではなく、転送パケット数に達した時点で試験を終了します。

-l : TCP の場合はバッファ(デフォルト 128 KB), UDP の場合はペイロード長(デフォルトは 1460 から Path MTU Discovery に従った探索)

--cport : クライアント側の TCP/UDP 送信元ポートを指定

-P : 同時並行コネクション(ストリーム)数を指定

-R : Reverse モードで動作

クライアントからサーバに接続しに行った後、サーバからデータを送信し、クライアントがデータを受信する。

-w : ソケットバッファサイズ(TCP の場合は Window サイズも)を指定

-w 256M と指定した場合、 iPerf プロセスは 256 MB のバッファを用意する。

-M : TCP MSS サイズを指定(デフォルト:インタフェース MTU - 40)

-M 1414 で MSS=1414 で動作する。

-N : Nagle's アルゴリズムを無効

-4 : IPv4 のみで動作

-6 : IPv6 のみで動作

-S : IPv4 ToS 値を指定

-L : IPv6 Flow Label 値を指定

-Z : バッファの性能向上機能『ゼロコピー』を有効化

-O : 最初の数秒を測定時間から除外

-O 2 と指定すると、最初の2秒を測定時間から除外する。TCP はスロースタートメカニズムが働いており、これを指定することでその影響による速度低下を無くすことができる。

-T : 結果表示の左端に指定文字列を表示

--get-server : サーバ側の結果をクライアント側にも表示

フォローする