iperf3でネットワークの帯域測定を行う(まとめ)
クライアント(192.168.1.242) <---> サーバ(192.168.1.100)
- iperf3のインストール
# dnf -y install iperf3
- Firewallの設定(ポートの開放と設定ファイルへの保存)
# firewall-cmd --add-port=5201/tcp
# firewall-cmd --add-port=5201/udp
# firewall-cmd --runtime-to-permanent
- ノートPCを閉じてもスリープしないようにする
# vi /etc/systemd/logind.conf
HandleLidSwitch=ignore
# systemctl restart systemd-logind.service →うまくいかないときがあるので再起動した方が無難
- TCP編
- サーバ側
$ iperf3 -s --forceflush --verbose | tee -a iperf.log.txt
-
- クライアント側
$ iperf3 -c 192.168.1.100 --time 60 --omit 3 --get-server-output --forceflush --verbose | tee -a iperf.log.txt
- UDP編
- サーバ側
$ iperf3 -s --forceflush --verbose | tee -a iperf.log.txt
-
- クライアント側
$ iperf3 -c 192.168.1.100 --udp --bandwidth 100M --time 60 --omit 3 --get-server-output --forceflush --verbose | tee -a iperf.log.txt
- オプション解説
-
- --time 60: デフォルトの1秒間隔で、60秒(60回)実施する。適宜調整下さい。
- --omit 3: 最初の3つを無視する。TCPではスロースタートの影響で最初のスループットが上がらないのでこれを指定する。UDPでも初回ARPの影響が考えられるので指定した方が正確な値が出る。
- --get-server-output: サーバ側の結果をクライアント側にも表示させる。クライアント(sender)側とサーバ(receiver)側の測定時間がmsecオーダーで微妙にずれがあるため転送量、ビットレートの値が異なるが慌てないこと。UDPの場合は1秒毎のパケットロス情報がサーバ側には表示されるが、クライアント側に表示されないので、このオプションをつけてパケットロスの状況をクライアント側にも表示させる。
- --udp: UDPで測定したい場合に指定する。
- --bandwidth : UDPの場合デフォルトで1Mbpsなので、かける負荷(bps)を指定する。適宜調整下さい。
- --forceflush: バッファリングを強制フラッシュさせ、1行事に画面に出力させる。
- 測定の流れの説明
-
- TCPでは通常かける負荷を指定しない。再送制御が働き、最大のスループットが得れられる(--bandwidthを指定しない場合)。
- 一方、UDPでは指定した帯域の負荷(bps)をかけ、何%パケットロスがあったかが得られる。
- UDPのスループットを知りたい場合は、まず、TCPで測定してスループットのあたりをつけ、例えばTCPの結果が 143Mbpsだったら、UDPで130Mbps, 140Mbps, 150Mbps辺りを測定し、許容できるパケットロスのレートを見つける。
- 無線区間等はエラーがゼロにはならないので、UDPで測定する場合は、予め何%のエラー率をもってヨシとするかを決めておく。0%とか1%とか2%とか(アプリケーションにより異なる)
- 出力は、tee で出力しながら、ログファイルにも追記している(-a)。
- ファイルと画面の両方に出したい場合、--forceflush を付けないと、回数分(60秒分)の全ての結果が終わってから画面に表示される(イマイチ)。1秒毎に画面に表示しながらログに出力したいので、--forceflushを付けている。--logfile オプションのみではファイルにのみ出力されて画面に出ない。
- サーバ、クライアントとも、Linux版を利用するのがおススメ。Windows版をサーバで利用した際、異常終了し測定ができず原因不明でトラブったことがある。またLinux版の方がスループットが出る。