ネットワークのベンチマーク・ツールを試す - nepim、LMbench、nuttcp

 ネットワークのベンチマークでは、伝送速度と遅延時間という2つの指標が特に関心の対象となる。サービスや製品の広告では、伝送速度の方が大きく取り上げられることが多いが、状況によっては遅延時間の方が重要な指標となる場合もある。この記事では、ネットワークのパフォーマンス測定に利用できる3つのツールを見ていくことにしよう。nepim(network pipemeter)、LMbench、nuttcpの3つだ。

 今回のテストでは、64ビットのFedora 9搭載マシンで各ツールをソースからビルドした。使用したバージョンは、nepimが0.51、LMbenchが3、nuttcpが5.5.5だ。

 また今回は、ギガビット・イーサネットのネットワーク・インタフェース・カード2枚をbonding構成翻訳記事)で組み合わせたネットワーク・リンクを使用した。だが、結果を見るとわかるように、何かがうまく機能していなかったようで、2ギガビットという理論上の伝送速度は達成できなかった。後述するnepimとnuttcpのベンチマークでは、サーバからの下りの通信の方が、上りの通信より速かった。これはネットワーク・インタフェースのbondingの効果かもしれない。

nepim

 nepimは、openSUSE 11には1クリック・インストール用のパッケージがあるが、FedoraやUbuntuのリポジトリにはない。また、liboopライブラリもインストールする必要があるが、こちらもopenSUSE用のパッケージはあってFedoraとUbuntu用はない。liboopはソースから「./configure; make; sudo make install」でインストールできる。

 nepimのビルドにはautotoolsは使わない。srcディレクトリに移動し、makeを実行してコンパイルする。私が試したところ、Makefileに定義を追加して、データ構造の定義の重複を回避してからコンパイルする必要があった。変更内容およびインストール方法は次に示すとおりだ(Makefileにはinstallターゲットはない)。

$ cd src
$ vi Makefile
...
ifeq ($(PLATFORM),Linux)
CFLAGS += -DHAVE_STDINT -DHAVE_SUSECONDS_T \
        -DHAVE_SIGHANDLER_T -DHAVE_IP_MREQN -DHAVE_IP_MREQ -DHAVE_INET6_S6_ADDR32 -DHAVE_GROUP_SOURCE_REQ
ifdef ENABLE_DLOPEN
LDFLAGS += -ldl
endif
endif
...
$ make
$ sudo install -m 555 nepim /usr/local/bin

 コマンドライン・オプションを指定せずにnepimを起動すると、サーバ・モードで立ち上がる。サーバ・モードのnepimは、システムの各インタフェースをリッスンし、UDPとTCP接続の両方を受け入れる。一方、-cオプションを指定してnepimを起動すると、クライアント・モードで立ち上がる。接続先のサーバをいくつか指定して、ネットワーク・リンクのベンチマークを開始できる。

 サーバ側でnepimを起動したときの動作の様子と、クライアントが接続してきたときの出力内容を次に示す。先頭が"6 cur"の行はベンチマークの実行中に出力される。最後の3つの行は、クライアントが切断したときに出力されるもので、両方向の通信速度の平均値、最小値、最大値(キロビット/秒単位)と、1秒あたりに送受信したパケット数が示されている。

$ nepim
nepim - network pipemeter - version 0.51
server: tcp_read=32768 tcp_write=32768 udp_read=4096 udp_write=4096
3: TCP socket listening on ::,1234
...
6: TCP incoming: ::ffff:192.168.10.200,38176
6: send=1 bit_rate=-1 pkt_rate=-1 interval=2 duration=10 delay=250000 ....
6: sweep write: floor=32768 ceil=32768
6: pmtud_mode=1 path_mtu=1500 mss=1448 tos=0 ttl=64 mcast_ttl=64 win_recv=87380 win_send=16384 sock_ka=1 nodelay=0

                 kbps_in   kbps_out    rcv/s    snd/s
  6 cur     8  273194.97  676940.88  2619.50  2583.00
  6 cur     6  235308.55  722075.62  2435.50  2754.50
  6 cur     4  223439.58  723386.38  2282.00  2759.50
  6 cur     2  255724.64  702152.69  2346.00  2678.50
  6 avg     0  246072.14  708041.75  2413.30  2701.10
  6 min     0  223439.58  676940.88  2282.00  2583.00
  6 max     0  273194.97  723386.38  2619.50  2759.50
write: errno=104: Connection reset by peer
write: connection lost on TCP socket 6
6: pmtud_mode=1 path_mtu=1500 mss=1448 tos=0 ttl=64 mcast_ttl=64 win_recv=603680 win_send=256360 sock_ka=1 nodelay=0

 デフォルトでは、クライアントがサーバに接続した後のトラフィックは、サーバからクライアントへという一方向のみに流れる。これはオプションで変更可能だ。-sオプションを使うと、クライアントからサーバへ通信が行われ、-dオプションを使うと、両方向で通信が行われる。上記のサーバに接続するクライアント側のセッションの例を次に示す。

$ nepim -c 192.168.10.200 -d
nepim - network pipemeter - version 0.51
client: tcp_read=32768 tcp_write=32768 write_floor=32768 write_ceil=32768 step=1
not a UNIX domain path: 192.168.10.200: errno=2: No such file or directory
...
3: TCP socket connected to 192.168.10.210,1234
3: sending: hello server_send=1 bit_rate=-1 pkt_rate=-1 stat_interval=2 ...
3: greetings sent to 192.168.10.210,1234
3: pmtud_mode=1 path_mtu=1500 mss=1448 tos=0 ttl=64 mcast_ttl=1 win_recv=87380 win_send=16384 sock_ka=1 nodelay=0

                 kbps_in   kbps_out    rcv/s    snd/s
  3 cur     8  675722.31  273269.25  2696.00  1086.00
  3 cur     6  719693.06  235371.25  3278.50   953.50
  3 cur     4  725370.31  223025.72  3067.50   898.50
  3 cur     2  700528.75  255723.53  2785.00  1019.00
  3 avg     0  706910.69  246072.14  2943.30   986.20
  3 min     0  675722.31  223025.72  2696.00   898.50
  3 max     0  725370.31  273269.25  3278.50  1086.00
3: pmtud_mode=1 path_mtu=1500 mss=1448 tos=0 ttl=64 mcast_ttl=1 win_recv=1688544 win_send=99000 sock_ka=1 nodelay=0
nepim: no event sink registered
nepim: done

 nepimサーバの起動時に「-U /tmp/nepim-socket」というオプションを指定すると、TCP/IPネットワークではなくローカル・ドメインのストリーム・ソケットを使って動作する。クライアント側では、-cオプションを使ってローカル・ソケットへのパスを指定し、このソケットに接続してベンチマークを行う。この方法は、ネットワーク・カードによる遅延がない状態でnepimがどの程度の速さで通信できるかを調べたい場合に便利だ。

 次に示すのは、IntelのクアッドコアCPU「Q6600」搭載機のローカル・ドメイン・ソケットでnepimを動作した結果だ。両方向とも約7ギガビットを処理できるという結果になった。このテストの実行中、CPUの使用率は50%強で推移しており、nepimクライアントとサーバのそれぞれがCPUコア1つ分を使っていたことになる。

                 kbps_in   kbps_out    rcv/s    snd/s
  3 cur     8 7100432.50 7105806.50 27203.50 27106.50
  3 cur     6 7268335.50 7266631.50 27887.00 27720.00
  3 cur     4 7105020.00 7108296.50 27196.00 27116.00
  3 cur     2 7189823.50 7188644.00 27557.00 27422.50
  3 avg     0 7154958.50 7156819.50 27413.10 27301.10
  3 min     0 7100432.50 7105806.50 27196.00 27106.50
  3 max     0 7268335.50 7266631.50 27887.00 27720.00

 複数のセッションを同時に張るには、クライアントの起動時に-nオプションで接続数を指定する。ローカル・ソケットのテストで「-n 2」と指定してみたところ、各ストリームは4~4.5ギガビット/秒となり、伝送速度が向上したが、倍にはならなかった。

 nepimクライアントの起動時に-uオプションを指定すると、TCPではなくUDPで通信が行われる。UDPの場合、次に示すように、紛失したパケット数もあわせて出力される。

$ nepim -c 192.168.10.200 -d -u
...
                          kbps_in   kbps_out    rcv/s    snd/s  loss   ooo LOST
  3   0   0  cur     8  595738.62  808632.31 18180.50 24677.50 .0495 .0262 1894
  3   0   0  cur     6  505872.38  868532.25 15438.00 26505.50 .0090 .0050 2174
  3   0   0  cur     4  585842.69  825393.12 17878.50 25189.00 .0177 .0097 2817
  3   0   0  cur     2  563150.88  872955.88 17186.00 26640.50 .0232 .0115 3633
  3   0   0  avg     0  546350.69  866831.56 16673.30 26453.60 .0389 .0190 6749
  3   0   0  min     0  505872.38  808632.31 15438.00 24677.50 .0090 .0050
  3   0   0  max     0  595738.62  872955.88 18180.50 26640.50 .0495 .0262

 nepimは、2つのマシン間の各方向の伝送速度を確認するのに便利だ。送信と受信、および双方向のスループットを調べられるため、1方向でのみ問題が生じているのかどうかを把握できる。また、UDPのテストでは紛失パケット数も示されるので、2台のホスト間にスイッチを配置したことでパケットの紛失が増えたかどうかを確認することも可能だ。

LMbench

 次はLMbenchを見ていこう。LMbenchには、ネットワーク、メモリ、ファイル・システムなど、システムのさまざまな構成要素のパフォーマンスを測定するためのベンチマーク・ツールが多数備わっている。この記事では、ネットワーク関連のベンチマークのみ見ていくことにしよう。

 LMbenchには、Ubuntu用のパッケージはあるが、FedoraやopenSUSE用はない。ビルドにはautotoolsは使わない。makeを実行して実行可能ファイルを作成したら、その場所から直接実行できる。ビルドの手順は次のとおりだ。

$ tar xzvf /.../lmbench3.tar.gz
$ cd ./lmbench*
$ make -k
$ cd ./bin/x86_64-linux-gnu
$ ls
bw_file_rd  lat_connect    lat_proc          lib_mem.o     loop_o
bw_mem      lat_ctx        lat_rpc           lib_sched.o   memsize
bw_mmap_rd  lat_fcntl      lat_select        lib_stats.o   mhz
bw_pipe     lat_fifo       lat_sem           lib_tcp.o     msleep
bw_tcp      lat_fs         lat_sig           lib_timing.o  par_mem
bw_unix     lat_http       lat_syscall       lib_udp.o     par_ops
disk        lat_mem_rd     lat_tcp           lib_unix.o    stream
enough      lat_mmap       lat_udp           line          timing_o
flushdisk   lat_ops        lat_unix          lmbench.a     tlb
getopt.o    lat_pagefault  lat_unix_connect  lmdd
hello       lat_pipe       lib_debug.o       lmhttp

 2つのホスト間でTCPの伝送速度を測定するには、サーバ側では「bw_tcp -s」、クライアント側では「bw_tcp servername 」のように起動する。クライアント側のセッションの例を次に示す。

$ ./bw_tcp 192.168.10.210
0.065536 88.32 MB/sec

 LMbenchに含まれている他のベンチマーク・ツールも、上記のbw_tcpと同様の使い方をするものが多い。つまり、サーバを起動するときには-sという引数だけを指定し、クライアントを起動するときにはサーバのホスト名かIPアドレスを引数で渡す。次に示すのは、TCPとUDPの遅延時間、およびネットワーク上でTCP/IP接続を完了するまでに要する時間を調べるテストの例だ。LMbenchのクライアントには、パフォーマンスに影響し得る設定値(ネットワークのキュー・サイズなど)を変えて試してみるためのオプションはほとんどない。

./lat_tcp 192.168.10.210
TCP latency using 192.168.10.210: 685.9002 microseconds
$ ./lat_udp 192.168.10.210
UDP latency using 192.168.10.210: 1378.2743 microseconds
$ ./lat_connect 192.168.10.210
TCP/IP connection cost to 192.168.10.210: 185.5484 microseconds

 LMbenchを使ったネットワーク・テストでは、指定できるオプションがほとんどないものの、現在のネットワークの伝送速度と遅延時間を簡単に測定できる。現在のNICのカーネル・モジュールのオプションを変更したり、NICを買い換えたりしたときには、遅延時間がどれだけ向上したかをLMbenchで簡単に調べることができる。

nuttcp

 最後はnuttcpを見てみよう。nuttcpにはさまざまなオプションが用意されている。バッファ長やnodelayのオプション、サービス・タイプのフィールドなどがあり、ネットワークのパフォーマンスに及ぼす影響を調べることができる。nuttcpでは、トータルの伝送速度と、直前1秒間の伝送速度を表示できる。

 nuttcpのパッケージは、Fedora 9のリポジトリにはあるが、openSUSEやUbuntuにはない。ビルドとインストールの手順は次のとおりだ。

tar xjvf nuttcp-5.5.5.tar.bz2
cd ./nuttcp*
cc -O3 -o nuttcp nuttcp-5.5.5.c
strip nuttcp
sudo install -m 555 nuttcp /usr/local/bin/

 サーバの起動では「nuttcp -S」と指定する。クライアントは起動時にさまざまなオプションを指定でき、コマンドラインの最後にサーバのホスト名を指定する。次に示す例では、テストの実行中に毎秒ごとの伝送速度を表示し(-i1オプションで指定)、10秒経ったら終了する。

$ nuttcp  -v -v -i1  192.168.10.210
nuttcp-t: v5.5.5: socket
nuttcp-t: buflen=65536, nstream=1, port=5001 tcp -> 192.168.10.210
nuttcp-t: time limit = 10.00 seconds
nuttcp-t: connect to 192.168.10.210 with mss=1448
nuttcp-t: send window size = 8192, receive window size = 43690
nuttcp-r: v5.5.5: socket
nuttcp-r: buflen=65536, nstream=1, port=5001 tcp

nuttcp-r: interval reporting every 1.00 second
nuttcp-r: accept from 192.168.0.200
nuttcp-r: send window size = 8192, receive window size = 43690
   85.3719 MB /   1.00 sec =  715.9765 Mbps
   86.3684 MB /   1.00 sec =  724.5411 Mbps
   85.9188 MB /   1.00 sec =  720.7551 Mbps
   84.4201 MB /   1.00 sec =  708.2533 Mbps
   87.7772 MB /   1.00 sec =  736.2222 Mbps
   86.7372 MB /   1.00 sec =  727.5696 Mbps
   91.4327 MB /   1.00 sec =  767.0191 Mbps
   89.4166 MB /   1.00 sec =  750.2228 Mbps
   85.4859 MB /   1.00 sec =  717.0937 Mbps
   87.0377 MB /   1.00 sec =  729.9696 Mbps
nuttcp-t: 870.1633 MB in 10.00 real seconds = 89091.75 KB/sec = 729.8396 Mbps
nuttcp-t: 13923 I/O calls, msec/call = 0.74, calls/sec = 1392.10
nuttcp-t: 0.0user 22.3sys 0:10real 224% 0i+0d 0maxrss 0+3pf 16198+1383csw

nuttcp-r: 870.1633 MB in 10.00 real seconds = 89083.52 KB/sec = 729.7722 Mbps
nuttcp-r: 55254 I/O calls, msec/call = 0.19, calls/sec = 5524.09
nuttcp-r: 0.0user 6.7sys 0:10real 67% 0i+0d 0maxrss 0+20pf 62619+635csw

 複数の通信を同時に実行することもできる。たとえば、-N3オプションを指定すると、3つの接続が開始される。-Bオプションを指定すると、クライアントはトラフィックの受信のみを行い、-Dオプションでは送信のみを行う。デフォルトでは両方向の通信を行う。

$ nuttcp  -v -v -N3 -B  192.168.10.210
nuttcp-t: v5.5.5: socket
nuttcp-t: buflen=65536, nstream=3, port=5001 tcp -> 192.168.10.210
nuttcp-t: time limit = 10.00 seconds
nuttcp-t: connect to 192.168.10.210 with mss=1448
nuttcp-t: send window size = 8192, receive window size = 43690
nuttcp-t: 1239.8698 MB in 10.00 real seconds = 126944.75 KB/sec = 1039.9314 Mbps
nuttcp-t: 19838 I/O calls, msec/call = 0.52, calls/sec = 1983.52
nuttcp-t: 0.0user 41.2sys 0:10real 413% 0i+0d 0maxrss 0+3pf 4758+3081csw

nuttcp-r: v5.5.5: socket
nuttcp-r: buflen=65536, nstream=3, port=5001 tcp
nuttcp-r: accept from 192.168.0.200
nuttcp-r: send window size = 8192, receive window size = 43690
nuttcp-r: 1239.8698 MB in 10.00 real seconds = 126934.93 KB/sec = 1039.8509 Mbps
nuttcp-r: 29899 I/O calls, msec/call = 0.34, calls/sec = 2989.25
nuttcp-r: 0.0user 8.5sys 0:10real 86% 0i+0d 0maxrss 0+18pf 12519+1847csw

$ nuttcp  -v -v -N3 -D  192.168.10.210
...
nuttcp-r: v5.5.5: socket
nuttcp-r: buflen=65536, nstream=3, port=5001 tcp
nuttcp-r: accept from 192.168.0.200
nuttcp-r: send window size = 8192, receive window size = 43690
nuttcp-r: 806.2317 MB in 10.00 real seconds = 82545.65 KB/sec = 676.2140 Mbps
nuttcp-r: 67104 I/O calls, msec/call = 0.15, calls/sec = 6709.39
nuttcp-r: 0.0user 5.7sys 0:10real 57% 0i+0d 0maxrss 0+18pf 73018+378csw

 nuttcpには、nepimと同様のさまざまなオプションがあり、ホスト間のネットワーク伝送速度の測定に役立つ機能が豊富に備わっている。nuttcpで-i1オプションを指定すると、nepimのデフォルトの動作と同様に、稼動中の毎秒ごとの伝送速度の情報が表示される。nuttcpのmanページには、サービス・タイプやバッファ・サイズをnuttcpの起動時に明示的に設定するための多数のオプションが説明されている。こうしたオプションを使うことで、自分のハードウェアやドライバが特定の設定値でうまく動作するかどうかを確認できる。「nepim --help」と指定すると、バッファ、ウィンドウ・サイズ、TCPオプションなどを設定できるさまざまなオプションが表示される。

 nuttcpとnepimのどちらを使うかは、各自の都合で判断すればよいだろう。nepimにはopenSUSE用のパッケージがあり、nuttcpにはFedora用のパッケージがあるので、自分が使用しているディストリビューションに応じてどちらかを選ぶことになるかもしれない。

 nepimとnuttcpには、ネットワーク・パケットのキュー・サイズを設定するためのオプションや、TCPの最大セグメント・サイズの設定などを行う高度なオプションも用意されており、通信の両側でソフトウェアの設定を変更してネットワーク・パフォーマンスを向上させることができる。一方、LMbenchでは、すばやくテストを実行でき、ネットワーク・リンクの伝送速度や遅延時間についての有用な情報を簡単に得ることができる。

Ben Martinは、ここ10年以上ファイルシステムに取り組んできた。博士号を取得し、現在はlibferris、各種ファイルシステム、検索ソリューションを中心にコンサルティングサービスを手がけている。

Linux.com 原文