Apache Benchmak

## 概要
* apache付属のベンチマークソフト
* 指定したURLに対してリクエストを送り、接続時間・処理時間・待ち時間などの統計を取得できる

## 実行方法

```
$ ab -c 5 -n 10 http://localhost:3000/
```

## オプション一覧

| オプション | 意味 |
|------------|------|
| -n 数値 | テストのリクエスト数 |
| -c 数値 | 同時リクエスト数 |
| -t 数値 | テスト時間を指定 |
| -b 窓幅 | 送受信のバッファサイズ(byte) |
| -p ファイル名 | POSTで送信するファイルを指定 |
| -u ファイル名 | PUTで送信するファイルを指定 |
| -T コンテントタイプ | Content-Header |
| -v 数値 | 動作情報を表示 |
| -w | HTMLで結果を出力 |
| -i | GETの代わりにHEADを使用する |
| -x 属性 | HTML出力のtableタグに属性を追加(BORDERなど) |
| -y 属性 | HTML出力のtrタグに属性を追加 |
| -z 属性 | HTML出力のtdまたはthタグに属性を追加 |
| -C ‘Cookie名称=値’ | Cookie値を渡す |
| -H 属性 | ヘッダ行の追加 例) Accept-Encoding: gzip
| -A ユーザー名:パスワード | ベーシック認証時に指定 |
| -P ユーザー名:パスワード | プロキシ経由時かつ認証が必要な場合に指定 |
| -X プロキシサーバ名:ポート番号 | プロキシ経由時に指定 |
| -V | バージョンを表示 |
| -k | KeepAliveを有効化 |
| -d | 100分の1の位を表示 |
| -S | 信頼性の推定値と警告を表示 |
| -g ファイル名 | gnuplotのフォーマットで結果を出力 |
| -e ファイル名 | CSV形式で結果を出力 |
| -r | レスポンスでエラーを受け取っても終了しないようにする |
| -h | ヘルプを表示 |
| -Z ciphersuite | SSL/TLS cipherを指定する |
| -f プロトコル | SSL/TLSプロトコルを指定する (SSL3, TLS1 or ALL) |

## 結果の見方
| 項目 | 単位 | 内容 |
|------|------|------|
| Document Path	| - | アクセス先 |
| Document Length | - | アクアセス先ファイルサイズ |
| Concurrency Level | - | 同時送信リクエスト数 |
| Time taken for tests | s | テストに要した時間 |
| Complete requests | - | 成功したリクエスト数 |
| Failed requests | - | 失敗したリクエスト数 |
| Total transferred | byte | ファイルの総容量 |
| HTML transferred | byte | アクセスしたファイルの容量 |
| Requests per second | Requests/s | 1秒あたりのリクエスト数 |
| Time per request | ms | 1同時リクエストあたりに要した処理時間 |
| Time per request | ms | 1リクエストあたりに要した処理時間 |
| Transfer rate	| Kbytes/s | 1秒あたりに受信した転送レート容量 |
| Connection Times | ms | 接続時間、処理時間、待ち時間、それらの合計と最小値、平均値、最大値、平均 |
| Percentage of the requests served within a certain time | ms |処理時間の推移 |

## 使用例

* AWS ELBに向けてテスト
 * 同時接続数5, リクエスト数1000件, KeepAlive有効にしてテスト
 * レスポンスが301のためNon-2xx responsesが1000件となっている

```
$ ab -c 5 -n 1000 -k http://xxxxxx-715767357.ap-northeast-1.elb.amazonaws.com/
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking xxxxxx-715767357.ap-northeast-1.elb.amazonaws.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Completed 500 requests
Completed 600 requests
Completed 700 requests
Completed 800 requests
Completed 900 requests
Completed 1000 requests
Finished 1000 requests


Server Software:        Apache/2.2.23
Server Hostname:        xxxxxx-715767357.ap-northeast-1.elb.amazonaws.com
Server Port:            80

Document Path:          /
Document Length:        310 bytes

Concurrency Level:      5
Time taken for tests:   1.699 seconds
Complete requests:      1000
Failed requests:        0
Write errors:           0
Non-2xx responses:      1000
Keep-Alive requests:    1000
Total transferred:      577000 bytes
HTML transferred:       310000 bytes
Requests per second:    588.52 [#/sec] (mean)
Time per request:       8.496 [ms] (mean)
Time per request:       1.699 [ms] (mean, across all concurrent requests)
Transfer rate:          331.62 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       2
Processing:     3    8   7.8      6      39
Waiting:        3    8   7.8      6      39
Total:          3    8   7.8      6      39

Percentage of the requests served within a certain time (ms)
  50%      6
  66%      7
  75%      7
  80%      8
  90%     27
  95%     30
  98%     32
  99%     33
 100%     39 (longest request)
```

## 使用する際の注意事項
* abは単一かつ同一のファイルをリクエストすることしかできない
* 結果の分析のために、さまざまな方法でテストする
 * 複数台のコンピュータから、それぞれ別なファイルをリクエストする
 * 静的ページと動的ページ、両方をテストする
  * 静的ページでは、対象のファイルの容量による変化を観測する
  * 動的ページでは、サーバの処理の複雑度による変化を観測する
* 接続時間も含めて測定するため、対象サーバ外で実行する
 * 外的要因が入らないよう、サーバの近くで実行する
 * クライアントの性能に依存しないよう、できるだけ高性能のマシンで実行する
 * 複数の場所からテストを行う
* リクエスト数はサンプリング量であるため適度に大きくする
* 同時接続数の指定はサーバの最大値を超えないようにする
* -tオプションは指定した時間でテストを打ち切る。結果にはその間のものが出力される。

## 結果に対する注意事項
* Failed requestsが多い
 * サーバの性能が追いついていない
 * 動的ページ生成時に起こりやすく、同時接続数の限界を超えていると考えられる
* Requests per secondが大きいほど性能が高くなる
 * サーバの性能改善によりこの項目の数値がどれだけ改善するか（数値が大きくなるか）で評価を行える
* 接続時間・処理時間・待ち時間でリクエスト全体でのばらつきやリクエスト当たりの処理の内訳を検討する
* Transfer rateからネットワーク環境の実効速度よりも遅いようであれば、ネットワーク環境のチューニングも考慮する

## 参考
* http://www.atmarkit.co.jp/ait/articles/0206/29/news001.html
* サーバ構築の実際がわかるApach [実践] 運用/管理