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

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

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

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

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

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

 まず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