ab コマンド (ApacheBench) の自分的チートシートをメモしておく。
ab コマンドのバージョン。
$ ab -V
This is ApacheBench, Version 2.3 <$Revision: 1901567 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, https://www.zeustech.net/
Licensed to The Apache Software Foundation, https://www.apache.org/
このエントリーを書いた動機
システムの性能を測定するときは k6 を使うことが多く、ApacheBench はほとんど使ったことがなかった。
しかしながら、雑にシステムに負荷をかけたり、非常にざっくりとした性能指標を見る程度であれば、ApacheBench で事足りることもあったりするし、なにより手軽に利用できるのがよいなー、と思った。
でも、めったに使わないとも思ったので、次に使うときに使い方をさっと調べられるように、備忘録代わりに書いた。
基本的な使い方
$ ab -c <並列数> -n <リクエスト数> <URL>
たとえば、次のコマンドでは、https://localhost:8080/ に対して10並列でリクエストを1000回送信する。
$ ab -c 10 -n 1000 https://localhost:8080/
リクエスト数を指定する
-n
オプションにて、リクエスト数を指定できる。
# リクエストを100回送信する
$ ab -n 100 https://localhost:8080/
# デフォルトは1回だけ送信する。次の2つのコマンドは、どちらもリクエストを1回だけ送信する
$ ab https://localhost:8080/
$ ab -n 1 https://localhost:8080/
並列数を指定する
-c
オプションにて、リクエストの並列数を指定できる。
# 10並列でリクエストを1000回送信する
$ ab -c 10 -n 1000 https://localhost:8080/
# デフォルトは1並列。次の2つのコマンドの並列数はどちらも1となる
$ ab https://localhost:8080/
$ ab -c 1 https://localhost:8080/
-t
オプションにて、ベンチマークの最大実行時間を秒単位で指定できる。
-t
オプションを指定した場合、所定の回数分のリクエストを送信するか、あるいは指定した時間が過ぎるとコマンドの実行が終了する。
なお、-n
オプションを指定していない場合は -n 50000
が指定されたものとして動作する。
# リクエストを10000回送信する
# 60秒が経過すると、リクエストの送信が完了していなくても終了する
$ ab -n 10000 -t 60 https://localhost:8080/
一定時間、負荷をかけ続ける
-n
オプションと -t
オプションを組み合わせて、一定時間、負荷をかけ続けることができる。
-n
オプションで非常に大きなリクエスト数を指定するのがポイント。
# 60秒間、100並列でリクエストを送信し続ける
# ただし、リクエストを 10000000 回送信したらコマンドの実行が完了してしまう
# その場合は -n オプションにもっと大きな値を指定するとよい
$ ab -c 100 -n 10000000 -t 60 https://localhost:8080/
HTTP ヘッダーを指定する
-H
オプションにて、HTTP ヘッダーを指定できる。
# Accept-Encoding を指定する
$ ab -H 'Accept-Encoding: gzip, deflate' https://localhost:8080/
# 複数の HTTP ヘッダーも指定できる
$ ab -H 'Accept-Encoding: gzip, deflate' -H 'Cache-Control: max-age=0' https://localhost:8080/
HTTP Keep-Alive を有効にする
-k
オプションを指定すると HTTP Keep-Alive を有効にできる。
# HTTP Keep-Alive を有効にする
$ ab -k https://localhost:8080/
# デフォルトは HTTP Keep-Alive は無効となる
$ ab https://localhost:8080/
出力のフォーマット
ab コマンドを実行すると次のように出力される。
$ ab -n 10 https://localhost:8080/
This is ApacheBench, Version 2.3 <$Revision: 1901567 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, https://www.zeustech.net/
Licensed to The Apache Software Foundation, https://www.apache.org/
Benchmarking localhost:8080 (be patient).....done
Server Software:
Server Hostname: localhost:8080
Server Port: 443
SSL/TLS Protocol: TLSv1.2,ECDHE-ECDSA-CHACHA20-POLY1305,384,256
Server Temp Key: ECDH X25519 253 bits
TLS Server Name: localhost:8080
Document Path: /
Document Length: 4 bytes
Concurrency Level: 1
Time taken for tests: 0.293 seconds
Complete requests: 10
Failed requests: 0
Total transferred: 248 bytes
HTML transferred: 4 bytes
Requests per second: 3.41 [#/sec] (mean)
Time per request: 293.165 [ms] (mean)
Time per request: 293.165 [ms] (mean, across all concurrent requests)
Transfer rate: 0.83 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 190 190 0.0 190 190
Processing: 103 103 0.0 103 103
Waiting: 102 102 0.0 102 102
Total: 293 293 0.0 293 293
Percentage of the requests served within a certain time (ms)
50% 231
66% 233
75% 234
80% 236
90% 258
95% 258
98% 258
99% 258
100% 258 (longest request)
この出力のうち、性能指標に関わる項目の意味は次のとおり。
項目 |
説明 |
Concurrency Level |
並列数 |
Time taken for tests |
テストにかかった時間 (秒) |
Complete requests |
成功したリクエスト数 |
Failed requests |
失敗したリクエスト数 |
Total transferred |
合計転送量 (バイト) |
HTML transferred |
HTML ドキュメントの転送量 (バイト) |
Requests per second |
1秒あたりの平均リクエスト数 |
Time per request |
1リクエストあたりの平均所要時間 (ミリ秒) |
Transfer rate |
転送速度 (KB/秒) |
Connection Times (ms)
の部分はリクエストの処理に要した時間の内訳。
項目ごとに左から、最小値、平均値、標準偏差、中央値、最大値となっている。
項目 |
説明 |
Connect |
クライアントがサーバーに接続するのにかかった時間 |
Processing |
リクエストが送信されてから、サーバーの応答が完了するまでの時間 |
Waiting |
リクエストが送信されてから、サーバーから最初のバイトが受信されるまでの時間 |
Percentage of the requests 〜
の部分は、パーセンタイルでのリクエストの応答時間。
実行結果を CSV ファイルに出力する
-e
オプションで出力先のファイル名を指定し、実行結果を CSV ファイルに出力できる。
$ ab -n 10 -e result.csv https://localhost:8080/
... 省略 ...
CSV ファイルは次のようなフォーマットで出力される。
$ cat result.csv
Percentage served,Time in ms
0,184.886
1,184.886
2,184.886
... 省略 ...
99,0.000
100,241.682
実行結果を TSV ファイルに出力する
-g
オプションで出力先のファイル名を指定し、実行結果を CSV ファイルに出力できる。
$ ab -n 10 -g result.tsv https://localhost:8080/
... 省略 ...
TSV ファイルは次のようなフォーマットで出力される。
$ cat result.tsv
starttime seconds ctime dtime ttime wait
Thu May 18 19:50:48 2023 1684407048 96 100 196 100
Thu May 18 19:50:48 2023 1684407048 105 109 215 109
Thu May 18 19:50:48 2023 1684407048 107 109 216 109
Thu May 18 19:50:47 2023 1684407047 107 109 216 109
Thu May 18 19:50:47 2023 1684407047 110 112 222 112
Thu May 18 19:50:48 2023 1684407048 113 114 227 114
Thu May 18 19:50:48 2023 1684407048 115 116 231 116
Thu May 18 19:50:46 2023 1684407046 115 117 232 117
Thu May 18 19:50:47 2023 1684407047 116 119 235 119
Thu May 18 19:50:47 2023 1684407047 126 127 253 126