読者です 読者をやめる 読者になる 読者になる

abコマンドで負荷テスト

「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ユーザが同時に10リクエストを発行した場合を想定。
-nには100 x 1-0 = 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
Time per request: 8374.479 ms
Time per request: 83.745 ms
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攻撃にも使えるツールです。使用する際は十分注意してください。

参考リンク

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