📌

負荷テストツールlocustを試してみた

2024/01/22に公開

保育ICTを愛するみなさまこんにちは、H.G.M Developers S.K です。

はじめに

負荷テストを行うことになり、その事前調査として負荷テストツールの locust を使ってみました。
locust はテストスクリプトを Python で書けるため、普段 Python を書き慣れている人間には取っ付きやすかったので、サクッと試してみました!

開発環境

  • MacBook Pro M1
  • VS Code

ライブラリ

  • Python 3.10
  • pipenv 2022.9.24
  • locust 2.19.1

環境構築

pipenv で仮想環境を作成します。

$ pipenv --python 3.10

pipenv install で locust をインストールします。

$ pipenv install locust

テストスクリプト作成

locustfile.pyを作成し、テストのスクリプトを書いていきます。

今回はトップ画面に対してリクエストをしたいのですが、トップ画面の表示にはログインが必要なので、on_startにログイン処理を記述しています。

on_start はUserクラスのメソッドでユーザーが実行を開始する際に1度だけ呼び出されます。
https://docs.locust.io/en/stable/writing-a-locustfile.html#on-start-and-on-stop-methods

locust.py
from locust import HttpUser, task
from lxml import html


class QuickstartUser(HttpUser):
    def on_start(self):
        # ログイン処理
        response = self.client.get("/login")
        tree = html.fromstring(response.text)
        auth_token = tree.xpath('//form/input[@name="authenticity_token"]/@value')[0]
        self.client.post(
            "/sessions",
            json={
                "login_id": "user00@example.com",
                "password": "password", # パスワードを記述
                "commit": "ログイン",
                "authenticity_token": auth_token,
            },
        )

    @task
    def dashboards(self):
        self.client.get("/dashboards")

lxml はauth_tokenを取るのに使いたかったので追加で pipenv install でインストールしました。

テストの実行

locust のWebツールを起動します。
デフォルトの場合は http://0.0.0.0:8089 でlocustが起動します。

$ locust

locust —web-port 8088のようにポートを変更することや、CUIで実行することもできます。

https://docs.locust.io/en/stable/configuration.html

ブラウザでlocustの画面を表示するとこのような画面が表示されます。
Start new load test の画面

  • Number of users: 最大同時接続数
  • Spawn rate: 1秒あたりに増加する接続数
  • Host: リクエスト対象のホスト

を入力して、Start swarming ボタンをクリックすることでテストが実行されます。

ひとまず、 Number of usersSpawn rate のどちらも1で実行してみます。

テストを実行すると、テスト結果の画面が表示されます。

Charts タブの画面1
Charts タブの画面2

Chartsタブには

  • Total Requests per Second
    • RPS(Request per Second): 1秒あたりの総リクエスト数
    • Failures/s: 1秒あたりのリクエストの失敗した数
  • Response Times(ms)
    • 50th percentile: 50%のユーザーのレスポンス時間
    • 95th percentile: 95%のユーザーのレスポンス時間
  • Number of Users
    • Users: その時点のユーザー数

の3種類のチャートが表示されます。このチャートを元に分析していきます。

Number of usersを10にして実行してみた場合はこのようになりました。

Number of usersを10の場合のCharts タブの画面1
Number of usersを10の場合のCharts タブの画面2

おわりに

今回はlocustの動作を試しただけですが、テストスクリプトでタスクを増やしたり、タスクごとの重みづけをつけたりすることで実際の通信パターンを再現することもできます。

実際の負荷テストではテスト計画を立てた上で、監視ツールでテスト対象のサーバーやデータベースの状態を監視しながらテストを実行するため、前提として負荷テスト自体に関する理解の重要性を痛感しました。

以上、H.G.M Developers S.K でした。

Discussion