手軽にWebサイトの負荷試験をする

概要

シナリオをきっちり作ってクラスタ立ててやるほどでもなく、でも単一URLにだけリクエストおくるほど単純でもなく、 Webページに同時にn人接続した場合の負荷を調べる程度のテストをしたいときにやったことです。

手順

1. Siegeのインストール

Siegeというベンチマークツールを使ってテストを行います。これは

It can stress test a single URL with a user defined number of simulated users, or it can read many URLs into memory and stress them simultaneously. とあるように、複数のURLに対して複数のユーザーによる同時接続をシュミレートでき、今回の用途に適しています。また、コマンドラインから実行できるのも便利です。 他に手軽なベンチマークツールとしてはApache abもよく知られていますが、こちらは複数URLへのリクエストが行えないため、今回は選択しませんでした。

公式ページからダウンロードできますが、今回のテストはMacから実行したので

brew install siege

でインストールしました。

2. テスト対象ページで発生するリクエスト先URL一覧を取得する

Webページにアクセスした場合、通常はそのページ自体のURLだけではなく、 画像、CSS、JSファイルなど複数のリソースに対するリクエストが発生します。 今回はWebページへのアクセスをシミュレートしたいので、すべてのリクエスト先URL一覧を作成します。

Chromeブラウザで該当ページにアクセスし、DevToolsのNetworkタブを開いてSave all as HAR with contentを選択してHARファイルをダウンロードします。 これはJSONファイルになっているので、jqコマンド等でパースしリクエストURLの一覧を取得することができます。

cat /path/to/file.har | jq '.log.entries[].request.url' | sed -e 's/"//g' > /path/to/url_list.txt

で、URL一覧を記述したファイルを作成できます。もし一覧内にテスト対象外サーバー上のリソースが含まれている場合は、適宜削除します。

3. Siegeでのテスト実行

siegeコマンドで上記URL一覧を指定することで、テストの実行が可能です。 例えば同時実行数を10とし、5分間テストを継続する場合、

siege -c 10 --time=5M -f /path/to/url_list.txt

でテストを実行できます。その他ベーシック認証のIDパスワードの指定、ヘッダーの指定、リクエスト数調整などの各種オプションも指定できます。