3流プログラマのメモ書き

元開発職→社内SE→派遣で営業支援の三流プログラマのIT技術メモ書き。 このメモが忘れっぽい自分とググってきた技術者の役に立ってくれれば幸いです。(jehupc.exblog.jpから移転中)

(ネットワーク)回線速度測定ツールNetPerfを使ってみた

(ネットワーク)回線速度測定ツール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