ネットワークのベンチマーク・ツールを試す - nepim、LMbench、nuttcp
今回のテストでは、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、各種ファイルシステム、検索ソリューションを中心にコンサルティングサービスを手がけている。