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 コマンドのチートシート
基本的な使い方
$ 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