node.jsのいろいろなモジュール42 – loadtestでApache ABライクな負荷テスト

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

nodeで負荷テストを実行する

Apacheは標準で「ab」(Apache Bench) というツールが付属しており、
同時接続数/リクエスト数/URLを指定することで簡単にWEBの性能を測定することができます。

今回紹介するloadtestは、abと同じように指定したURLへの負荷テストを実行します。
また、このloadtestはabと互換性があるよう設計されたオプションも持っています。
コマンドラインから実行することで負荷テストを実行できますし、nodeモジュールとしてAPIを使用して
テストをカスタマイズすることもできます。

ではloadtestモジュールをインストールして負荷テストを行ってみましょう。

環境構築方法

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.5
  • Node.js : v0.10.8
  • npm : 1.2.23

npmを使用してモジュールをグローバルインストールします。

% npm install -g loadtest

負荷テストを実行してみる

loadtestコマンドを実行すれば、負荷テストを実行できます。

% loadtest [-n requests] [-c concurrency] [URL]

URLはhttp/httpsからはじまるURLを指定することができます。 -nオプションはリクエスト数、-cオプションは並行処理数を設定します。

loadtestにはテストサーバが付属しているので、それで負荷テストをローカルで行ってみましょう。
下記のように8000番ポートを指定してテストサーバを起動します。

% testserver 8000

loadtestを実行してみます。リクエスト数は10でやってみましょう。

% loadtest -n 10 http://localhost:8000                                                                                                           [Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Requests: 0 (0%), requests per second: 0, mean latency: 0 ms
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Completed requests:  10
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Total time:          0.035559 s
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Requests per second: 281
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Mean latency:        3.23 ms
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO Percentage of the requests served within a certain time
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO   50%      1 ms
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO   90%      18 ms
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO   95%      18 ms
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO   99%      18 ms
[Fri Aug 30 2013 09:29:54 GMT+0900 (JST)] INFO  100%      18 ms (longest request)

リクエストした結果情報がコンソールに表示されます。

また、loadtestをモジュールとしてnodeプログラムから使用することも可能です。
テストサーバが起動した状態で下記プログラムを実行すると、loadtestコマンドを実行した時と同じように負荷テストが実行されます。

//app.js
var loadtest = require('loadtest');
var options = {
    url: 'http://localhost:8000',
    maxRequests: 10,
};
loadtest.loadTest(options, function(error, result)
{
    if (error)
    {
        return console.error('Got an error: %s', error);
    }
    console.log('Tests run successfully:',result);
});

% node app.js
Tests run successfully: { totalRequests: 10,
  totalErrors: ・・・,
  totalTimeSeconds: ・・・,
  rps: ・・・,
  meanLatencyMs: ・・・,
  percentiles: ・・・,
  errorCodes: {} 
}

まとめ

今回はloadtestモジュールの簡単な使用方法について紹介しました。
これ以外にもテスト時にクッキー情報を使用したり、秒ごとに送信するクライアントの数を制御したりできます。
Githubには実行オプション等の詳細情報もありますので、確認してみてください。

参考サイトなど