Webサーバの負荷・ロードテストツール(2)「Locust」
LocustはPythonで制作されたWebサーバの負荷テストツールの一つで、MasterとSlaveによる分散テストも可能なツールとなっています。
はじめに(ご注意ください!)
今回紹介するテストツールは、DOS攻撃にも利用出来てしまいます。テストを行う時は、サーバのURLが正しいか注意し、他人のサーバに間違ってもアクセスしないようにくれぐれもご注意願います。
インストール
インストールはPythonが実行出来る環境が必要です。またここでは、パッケージ管理の「pip」を利用していますが、ここでは割愛しますので予め用意して下さい。
pipを使ってlocust本体とpyzmqをインストールします。
$ pip install locustio
$ pip install pyzmq
テストシナリオの設定
Locustはテストシナリオの設定ファイルが必要になります。設定ファイルは「locustfile.py」として保存すると、実行時に設定ファイルを読み込んでくれます。
以下は単純にサイトを読み込むだけの、極簡単なスクリプトです。
from locust import HttpLocust, TaskSet, task
class WebsiteTasks(TaskSet):
@task(1)
def index(self):
self.client.get("/")
@task(2)
def search(self):
self.client.get("/search.html")
class WebsiteUser(HttpLocust):
task_set = WebsiteTasks
min_wait = 5000
max_wait = 15000
設定ファイルの説明
- WebsiteTasksクラスは、各タスクを設定するクラスです。TaskSetクラスを継承しています。@taskの括弧内の数値は、重み付けです。@task(2)は、@task(1)に対して、約倍の実行比率となります。
self.client.get()には、テストサイトのGETメソッド・パラメータを記述します。
- WebsiteUserクラスが実行時のクラスです。HttpLocustクラスを継承しています。task_setに、上記WebsiteTasksクラスを設定します。
min_wait、max_waitについては、それぞれタスクの待ち時間をミリ秒で設定します。
これ以外にも、Basic認証などの設定などや、CSVなどで記述したテストデータを外部から取込み、その情報を元に繰り返しテストすることもできます。テストはスクリプトで記述できるので、柔軟にテスト設計ができると思います。
実行方法
基本の実行コマンドは、以下の通りです。実行時のカレントディレクトリにあるテストシナリオファイルの「locustfile.py」を読み込みます。
$ locust -H http://test-site.xxx
別のシナリオファイルを読み込む場合は、-f オプションを設定します。
$ locust -f test.py -H http://test-site.xxx
その他のオプションパラメータ
locustの代表的なオプションを例に挙げます。
オプション | 説明 |
---|---|
-H HOST | テストサイトのURL |
-P PORT | テストサイトのポート番号 |
-f LOCUSTFILE | Locustの設定ファイル |
–no-web | CLIとして稼働させる場合に設定(-c、-rが必要です) |
-c NUM_CLIENTS | クライアント数を設定 |
-r HATCH_RATE | Hatch rate(1秒間に作成するユーザ数)を設定 |
–web-port=PORT | WEBコンソール画面のポート番号(デフォルトは8089) |
実行画面
スタンドアローンでのWEB実行画面です。デフォルトでは、「http://localhost:8089」で接続出来ます。

Number of users to simulate(シミュレートするユーザ数)
Hatch rate(1秒間に作成するユーザ数)
それぞれ、値を設定してから、「Start swarming」をクリックします。
実行中の画面です

随時、結果は更新されていきます。
Stopボタンを押すことで、テストを停止します。
実行後の画面です。

結果はメニューの「Download Data」から、CSVなどでダウンロードも可能です。
分散環境テスト
疑似高負荷環境を作成する時は、さすがに端末が1台だけでは無理があります。 実際、高負荷設定でLocustを動かすと、端末にかなりの負荷が掛かります。Locustでは、複数台の端末を利用しアクセスすることで、アクセスを分散する事が可能です。
実行方法は、1台の端末(Master)に対して、複数の端末(Slave)を用意するだけです。
Masterの端末
マスターとしてlocustを起動します。
$ locust -H http://test-site.xxx --master
Slave側の端末
Slaveとしてlocustを起動します。–master-hostパラメータでMasterのURLかIPを指定します。
$ locust -H http://test-site.xxx --slave --master-host=xxx.xxx.xxx.xxx
まとめ
テストシナリオファイルはPythonスクリプトで記述していますが、簡単に動かすだけであれば、Pythonになれていない方でも、すぐに理解出来るでしょう。
テストはスクリプトでコントロールしますので、柔軟にテスト設計ができることが、このツールの強みだと思います。
また、高負荷のテストを行う場合にも、分散環境が用意されていますので、他の負荷テストツールと比較しても十分な性能をもったツールと言えるでしょう。
コメントは受け付けていません。