ABテスト (WEBサイト負荷テスト)

WEBサーバーの負荷テストだったらApacheにデフォルトでついているabコマンドを使うのが最もいい感じです。例えばですが100人の同時アクセスを30回、指定のファイルに対して行うということができます。おそらくこの時代なのでもっとすごい負荷測定のWEBアプリみたいなものがあるんでしょうけど、とりあえずエンジニアの方々はこれで充分過ぎます。

abコマンドの使い方

500人の同時アクセスを5000回行う

# ab -k -c 500 -n 5000 http://www.example.com/index.html

Basic認証がかかっている場合
user: loginuser
pass: xxxxx

# ab -k -c 500 -n 5000 -A loginuser:xxxxx http://www.example.com/index.html

解析結果はそうそう難しいものでもないので上から順番に見ていけば問題ないですが、取り急ぎマーキング部分だけ見ればおよそ見当がつきます。負荷を徐々にあげてゆきながら、リクエストに応えられた数(Complete requests)とリクエストに応えられなかった数(Failed requests)を見てゆけばいいです。徐々にFailed requestsが多くなってきたところがだいたいのしきい値ということになり、処理能力の限界ということになります。アクセス先のファイルサイズも注視しながらシュミレートします。というのは実際のリクエストは画像ファイルやインクルードファイルなど様々なリクエストが同時に行われるのでそれらを考慮しないといけないからです。またこのコマンドはlocalhostでも可能ですが、できればリモートホストからやってみたいものです。ですが、しかし、レンタルサーバーなどではテストには十分注意しましょう。共有帯域の場合、現在稼働しているその他のサーバーアクセスに影響してしまうので、レンタルサーバー屋さんから怒らるかもしれません。

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 localhost (be patient)
Completed 500 requests
Completed 1000 requests
Completed 1500 requests
Completed 2000 requests
Completed 2500 requests
Completed 3000 requests
Completed 3500 requests
Completed 4000 requests
Completed 4500 requests
Completed 5000 requests
Finished 5000 requests
Server Software: Apache/2.2.15
Server Hostname: localhost
Server Port: 80
Document Path: /www.example.com/
Document Length: 288 bytes アクセスしたファイルのサイズ
Concurrency Level: 500
Time taken for tests: 1.440 seconds
Complete requests: 5000 リクエストに応えた数
Failed requests: 0 負荷が高すぎて取りこぼしちゃったリクエスの数
Write errors: 0
Non-2xx responses: 5009
Keep-Alive requests: 0
Total transferred: 2344212 bytes
HTML transferred: 1442592 bytes
Requests per second: 3471.34 [#/sec] (mean)
Time per request: 144.037 [ms] (mean)
Time per request: 0.288 [ms] (mean, across all concurrent requests) 1秒あたりに処理された所要時間
Transfer rate: 1589.37 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 23 140.0 2 1003
Processing: 2 60 220.8 22 1424
Waiting: 2 59 220.8 21 1423
Total: 16 83 259.5 25 1439
Percentage of the requests served within a certain time (ms)
50% 25
66% 25
75% 25
80% 26
90% 27
95% 239
98% 1423
99% 1430
100% 1439 (longest request) 処理時間の遷移(最終的に1439秒)

abコマンドオプション

オプション 意味
-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のヘルプを表示

ログインした状態で負荷テストをする

通常のABテストだとログインした状態で負荷をかけることができません。なので、Cookieの値を設定してログイン状態でアクセスすることができます。Cookieの値はデベロッパーツールなどで適当に取ってくるのがよいかと思います。

# ab -n 1 -c 1 -C "key1=abcdedf; key2=12456" http://example.com/

Cookieの値はベタ書きなので特にパスなどの設定をする必要はなく、一度ブラウザーで普通にログインしてからデベロッパーツールなどでログイン後のCookieの値を取ってきてください。リアルなCookieの値だと、

AP=201503012112335000;
B=cqp4kb1af3dst&b=3&s=at;
SESSID=e47dfa1vrpokdd3apejqj2be30;
JSESSIONID=7DF1SS83D9788C79081C52937983AA0E;

こんな感じになるかと思うので、これらをセミコロンで切ってバーっと値にしてしまいます。実際に使うときにはこんな感じになる。これでログイン状態でアクセスできます。

ab -n 1 -c 1 -C "AP=201503012112335000;B=cqp4kb1af3dst&b=3&s=at;SESSID=e47dfa1vrpokdd3apejqj2be30;JSESSIONID=7DF1SS83D9788C79081C52937983AA0E" http://example.com/
Last update: 2016.11.15 (火)