全力で怠けたい

怠けるために全力を尽くしたいブログ。

ab コマンド (ApacheBench) の自分的チートシート。

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