最近、abコマンドを使って負荷テストを実施する機会があったので、メモを残したいと思います。
今回は次のような方法で簡易的な負荷テストを行い、アプリケーションの遅延化が発生しないことを確認しました。
実施した簡易的な負荷テスト
- バックエンド側のサーバーにリクエストを連続して発行し、負荷がかかった状態にする。
- ネイティブアプリを操作し、バックエンド側のサーバーに負荷がかかった状態でも処理の遅延化が発生しないか確認する。
上記の1の手順で、リクエストを連続して発行するときにab
コマンドを実行しました。
今回、久しぶりにabコマンドを使ったので、改めてab
コマンドについて振り返りたいと思います。
abコマンドとは
abコマンド(=Apache Bench)は、Apache HTTP サーバープロジェクトの一部として提供されるベンチマークツールです。このコマンドラインツールは、ウェブサーバーへのリクエストを発行し、その応答時間やスループットなどのパフォーマンス指標を測定することができます。
基本的な使用方法
abコマンドの基本的な構文は以下の通りです。
$ ab [オプション] [http://]hostname[:port]/path
ここで、hostname
にはテスト対象のサーバーのホスト名またはIPアドレスを、path
にはリソースのパスを指定します。
ローカル環境を使用する場合は、次のように実行します。
$ ab http://localhost:3000/
リクエストをどのくらい発行するかはオプションで指定することが可能ですが、上記のコマンドは特にオプション指定をしていないので、1回のリクエストだけ発行されます。
実行直後は次のように「実行中だよ」のメッセージが表示されます。
$ ab http://localhost:3000/
This is ApacheBench, Version 2.3 <$Revision: 1903618 $>
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).....done
実行結果の見方
実行が完了すると、次のようなメッセージが表示されます。
Server Software:
Server Hostname: localhost
Server Port: 3000
Document Path: /
Document Length: 110 bytes
Concurrency Level: 1
Time taken for tests: 5.755 seconds
Complete requests: 1
Failed requests: 0
Non-2xx responses: 1
Total transferred: 1063 bytes
HTML transferred: 110 bytes
Requests per second: 0.17 [#/sec] (mean)
Time per request: 5754.897 [ms] (mean)
Time per request: 5754.897 [ms] (mean, across all concurrent requests)
Transfer rate: 0.18 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.0 0 0
Processing: 5755 5755 0.0 5755 5755
Waiting: 5755 5755 0.0 5755 5755
Total: 5755 5755 0.0 5755 5755
メッセージの見方については次のとおりです。
abコマンドの結果の見方
- Server Software: テストされたウェブサーバーのソフトウェア名
- Server Hostname: テスト対象のサーバーのホスト名
- Server Port: テスト対象のサーバーのポート番号
- Document Path: リクエストされたリソースのパス
- Document Length: レスポンスとして返されたリソースのサイズ
- Concurrency Level: 同時に実行されるリクエストの数
- Time taken for tests: テストの総実行時間
- Complete requests: 正常に完了したリクエストの総数
- Failed requests: 失敗したリクエストの総数
- Non-2xx responses: 200番台のステータスコード以外のレスポンスが返された回数
- Total transferred: テスト中に転送された総データ量
- HTML transferred: HTMLコンテンツとして転送されたデータのサイズ
- Requests per second: 秒間の平均リクエスト数
- Time per request: リクエストあたりの平均処理時間
- Time per request (mean, across all concurrent requests): 同時に実行されるリクエストを考慮した、リクエストあたりの平均処理時間
- Transfer rate: 平均転送レート
- Connection Times (ms): 各フェーズ(接続、処理、待機、合計)の処理時間
これがab
コマンドの基本的な使い方になります。
コマンドオプション
ab
コマンドには、リクエストの発行数を指定したり、同時に発行するリクエスト数を指定することができるオプションがあります。
-n:発行するリクエスト総数を指定
-n
オプションで実行する総リクエスト数を指定できます。
次のように実行するとhttp://localhost:3000/
に100回のリクエストを発行できます。
$ ab -n 100 http://localhost:3000/
nオプションを使うケース
- サーバーが100回のリクエストを処理できるかをテストする場合
- サーバーに負荷をかけてアプリケーションに遅延化が発生していないか確認する場合
-c:並列リクエスト数を指定
-c
オプションで並列実行するリクエスト数を指定できます。
次のように実行するとhttp://localhost:3000/
に、10個のリクエストを並列実行し、総リクエスト数が100になるまでリクエストを発行できます。
$ ab -c 10 -n 100 http://localhost:3000/
cオプションを使うケース
- 通常のトラフィック状況でサーバーがどれだけ効率的に応答できるかを測定したい場合
- ピーク時のトラフィックに対するサーバーの耐久性を評価したい場合(高い並列リクエスト数下でのパフォーマンスを分析)
-t:テストの最大実行時間を指定
-t
オプションで、テストの最大実行時間(秒単位)を指定できます。この時間が経過するとテストは停止します。
次のように実行するとhttp://localhost:3000/
に60秒間、50個のリクエストを並列実行し続けます。
$ ab -t 60 -c 50 http://localhost:3000/
tオプションを使うケース
- 一定時間中、一定負荷下でのサーバーの挙動を観察したい場合
- サーバーが一時的なスパイクトラフィックをどう処理するかを見たい場合
その他のオプション
-n
,-c
,-t
オプションの他にも様々なケースのテストに対応できるようなオプションが用意されています。一部を紹介します。
-p
: POSTメソッドで送信するデータが含まれるファイルを指定-T
: POSTまたはPUTで使用されるContent-Typeヘッダを指定-k
: HTTP KeepAliveを有効にし、複数のリクエストを同じ接続で送信-H
: カスタムHTTPヘッダーを追加
まとめ
Apache Benchは、ウェブサーバーのパフォーマンス測定に非常に役立つツールです。これを用いることで、サーバーが高負荷状態でどのように振る舞うかを把握し、必要に応じて最適化を行うことができます。