この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、虎塚です。
今週クラスメソッド社内で性能テストツールのApacheBench をテーマにした勉強会を行うことになりました(勉強会というと固い感じですが、経験者から知見をいろいろ教えてもらおうという雑談会です)。
そこで、ApacheBenchをまったく使ったことがない方の予習用に、ごく基本的な情報をまとめておきましたので、公開します。
ApacheBenchのインストール方法
Apache HTTP Serverをインストールします。
sudo yum install httpd
または、apr-utilパッケージをインストールすれば、httpdをインストールしなくてもApacheBenchを利用できます。
sudo yum install apr-util
ApacheBenchの特徴
ApacheBenchは、Apache HTTP Serverに同梱されている性能テストツールです。コマンド名にちなんで、「ab」とも呼ばれています。
できること
ApacheBenchは、1回のコマンド実行で、単一かつ同一のURLに対するリクエストを、指定した分だけ生成します。そのため、Webサーバやアプリケーションサーバの性能テストに便利です。動的に生成されるページでも、URLが固定であれば適用できます。
また、keepaliveを有効にした実行(-k)や、Cookieを渡すリクエスト(-C 'Cookie名1=値;Cookie名2=値')、プロキシサーバ越しの利用、Basic認証を行うリクエストなども可能です。
できないこと
ApacheBenchは、単一のURLへのリクエストを生成するツールなので、シナリオベースでWebアプリケーションをテストすることには向いていません。
本番のWebアプリケーションでは、ユーザシナリオが複数存在します。たとえば、チケットサイトなら、検索、予約、予約確認、キャンセルなどを複数のユーザが同時に行います。つまり、複数のURIへのアクセスが同時に発生するわけですが、ApacheBenchではそれをシミュレートできません。
また、静的なWebサイトに単にアクセスしてレスポンスタイムを見たい、シングルページで構成されるアプリケーションのテストをしたい場合は、ApacheBenchが「単一かつ同一のURL」へのリクエストを生成することに注意が必要があります。ページにCSSやJavaScriptや画像が埋め込まれている場合、それらを読み込む時間を含めたレスポンスタイムを計測することはできないため、意図したテストができないかもしれません。
複数のApacheBenchを起動して実行したり、複数のネットワーク経路から実行したりすることで、上記のできないことをある程度まで補うことができますが、他のツールを使ったほうがよいでしょう。
ApacheBenchの使い方
基本的な使い方
abコマンドの基本的な使い方を説明します。
- nオプション: 生成するリクエスト数を指定します
- cオプション: 並列実行する数(コネクション数)を指定します
たとえば、「10ユーザがそれぞれ10回リクエストした場合」をシミュレートしたいときは、次のようなコマンドを発行します。
$ ab -n 100 -c 10 http://example.com/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking example.com (be patient).....done
Server Software: ECS
Server Hostname: example.com
Server Port: 80
Document Path: /
Document Length: 1270 bytes
Concurrency Level: 10
Time taken for tests: 2.291 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Total transferred: 161000 bytes
HTML transferred: 127000 bytes
Requests per second: 43.64 [#/sec] (mean)
Time per request: 229.138 [ms] (mean)
Time per request: 22.914 [ms] (mean, across all concurrent requests)
Transfer rate: 68.62 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 93 110 12.1 108 140
Processing: 94 111 12.2 109 141
Waiting: 94 111 12.2 109 141
Total: 187 222 24.3 217 281
Percentage of the requests served within a certain time (ms)
50% 217
66% 225
75% 240
80% 247
90% 253
95% 274
98% 281
99% 281
100% 281 (longest request)
上記は、実行結果の一例です。
実行結果の見方
特に重要な項目について説明します。どんなテストを実施した時でも、大抵確認する必要があります。
- Complete requests、Failed requests
- 完了したリクエストと失敗したリクエストの数を表示します。失敗したリクエストについては、理由の内訳(Connect, Receive, Length, Exceptions)が表示されますので、確認します。
- 失敗するリクエストが見られるときは、同時接続数の設定を見直します。また、動的に生成するページにアクセスしているときは、アプリケーションでページ生成系のエラーが出ていないか、ログを確認します。
- Requests per second
- 1秒間に処理したリクエスト数の平均値(ミリ秒)です。
- 性能テストを実施するときは、この値が目標値の範囲に収まっているかを確認します。
- Time per request
- 1リクエストの処理に要した時間の平均値(ミリ秒)です。
- Connection Times
- リクエストに要した時間(ミリ秒)の内訳です。Connect, Processing, Waitingの最小値、最大値、平均値と標準偏差、中央値を示します。
- Connect: 接続確立までにかかった時間です
- Waiting: 接続確立からクライアントがレスポンスを受け取るまでにかかった時間です。
- Processing: 対象サーバ側での処理時間です。アプリケーションで行う処理が複雑なときは、この値が大きくなる傾向があります
実行結果の出力方法
実行結果は、デフォルトで標準出力に表示されます。他に次のような出力方法があります。
CSV出力
eオプションでファイル名を指定して、CSV形式で出力します
ab -n 100 -c 10 -e result.csv http://example.com/
次のようなヘッダ付きのCSVが出力されます。テスト結果のデータをExcelなどに取り込んで、グラフを作成して分析する場合に便利です。
$ cat result.csv
Percentage served,Time in ms
0,187.099
1,187.168
2,187.222
3,187.322
4,187.359
[...]
HTML出力
wオプションをつけることで、HTMLを出力します。上記のeオプションと違い、ファイルにリダイレクトする必要があります。
ab -n 100 -c 10 -w http://example.com/ > result.html
wオプションを使ったデフォルトの状態では、次のようなHTMLが出力されます。(ここではChromeで表示しています)
また、wオプションとあわせて次のオプションも利用できます。
- xオプション: tableタグに属性追加
- yオプション: trタグに属性追加
- zオプション: tdタグに属性追加
x、y、zオプションを使うと、HTMLタグに属性を指定できます。stype属性でスタイルシートを使うことはできません。複数指定した場合は、最後の要素だけ適用されます。
ab -n 100 -c 10 -w -x border=1 -y align=left -z bgcolor=#ccc http://example.com/ > result.html
上記のコマンドでは、次のようなHTMLが出力されます。
tips
使用する上での雑多な話を少しご紹介します。
テスト対象と別のホストから負荷をかける
abはApacheに同梱されてはいますが、性能テストを実行する際には、測定対象のサーバの外部にあるホストからリモートで実行します。ローカルから実行すると、ApacheBench自体の動作が、測定対象マシンのCPUやメモリの使用に影響するためです。
また、テスト対象のシステムに応じて、インターネット環境やLAN環境などを経由したリクエストを生成することで、より本番に近い形態でのネットワーク接続をシミュレートすることができるでしょう。
レスポンスの長さが同一でないとき
ApacheBenchでは、レスポンスのlengthが異なるとリクエストが失敗したとみなされます。
実行結果を確認したときにリクエスト失敗の理由が「Length」だけの場合は、この可能性があります。本当にリクエスト失敗だったかどうか、Webサーバのログでレスポンスのステータスコードを確認します。
次のページの説明を読むと、現象についてわかりやすいかと思います。
複数URLに対してテストを実行したいとき
複数のURLに対して負荷を生成したい場合は、ApacheBench以外のツールを使用したほうがよいでしょう。または、次のような拡張の利用を試してみてもよいかもしれません。
- apachebench-for-multi-url - ApacheBench for Multi URL - Google Project Hosting
- ApacheBench (ab) patch to support variable request URLs
おわりに
というわけで、Apache Benchの概要を簡単にご紹介しました。社内勉強会当日の様子は、また機会があればレポートします。
それでは、また。