ネットワーク/ストレージの処理能力をチェックするためのベンチマークツール

サーバー上でさまざまなサービスを構築する前に、そのサーバーの処理能力を把握しておくことは重要だ。特にネットワークの帯域やストレージの速度といったリソースはサービスの品質に大きく関わってくる。そこで、今回はこれらの性能を調査するためのベンチマークツールやその使い方を紹介する。

ネットワークの性能を調査するベンチマークツール

まずはネットワーク関連の性能を調査するベンチマークについて紹介しよう。ネットワークの性能といっても、その指標は次のように複数ある。

  • スループット(速度、帯域幅)
  • レイテンシ(遅延)
  • パケットロス(損失パケット)

まず1つめは、スループット(ネットワークの速度)だ。帯域幅などとも呼ばれるが、ネットワークの性能としてもっとも重視されるのはこれだろう。ネットワークの速度が早ければそれだけ多くの情報をやり取りできるし、またより多くの接続に対して迅速に反応できるようになる。通常スループットは毎秒あたりやり取りできるビット数(bps)もしくはバイト数(B/秒、B/s)で示される。

2つめは、「レイテンシ」「遅延」などと呼ばれるものだ。広義にはネットワークの片端から送信されたパケットがもう片端に到達するまでにかかる時間を意味するが、通常はパケットを送信してからその到達確認パケットを受信するまでの時間(Round Trip Time、RTT)で計測されることが多い。レイテンシが大きい場合、アプリケーションの反応が遅くなったり、ネットワーク帯域を十分に生かせなくなる可能性がある。なお、レイテンシはその通信経路およびその間の機器によって変動することがあり、そのブレは「ジッタ」と呼ばれる。

3つめは、損失パケット(パケットロス)の発生率だ。損失パケットというのは、送信したパケットのうち途中で消失して相手に届かなかったパケットの割合を示すものだ。現在の有線ネットワークでは通常あまり発生しないが、無線ネットワークの場合はそれなりに発生する。

ネットワーク関連の計測ツールはいくつかあるが、ツールによってはこれら指標の一部しか計測できない場合もある。その場合、目的に応じて複数のツールを組み合わせて利用することになる。

nuttcp

nuttcpは、ネットワークの帯域幅を測定するツールだ。クライアント/サーバー型のアーキテクチャを採用しており、測定したいネットワークの両端にあるマシンにnuttcpをインストールする必要がある。

nuttcpのソースコードなどはhttp://www.lcp.nrl.navy.mil/nuttcp/という公開HTTP/FTPサイトで公開されている。2013年8月現在の最新版はバージョン6.1.2だ。RPMファイルやコンパイル済みバイナリも提供されているが、DebianなどのLinuxディストリビューションではディストリビューションの公式リポジトリからも入手可能だ。ただし、CentOS 6系に対応したRPMファイルやバイナリは用意されていないため、CentOS 6系の環境で利用するためにはソースからビルドする必要がある。

nuttcpをソースからビルドするには、HTTP/FTPサイトで公開されているソースアーカイブをダウンロードし、「make nuttcp」コマンドを実行すれば良い。

$ wget http://www.lcp.nrl.navy.mil/nuttcp/nuttcp-6.1.2.tar.bz2
$ tar xvjf nuttcp-6.1.2.tar.bz2
$ cd nuttcp-6.1.2
$ make nuttcp

makeコマンドを実行すると、「nuttcp」という実行ファイルが作成される。これがnuttcpの本体となり、そのまま実行が可能だ。なお、Makefile内にはinstallターゲットが用意されていない(「make install」コマンドではインストールが行えない)ので、必要に応じて手動で/usr/local/bin以下などにコピーすると良いだろう。

nuttcpでネットワークのスループットを測定するには、まずネットワークの片端にあるマシン上で「-S」オプション付きでnuttcpを実行し、サーバーを起動させる。

$ nuttcp -S

nuttcpは「-S」オプション付きで実行されると、自動的にバックグラウンドでサーバーを起動させて終了する。起動しているnuttcpを終了させるには、psコマンドでプロセスIDを調べた上でkillコマンドを実行する必要がある。

$ ps aux | grep nuttcp
root 15370 0.0 0.0 6256 284 ? Ss 19:50 0:00 ./nuttcp-6.1.2 -S
root 15374 0.0 0.0 107456 924 pts/0 S+ 19:50 0:00 grep nuttcp
# kill 15370

なお、nuttcpは制御用ポートとして5000番を、測定用データの送受信に5001~5003番ポートを使用する。これらのポートに対する受信を許可するようファイアウォールの設定を確認しておこう。

続いて、ネットワークのもう片端にあるマシン上でnuttcpを実行する。接続先サーバーはnuttcpの引数で指定する。たとえばexample.comというホスト上でnuttcpサーバーが動作している場合、次のようになる。

$ nuttcp example.com
24.9657 MB / 10.38 sec = 20.1791 Mbps 0 %TX 22 %RX 0 retrans 123.37 msRTT

この場合、10.38秒で24.9657MBのデータを送信でき、その通信速度は20.1791Mbpsという結果となっている。また、「%TX」および「%RX」は送信側および受信側のCPU利用率を、「retrans」はパケットの再送回数を、「msRTT」はRTTを示している。この例の場合、送信側(クライアント)および受信側(サーバー)のCPU利用率は0%および22%、パケットの再送回数は0回、RTTは123.37ミリ秒という結果となっている。

nuttcpのデフォルト設定ではクライアント側がパケットの送信元となるが、「-r」オプションを付けて実行することでサーバー側をパケットの送信元にすることもできる。この場合、クライアント側では5001~5003番ポートに対し外部からのパケット受信が行えるようになっている必要がある。

$ nuttcp -r example.com
81.2316 MB / 10.29 sec = 66.2226 Mbps 24 %TX 5 %RX 0 retrans 127.96 msRTT

また、nuttcpのデフォルト設定ではTCPを使って測定を行うが、「-u」オプションを指定するとUDPでの測定を行える。たとえば次の実行例からは、UDPでのスループットは約1Mbpsで、送信した1221パケットがすべて相手側に到達している、ということが分かる。

$ ./nuttcp-6.1.2 -u example.com
1.1924 MB / 10.00 sec = 1.0001 Mbps 99 %TX 0 %RX 0 / 1221 drop/pkt 0.00 %loss

より詳細な情報を確認したい場合は、「-v」オプションを使用する。「nuttcp-t」と表示されているのが送信側、「nuttcp-r」と表示されているのが受信側の情報だ。

$ ./nuttcp-6.1.2 -v example.com
nuttcp-t: v6.1.2: socket
nuttcp-t: buflen=65536, nstream=1, port=5001 tcp -> example.com
nuttcp-t: time limit = 10.00 seconds
nuttcp-t: connect to **.***.***.*** with mss=1402, RTT=30.309 ms
nuttcp-t: send window size = 23260, receive window size = 87380
nuttcp-t: available send window = 17445, available receive window = 65535
nuttcp-t: 61.2077 MB in 10.00 real seconds = 6267.66 KB/sec = 51.3447 Mbps
nuttcp-t: retrans = 0
nuttcp-t: 980 I/O calls, msec/call = 10.45, calls/sec = 98.00
nuttcp-t: 0.0user 0.1sys 0:10real 1% 0i+0d 528maxrss 0+1pf 643+125csw

nuttcp-r: v6.1.2: socket
nuttcp-r: buflen=65536, nstream=1, port=5001 tcp
nuttcp-r: accept from ***.***.***.**
nuttcp-r: send window size = 23260, receive window size = 87380
nuttcp-r: available send window = 17445, available receive window = 65535
nuttcp-r: 61.2077 MB in 10.03 real seconds = 6251.06 KB/sec = 51.2087 Mbps
nuttcp-r: 1883 I/O calls, msec/call = 5.45, calls/sec = 187.80
nuttcp-r: 0.0user 8.3sys 0:10real 82% 0i+0d 316maxrss 0+18pf 898+24csw

「-i<数字>」オプションを指定すると、指定した秒数間隔で途中経過を表示できる。たとえば次の例は、1秒間隔で途中経過を表示するものだ。

$ ./nuttcp-6.1.2 -v -i1 example.com
nuttcp-t: v6.1.2: socket
nuttcp-t: buflen=65536, nstream=1, port=5001 tcp -> example.com
nuttcp-t: time limit = 10.00 seconds
nuttcp-t: connect to **.***.***.*** with mss=1402, RTT=16.034 ms
nuttcp-t: send window size = 23260, receive window size = 87380
nuttcp-t: available send window = 17445, available receive window = 65535
nuttcp-r: v6.1.2: socket
nuttcp-r: buflen=65536, nstream=1, port=5001 tcp
nuttcp-r: interval reporting every 1.00 second
nuttcp-r: accept from ***.***.***.**
nuttcp-r: send window size = 23260, receive window size = 87380
nuttcp-r: available send window = 17445, available receive window = 65535
5.1250 MB / 1.00 sec = 42.9816 Mbps 0 retrans
7.6875 MB / 1.00 sec = 64.4219 Mbps 0 retrans
7.5000 MB / 1.00 sec = 62.9822 Mbps 0 retrans
7.2500 MB / 1.00 sec = 60.8110 Mbps 0 retrans
8.0000 MB / 1.00 sec = 67.1236 Mbps 0 retrans
8.0625 MB / 1.00 sec = 67.5468 Mbps 0 retrans
7.1250 MB / 1.00 sec = 59.7548 Mbps 0 retrans
6.7500 MB / 1.00 sec = 56.6407 Mbps 0 retrans
7.3750 MB / 1.00 sec = 61.9271 Mbps 0 retrans
8.0625 MB / 1.00 sec = 67.6179 Mbps 0 retrans
nuttcp-t: 73.0000 MB in 10.00 real seconds = 7475.19 KB/sec = 61.2367 Mbps
nuttcp-t: retrans = 0
nuttcp-t: 1168 I/O calls, msec/call = 8.77, calls/sec = 116.80
nuttcp-t: 0.0user 0.1sys 0:10real 1% 0i+0d 538maxrss 0+1pf 1258+119csw

nuttcp-r: 73.0000 MB in 10.03 real seconds = 7455.25 KB/sec = 61.0734 Mbps
nuttcp-r: 8688 I/O calls, msec/call = 1.18, calls/sec = 866.48
nuttcp-r: 0.0user 6.2sys 0:10real 62% 0i+0d 332maxrss 0+20pf 7511+19csw

Network Diagnostic Tool(NDT)

nuttcpは非常に多機能なツールであり、ほぼこのツールだけでネットワーク関連の測定は完結するのだが、ネットワークの両端のマシンでnuttcpを実行する必要があるという制限がある。そのため、何らかの事情でネットワークの片側でしかツールを実行できない、もしくは片側のネットワーク帯域が低い、といった場合は利用しにくい。このような場合に回線速度を簡易的にチェックできるのが「Network Diagnostic Tool(NDT)」というツールだ。

NDTは「Internet2」というネットワーキングコンソーシアムが開発しているネットワーク関連の診断・調査ツールの1つだ。NDTではnuttcpと同様、クライアント/サーバー型で診断を行うのだが、NDTサーバーは世界中で公開されており、バックボーンとして高速なネットワークを使用しているものもある。

NDTクライアントはWebブラウザ上から実行できるJavaアプレット版やAndroid版、そしてコマンドライン版が用意されている(図1)。

図1 Javaアプレット版のNDTクライアント
図1 Javaアプレット版のNDTクライアント

 そのうち、サーバーで利用しやすいのはクライアント版だろう。ソースコードはGoogle Codeのndtプロジェクトで公開されているが、バイナリなどは用意されていないので自分でビルドを行う必要がある。その場合、プロジェクトで公開されているtar.gz形式のソースアーカイブには単体ではクライアントのみのビルドができないという不具合が残っているので、以下のようにしてSubversion(svnコマンド)を使ってソースコードリポジトリから最新版をダウンロードする必要がある。

$ svn checkout http://ndt.googlecode.com/svn/trunk/ ndt

これで、ndtディレクトリに最新のソースコードが格納される。ただし、このソースコードには依存するI2utilライブラリが含まれていない。このライブラリはアップストリームでの配布が終了しているようなので、以下のようにしてGoogle Codeで公開されているndtのソースアーカイブ内に含まれているものをコピーして利用する。

$ wget https://ndt.googlecode.com/files/ndt-3.6.5.1.tar.gz
$ tar xvzf ndt-3.6.5.1.tar.gz
$ cd ndt
$ cp -r ../ndt-3.6.5.1/I2util .

そのほか、zlibのヘッダーファイル(「zlib-devel」など)や「automake」、「autoconf」といったパッケージも必要だ。これらも適切にインストールしておこう。必要なライブラリなどがそろったら、次のようにしてビルドを実行できる。

$ ./bootstrap
$ ./configure
$ make

ビルドが完了すると、srcディレクトリ内に「web100clt」という実行ファイルが作成される。これがndtのクライアントとなる。「--help」オプションを付けて実行するとコマンドラインオプション一覧が表示されるので、チェックしておこう。

$ cd src
./web100clt --help

web100cltコマンドでテストを実行するには、「-n」オプションに続けてNDTサーバーを指定する。NDTサーバーはNDTのWebサイトに一覧が掲載されているほか、perfSONARというWebページからも検索できる(図2)。

図2 perfSONARページからNDTサーバーを検索する
図2 perfSONARページからNDTサーバーを検索する

また、それ以外にもNDTサーバーを公開しているところがある。たとえば国内ではAPAN(アジア太平洋先端ネットワーク)の日本支部であるAPAN-JPや、東京大学 素粒子物理国際研究センター (ICEPP)などがサーバーを公開している。

たとえば、APAN-JPのNDTサーバーである「nms1.jp.apan.net」を利用してスループットを測定するには、次のようにする。

$ ./web100clt -n nms1.jp.apan.net
Testing network path for configuration and performance problems -- Using IPv4 address
Checking for Middleboxes . . . . . . . . . . . . . . . . . . Done
checking for firewalls . . . . . . . . . . . . . . . . . . . Done
running 10s outbound test (client to server) . . . . . 73.17 Mb/s
running 10s inbound test (server to client) . . . . . . 72.70 Mb/s
sending meta information to server . . . . . Done
The slowest link in the end-to-end path is a a 622 Mbps OC-12 subnet
Information: Other network traffic is congesting the link
Server 'nms1.jp.apan.net' is not behind a firewall. [Connection to the ephemeral port was successful]
Client is probably behind a firewall. [Connection to the ephemeral port failed]
Information: Network Middlebox is modifying MSS variable (changed to 1414)
Server IP addresses are preserved End-to-End
Information: Network Address Translation (NAT) box is modifying the Client's IP address
Server says [***.***.***.**] but Client says [ ***.**.*.**]

この例では、クライアントからサーバーの速度は73.17Mb/秒、サーバーからクライアントの速度は72.70Mb/秒であることが分かる。なお、公開されているNDTサーバーは研究用として提供されているため、サーバーが停止していたり、また廃止される場合などもあるため注意したい。バックボーンネットワークもサーバーによって異なるので、実行する時間帯などによって結果が変動する可能性もある。あくまで参考程度として利用して欲しい。

pingコマンドでレイテンシとパケットロスを測定する

ネットワークの状況を調べるツールとして、もっとも有名と思われるpingコマンドについても簡単に説明しておこう。pingコマンドでは「ICMP(Internet Control Message Protocol)」と呼ばれるプロトコルで定義されている「ECHO Request」パケットを送信し、このパケットを受信した端末が送信元に対し「Echo Reply」パケットを送信する、という動作で送信元から送信先までのネットワークが正しく接続されているかを確認する。このとき、pingコマンドの実行結果にはパケットが相手に到達しているかといった情報だけでなくレイテンシも表示される。

たとえば、以下の例はexample.comに対しpingコマンドを実行した例だ。ここで、「time=」に続いて表示されているのがレイテンシ(RTT)となる。この例の場合、パケットを送信してからその反応が返ってくるまでおおむね113ミリ秒(約0.1秒)程度の時間がかかっていることになる。また、5回パケットを送信して5回ともその返答を受信しており、パケットロスは0%であることが分かる。

$ ping example.com
PING example.com (192.0.2.1) 56(84) bytes of data.
64 bytes from example.com (192.0.2.1): icmp_req=1 ttl=52 time=113 ms
64 bytes from example.com (192.0.2.1): icmp_req=2 ttl=52 time=113 ms
64 bytes from example.com (192.0.2.1): icmp_req=3 ttl=52 time=113 ms
64 bytes from example.com (192.0.2.1): icmp_req=4 ttl=52 time=113 ms
64 bytes from example.com (192.0.2.1): icmp_req=5 ttl=52 time=113 ms
^C
--- example.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 113.123/113.342/113.741/0.253 ms

>>次ページ:ストレージの性能を調査するベンチマークツール

おしらせ

banner_vps