はじめに
2024年1月に FLINTERS が設立10周年を迎えるにあたり、FLINTERS 連結社員全員でブログリレーを開催しております。本ブログはブログリレー全133回のうちの14回目で、最近使用した「Locust」というツールについて書いてみたいと思います。
Locust とは
- 負荷テストツール
- Python でテストシナリオを作成できる
- Web ベースの UI がある
- 名前の由来は、「群がる」習性を持つ昆虫のイナゴから
等
実際に触ってみる(簡単な動作確認)
1. インストール
- Locust をインストールします。
pip3 install locust
2. locustfile.py の準備
- ここでは、helloWorld.html に何回もリクエストを行うよう記載します。
-
from locust import HttpUser, task class HelloWorldUser(HttpUser): @task def hello_world(self): self.client.get("/helloWorld.html")
-
3. ローカルで Web サーバ起動
- helloWorld.html の用意(以下は一例)。
- /tmp 直下に mypage というディレクトリを作成します。
- 「Hello World!」 を表示する helloWorld.html を mypage に格納します。
- Web サーバの立ち上げ(以下は一例)
- httpd という docker image を pull します。
- コンテナを作成して起動する際、/tmp/mypage をマウントします。
docker run -d -p 8080:80 -v /tmp/mypage/:/usr/local/apache2/htdocs/ httpd:latest
-
http://localhost:8080/helloWorld.html
にアクセスして、「Hello World!」が表示されれば OK です。
4. locust 起動
- locustfile.py が存在するディレクトリに移動し、locust を実行(locust と入力し、enter 押下)します。
-
http://localhost:8089
にアクセスし、Web UI(以下)が表示されたら OK です。
5. 負荷テスト実行
- Web UI の Host に
http://localhost:8080
を入力し、Start swarming ボタンを押下します。 - 実行状況画面(以下)が表示され、helloWorld.html に大量にリクエストが送られていることがわかります。
- 負荷テストを終了させたいときは、右上の STOP ボタンを押下します。
- 例えば、環境変数
LOCUST_RUN_TIME=300s
をエクスポートしておけば、300秒で負荷テストは自動的に終了します。
- 例えば、環境変数
6. 結果確認
負荷テストを終了させ、Statistics タブ上に表示された結果を確認してみます。
- Requests【総リクエスト数】:24940
- Fails【fail したリクエスト数】:0
- Median(ms)【レスポンス速度(リクエスト数/ミリ秒)の中間値】:2
- 90%ile(ms)【レスポンス速度(リクエスト数/ミリ秒)の 90 パーセンタイル】:2
- 99%ile(ms)【レスポンス速度(リクエスト数/ミリ秒)の 99 パーセンタイル】:3
- Average(ms)【レスポンス速度(リクエスト数/ミリ秒)の平均値】:2
- Min(ms)【レスポンス速度(リクエスト数/ミリ秒)の最小値】:2
- Max(ms)【レスポンス速度(リクエスト数/ミリ秒)の最大値】:1007
- Average size (bytes)【平均レスポンスサイズ(byte)】:13
- Current RPS【(実行中の最新の)秒間リクエスト数】:414.9
- Current Failures/s【(実行中の最新の)秒間 fail リクエスト数】:0
以上で、簡単な動作確認は終了です。他(自分が独断と偏見で)注目した特徴は以下(その他にも)に記載しました。
その他にも
- Web UI の
Spawn rate
には、1秒毎に増えるユーザ数(並列実行数)を設定でき、例えば、Number of users
に10、Spawn rate
に2を設定すれば、2ユーザで負荷テストが開始され、さらに1秒毎に2ユーザ増加し、最終的に10ユーザによる負荷テストが実行されます。 - Web UI の Download Data タブから、より詳細な結果(CSV)をダウンロードできます。
- 環境変数
LOCUST_HOST=http://localhost:8080
、LOCUST_HEADLESS=true
をエクスポートすれば、Web UI を使わなくても負荷テストできます。 - タスク開始時に1回だけ呼ばれる
on_start
メソッドがあり、以下のようにログインや、前もって負荷テスト用の JSON を生成するといった時に使えます。-
from locust import HttpUser, task class HelloWorldUser(HttpUser): @task def hello_world(self): self.client.get("/helloWorld.html") def on_start(self): self.client.post("/login", json={"username":"foo", "password":"bar"})
-
まとめ
- コードも複雑ではなく、Web UI の使い方も難しくはないので、API の負荷テストを行う際には、この使用のツールを検討しても良いと思いました。