1
1

Locust 使ってみた

Last updated at Posted at 2023-09-22

はじめに

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 です。
    スクリーンショット 2023-09-19 11.16.48.png

5. 負荷テスト実行

  • Web UI の Host に http://localhost:8080 を入力し、Start swarming ボタンを押下します。
  • 実行状況画面(以下)が表示され、helloWorld.html に大量にリクエストが送られていることがわかります。
    スクリーンショット 2023-09-19 11.50.57.png
  • 負荷テストを終了させたいときは、右上の STOP ボタンを押下します。
    • 例えば、環境変数 LOCUST_RUN_TIME=300s をエクスポートしておけば、300秒で負荷テストは自動的に終了します。

6. 結果確認

負荷テストを終了させ、Statistics タブ上に表示された結果を確認してみます。
スクリーンショット 2023-09-19 12.05.07.png

  • 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:8080LOCUST_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 の負荷テストを行う際には、この使用のツールを検討しても良いと思いました。
1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1