Apache Benchでサクッと性能テスト

今日はWEBサーバの性能測定についてです!!

WEBサーバを構築していると、どこまでの負荷に耐えられるか、パフォーマンスはどうか気になりますよね。
これをしっかり確認しておかないと、アクセス過多になるとパフォーマンスが激悪になったり、
負荷がかかった時に、システムダウンなんてことになりかねないです。
で、そんなことにならないように気軽にWEBサーバの性能を測定できるのがApacheに標準で付いている**ab（Apache Bench）**ツール。

**Apache Benchは、DOS攻撃にも使えるツールです!!   使用する際は十分注意してください!!**

#Apache Benchとは
「ab」はApache Bench(アパッチ ベンチ)の略で、Apacheで標準に付いているWEBサーバの性能を計測するためのコマンドです。
Apacheをインストールすると、\<Apache Install Directory>\bin\に格納されていて、名前はwindowsだとab.exeになります。


#使い方
基本的には**-n**と**-c**オプションを使うことになります。
（逆に、これさえ覚えれば大体大丈夫!!）

**-n**には、Totalで発行するリクエスト数を指定。
**-c**には、同時接続数を指定。

コマンド形式はこちら。
> ab.exe -n \<Total発行リクエスト数> -c <同時接続数> \<URL>

主なオプションは、以下になります。
他にも沢山あるので、詳細は -h オプションで確認してみてください。

|オプション名|説明|
|-----------|------------|------------|
|-n 数値|リクエストの総数を数値で指定|
|-c 数値|同時に発行するリクエストの数を数値で指定|
|-t 数値|サーバからのレスポンスの待ち時間（秒）を数値で指定|
|-A ユーザー名:パスワード|	ベーシック認証が必要なコンテンツにテストする|
|-P ユーザー名:パスワード|	認証の必要なプロキシを通じてテストする|
|-X プロキシサーバ名:ポート番号|プロキシ経由でリクエストする場合に指定|
|-V|バージョンを表示|
|-h|ヘルプを表示|



#使ってみる
例えば、100ユーザが同時にhttp://www.example.co.jp/ に1リクエストを発行した場合を想定。

> ab -n 100 -c 100 http://www.example.co.jp/


同時に100ユーザが、1ユーザーあたり10リクエストを発行した場合を想定。
**-n**には100 x 10 = 1000を指定します。

> ab -n 1000 -c 100 http://www.example.co.jp/


接続先にベーシック認証がかかっている場合。
**-A**の後にベーシック認証ユーザとパスワードを:（コロン）で区切って指定します。

> ab -n 100 -c 100 -A hogeuser:hogepass http://www.example.co.jp/


同時接続数よりTotal発行リクエスト数が少ないとエラーメッセージが表示されます。
同時に100人で合計10リクエストを送るなんて、できないからですね。

> ab -n 10 -c 100 -A hogeuser:hogepass http://www.example.co.jp/
> ab: Cannot use concurrency level greater than total number of requests
> ...


#見かた
以下のコマンドを実行した時の結果サンプルです。URLはダミーですよ。
> ab -n 100 -c 100 http://www.example.co.jp/


*Server Software:        Apache/2.4.10*
*Server Hostname:        http://www.example.co.jp/*
*Server Port:            80*

*Document Path:          /*
*Document Length:        25559 bytes*

*Concurrency Level:      100*
*Time taken for tests:   8.374 seconds*
*Complete requests:      100*
*Failed requests:        0*
*Total transferred:      2599100 bytes*
*HTML transferred:       2555900 bytes*
*Requests per second:    11.94 [#/sec] (mean)*
*Time per request:       8374.479 [ms] (mean)*
*Time per request:       83.745 [ms] (mean, across all concurrent requests)*
*Transfer rate:          303.09 [Kbytes/sec] received*

*Connection Times (ms)*
      *min  mean[+/-sd] median   max*
*Connect:       10   16   4.1     15      42*
*Processing:  1382 4432 1913.3   4653    7255*
*Waiting:     1371 4334 1912.9   4395    7240*
*Total:       1398 4448 1913.6   4664    7271*

*Percentage of the requests served within a certain time (ms)*
*50%   4664*
*66%   5844*
*75%   6273*
*80%   6607*
*90%   6891*
*95%   7105*
*98%   7269*
*99%   7271*
*100%   7271 (longest request)*

こんな表示が出ます。。
何が何だかよくわからないと思うので、逆引きで説明します。

**・リクエストは全部正常に処理されたの？**
*Complete requests*が正常に処理したリクエスト数です。
*Failed requests*は、処理に失敗したリクエスト数です。
今回は100リクエストを発行して、*Complete requests*が100、*Failed requests*が0になっているので、
全てのリクエストが正常に処理されたことを表しています。めでたしめでたし。

**・何リクエストまで耐えられるの？**
> ab -n 100 -c 100

の、-n と -cの値をジョジョに増やしていってください。
そのうち、*Failed requests*が0ではなくなるので、そこがそのWEBサーバの負荷の限界です。。

**・秒間どれくらいのリクエストをさばけるの？**
*Requests per second*を見てみてください。
11.94とあるので、1秒あたり約12リクエストまでさばけることになります。
WEBサーバではこの数値がとても重要になるので、これだけでも覚えておくと良いでしょう。

**・パフォーマンスは？**
1リクエストあたりの処理時間を表しているのが*Time per request(mean, across all concurrent requests)*です。
今回は、83.745msかかったことになります。
あと、紛らわしいのですが、*Time per request(mean)*というのもあります。
これは、全リクエストの処理時間になります。


#さいごに
WEBサーバの性能を計測するツールとしては、以下もあるので状況に応じて使い分けてみてください。

・Apache JMeter
・httperf
・weighttp

**Apache Benchは、DOS攻撃にも使えるツールです。使用する際は十分注意してください。**