ApacheBench(abコマンド)は、Apacheに標準で付属しているベンチマークソフトです。リクエスト数や同時接続数を実行時のオプションとして指定できるため、用途に応じた負荷を再現することができます。しかし、評価の対象になるWebコンテンツは単一URLでしか指定できません。実際のWebコンテンツは、画像やドキュメントなどの静的要素やCGI、SSIなどを使った動的要素などが混在しています。システム全体の性能評価を行うには、各URLを実際の使用頻度に即した割合で参照させるなどの細工が必要です。ApacheBenchでは、そうした複雑な計測は行えません。半面、インストール作業や複雑なシミュレーションシナリオを用意する必要がないなど、手軽に使えるというメリットがあります。
ApacheBenchは、以下のように実行します。
$ ab -n 1000 -c 10 http://192.168.0.10/
「-n 1000」「-c 10」がApacheBench実行時のオプションです。主なオプションは次のとおりです。
| オプション | 意味 |
|---|---|
| -n 数値 | テストで発行するリクエストの回数を数値で指定 |
| -c 数値 | テストで同時に発行するリクエストの数を数値で指定 |
| -t 数値 | サーバからのレスポンスの待ち時間(秒)を数値で指定 |
| -p ファイル名 | サーバへ送信するファイルがある場合に指定 |
| -T コンテンツタイプ | サーバへ送信するコンテンツヘッダを指定 |
| -v 数値 | 指定した数値に応じた動作情報を表示 |
| -w | 結果をHTMLで出力(出力をファイルに保存すればWebブラウザで表組みされたものが見られる) |
| -x 属性 | HTML出力のtableタグに属性を追加(BORDERなど) |
| -y 属性 | HTML出力のtrタグに属性を追加 |
| -z 属性 | HTML出力のtdまたはthタグに属性を追加 |
| -C 'Cookie名称=値' | Cookie値を渡してテストする |
| -A ユーザー名:パスワード | ベーシック認証が必要なコンテンツにテストする |
| -P ユーザー名:パスワード | 認証の必要なプロキシを通じてテストする |
| -X プロキシサーバ名:ポート番号 | プロキシ経由でリクエストする場合に指定 |
| -V | abのバージョン番号を表示 |
| -k | HTTP/1.1のKeepAliveを有効にしてテストする |
| -h | abのヘルプを表示 |
| 表 ApacheBenchのオプション | |
ApacheBenchを実行すると、結果が以下のように出力されます。
$ ab -n 1000 -c 10 http://192.168.0.10/
This is ApacheBench, Version 2.0.41-dev <$Revision: 1.121.2.12 $>
apache-2.0
Copyright (c) 1996 Adam Twiss, Zeus Technology Ltd,
http://www.zeustech.net/
Copyright (c) 1998-2002 The Apache Software Foundation, http://www.apache.org/
Benchmarking 192.168.0.10 (be patient)
Completed 100 requests
Completed 200 requests
(中略)
Completed 900 requests
Finished 1000 requests
Server Software: Apache/2.0.54
Server Hostname: 192.168.0.10
Server Port: 80
Document Path: /
Document Length: 1456 bytes
Concurrency Level: 10
Time taken for tests: 1.737294 seconds
Complete requests: 1000
Failed requests: 0
Write errors: 0
Total transferred: 1879000 bytes
HTML transferred: 1456000 bytes
Requests per second: 575.61 [#/sec] (mean)
Time per request: 17.373 [ms] (mean)
Time per request: 1.737 [ms] (mean, across all concurrent
requests)
Transfer rate: 1055.66 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.9 0 9
Processing: 2 16 5.2 16 51
Waiting: 1 16 4.9 15 46
Total: 2 16 5.2 16 51
Percentage of the requests served within a certain time (ms)
50% 16
66% 16
75% 16
80% 16
90% 18
95% 20
98% 43
99% 45
100% 51 (longest request)
上記のApacheBenchのレポートで「Failed requests」の値が「0」であることから、すべてのリクエストが問題なく処理されたことが分かります。もしこの値が0よりも大きい場合はリクエストの処理に失敗しているため、「Requests per second」や「Time per request」など、ほかの評価値の信ぴょう性が低くなります。「Failed requests」の発生は、同時接続数にサーバの処理能力が追い付いていないことが原因と考えられます。
「Non-2xx responses」が表示されるようなら、対象URLやドキュメントを正しく指定していない可能性があります。CGIなどの動的コンテンツを評価対象にしている場合は、アプリケーションが何らかの理由で200番台以外のレスポンスコードを返していることになります。これはサーバのパフォーマンス問題以前に、アプリケーションエラーを解決する必要があります。また、「Non-2xx responses」が大きくなると、ほかの評価値の信ぴょう性が低くなります。
「Requests per second」はパフォーマンスの尺度として利用します。この値が高くなるように、サーバの最適化を行います。
「Connection Times (ms)」を見ることで、1つの処理において接続時間、処理時間、待ち時間のどこに最も時間を要しているかを知ることができます。また、標準偏差からそれぞれの時間のバラつきが分かるため、処理ムラが起きている可能性を調べることができます。同時処理が多くなると処理ムラが発生する傾向にあります。
より実態に沿った値を調べたい場合は、複数のクライアントからApacheBenchを行う必要があります。例えば、あるクライアントは画像やHTMLファイルなどの静的コンテンツを、別のクライアントはCGIを対象にApacheBenchを実行するというテストを行います。CGIやアプリケーションで排他処理(注)を使用している場合も、複数のクライアントから排他処理を行っているCGIに対してApacheBenchを実行して、どのような結果が返ってくるかを見極める必要があります。サーバの処理能力以前に、アプリケーションの処理性能が試されることになりますが、最終的にはアプリケーションの処理性能も含めてWebシステムのフォーマンスになります。
注:1つのファイルやデータに同時書き込みを行い、ファイルの一意性が損なわれる事態を防ぐため、片方の処理が終わるまでもう一方が待機状態になること。
1つの処理に長い時間を要する場合は、ネットワーク的に遠い場所にあるクライアントと、近くてスループットが良好なクライアントなど、ネットワーク環境が異なるクライアントを用意して測定を行います。ネットワーク的に遠方にあるクライアントの処理に足を引っ張られ、ネットワーク的に近いクライアントの結果も悪くなるか否かなどの関連性を調べておきます。
このように、ApacheBenchでは1つのクライアントから1つのURLしか指定できないため、クライアントの同時接続の形態など、テストの組み合わせを考える必要があります。
なお、ApacheBenchを使って第三者のサイトへ勝手な接続試験を行ってはいけません。DoS攻撃と見なされ、接続制限を実施される可能性があります。最悪の場合、損害賠償を請求される事態に発展します。ちなみに、ApacheBenchを使ってアクセスすると、アクセスログには以下のようなログが記録されます。
192.168.X.X - - [18/Aug/2005:23:36:35 +0900] "GET / HTTP/1.0" 403 3931 "-" "ApacheBench/2.0.X-dev" 192.168.X.X - - [18/Aug/2005:23:36:35 +0900] "GET / HTTP/1.0" 403 3931 "-" "ApacheBench/2.0.X-dev" 192.168.X.X - - [18/Aug/2005:23:36:35 +0900] "GET / HTTP/1.0" 403 3931 "-" "ApacheBench/2.0.X-dev"
Copyright © ITmedia, Inc. All Rights Reserved.