(ネットワーク)回線速度測定ツールJperfを使ってみた ではIperfをラッピングしたGUIベースのJperfを紹介しました。
しかし、JperfでUDPで測定すると、「WARNING: did not receive ack of last datagram after 10 tries.」 とか 「read failed: Connection reset by peer」と表示され、うまく測定できません。(バージョンは2.0.2です。)
また、UDPは測定時に帯域幅(UDP Bandwidth)を指定するのも意味が分かりませんし、どれくらいパケットロスしたのかも分かりません。
ということで、さらにネットワークベンチマークソフトを探してみたところ、NetPerfというのを見つけました。
ダウンロードは
ftp://ftp.cup.hp.com/dist/networking/benchmarks/netperf/からできます。(メインはLinux向けのようですが、ちゃんとWindows用のバイナリも有ります)
使い方ですが、サーバ側となる方は、下記のようにサーバ用のexeを起動しておくだけでOKです。(デフォルトだとポート12865が使われます)
>netserver-2.1pl1.exe
Starting netserver at port 12865
TCPのスループットを計測する場合は、クライアントで下記のようにします。
>netperf-2.1pl1.exe -H 192.168.0.10
結果は下記のようになります。
TCP STREAM TEST to 192.168.0.10
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
8192 8192 8192 10.00 20.57
RecvSocketSizebytesというのが受信側のソケットバッファでしょうか。デフォルトは8KBのようです。
SendSocketSizebytesというのが送信側のソケットバッファでしょうか。デフォルトは8KBのようです。
SendMessagebytesが送信パケットサイズでしょうね。これもデフォルトは8KBのようです。
ElapsedTimesecsが測定秒数のようです。デフォルト10秒です。
結果が、Throughput 10^6bits/sec ですね。Mbpsで表現されるようです。今回だと、93Mbpsという結果になりました。
オプションは下記のようになっています。
Usage: netperf [global options] -- [test options]
Global options:
-a send,recv Set the local send,recv buffer alignment
-A send,recv Set the remote send,recv buffer alignment
-c [cpu_rate] Report local CPU usage
-C [cpu_rate] Report remote CPU usage
-d Increase debugging output
-f G|M|K|g|m|k Set the output units
-F fill_file Pre-fill buffers with data from fill_file
-h Display this text
-H name|ip Specify the target machine
-i max,min Specify the max and min number of iterations (15,1)
-I lvl[,intvl] Specify confidence level (95 or 99) (99)
and confidence interval in percentage (10)
-l testlen Specify test duration (>0 secs) (<0 bytes|trans)
-o send,recv Set the local send,recv buffer offsets
-O send,recv Set the remote send,recv buffer offset
-n numcpu Set the number of processors for CPU util
-p port Specify netserver port number
-P 0|1 Don't/Do display test headers
-t testname Specify test to perform
-v verbosity Specify the verbosity level
-W send,recv Set the number of send,recv buffers
グローバルオプションを指定し、テストオプションを指定するという感じですね。
テストオプションで、メッセージ長やソケットサイズが指定できます。
テストオプションは下記のような感じです。
TCP/UDP BSD Sockets Test Options:
-D [L][,R] Set TCP_NODELAY locally and/or remotely (TCP_*)
-h Display this text
-m bytes Set the send size (TCP_STREAM, UDP_STREAM)
-M bytes Set the recv size (TCP_STREAM, UDP_STREAM)
-p min[,max] Set the min/max port numbers for TCP_CRR, TCP_TRR
-r bytes Set request size (TCP_RR, UDP_RR)
-R bytes Set response size (TCP_RR, UDP_RR)
-s send[,recv] Set local socket send/recv buffer sizes
-S send[,recv] Set remote socket send/recv buffer sizes
例えば送信ソケットサイズ64KB,メッセージサイズ64KBとするには下記のようにします。
netperf-2.1pl1.exe -H 192.168.0.10 -- -m 64512 -s 64512
TCP STREAM TEST to 192.168.0.10
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
8192 64512 64512 10.00 93.00
UDPで測定するときは下記のようにします。
>netperf-2.1pl1.exe -H 192.168.0.10 -t UDP_STREAM -- -m 1024
結果は下記のようになります。
UDP UNIDIRECTIONAL SEND TEST to 192.168.0.10
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
64512 1024 10.00 111620 0 91.44
8192 10.00 85967 70.42
上段が送信、下段が受信側の結果のようです。
Messages Okay というのはどれくらいのメッセージを送信したかの数のようです。
送信時は 91Mbps も送信してるのに、受信時は 70Mbps になってますね。これはUDPのパケットが途中でロスしたからだと思われます。
ということで、実の実行スループットは下段の Throughput 10^6bits/sec になるようです。
LAN内だとあまりパケットロスしないですが、上記のテストのようにWAN(VPN)だとかなりUDPはパケットロスするのが分かります。
より詳しい使い方やオプションは下記参考サイトが役立ちます。
Netperf - TECHNERD::INIT:
Netperf でLANをチェック:
P2P@i 開発メモ: netperfを使った測定
netperfでネットワークパフォーマンスを測定
netperf の使い方 - takatan blog