自分が実験を行った際にLocustを使用した為,記録を残す

Locustの構成ファイル

Locustを動かす際にPythonを用いて構成ファイルを作成した

from locust import HttpUser, TaskSet, task, constant
from locust import LoadTestShape


class UserTasks(TaskSet):
    @task
    def get_root(self):
        # replace with the URL of your server
        self.client.get("http://192.168.100.96:31000/")#リクエストの送信先であるサーバーIPアドレスとport番号


class WebsiteUser(HttpUser):
    wait_time = constant(1)
    tasks = [UserTasks]

class StagesShape(LoadTestShape):

    stages = [
        {"duration": 60, "users": 10, "spawn_rate": 10},#実験開始から60秒まで最大ユーザー数を10として毎秒10リクエスト送信
        {"duration": 900, "users": 500, "spawn_rate": 50},#60秒から900秒まで最大ユーザー数を500として毎秒50リクエストずつ上昇させて送信
        {"duration": 1500, "users": 0, "spawn_rate": 50}#900秒から1500秒までユーザー数が0になるまで毎秒50リクエストずつ減少させて送信
    ]

    def tick(self):
        run_time = self.get_run_time()

        for stage in self.stages:
            if run_time < stage["duration"]:
                tick_data = (stage["users"], stage["spawn_rate"])
                return tick_data

        return None

上記のPythonファイルを作成した ※指定したサーバーのIPアドレスや,リクエスト数の増減は各々のテストシナリオごとに変更する

テスト実行

次に以下のコマンドを入力することで負荷試験を開始できる

locust -f locustfile.py --headless -u 0 -r 0 -H http://192.168.100.96:31000 --csv=test

Locustではlocustコマンドを入力することでUI上で負荷試験を行うことが出来る.

本実験を行った際はUIを省略したかったため,オプションである--headlessを使うことでUIを起動せずテストを行うことが出来る ※headlessで行う場合ユーザー数とレートを入力する必要があるので0秒時点でユーザー数0,0req/sと指定している

また--csvオプションを用いることで実験データをcsvファイルとして保存できる

コマンドを実行すると以下のように出力され,指定した時間に自動的に終了する

[2021-12-23 10:20:35,554] load-test/INFO/locust.runners: Shape test starting. User count and spawn rate are ignored for this type of load test
[2021-12-23 10:20:35,554] load-test/INFO/locust.main: Starting Locust 2.2.1
[2021-12-23 10:20:35,554] load-test/INFO/locust.runners: Shape worker starting
[2021-12-23 10:20:35,554] load-test/INFO/locust.runners: Shape test updating to 10 users at 10.00 spawn rate
 Name                                                   # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Aggregated                                                  0     0(0.00%)  |       0       0       0       0  |    0.00    0.00

[2021-12-23 10:20:35,555] load-test/INFO/locust.runners: Ramping to 10 users at a rate of 10.00 per second
[2021-12-23 10:20:35,556] load-test/INFO/locust.runners: All users spawned: {"WebsiteUser": 10} (10 total users)
 Name                                                   # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
------------------------------------------------------------------------------------------------------------------------------------- GET /                                                      20     0(0.00%)  |      13       5      23      11  |    0.00    0.00
------------------------------------------------------------------------------------------------------------------------------------- Aggregated                                                 20     0(0.00%)  |      13       5      23      11  |    0.00    0.00

 Name                                                   # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
------------------------------------------------------------------------------------------------------------------------------------- GET /                                                      40     0(0.00%)  |      10       3      23       9  |   10.00    0.00
------------------------------------------------------------------------------------------------------------------------------------- Aggregated                                                 40     0(0.00%)  |      10       3      23       9  |   10.00    0.00

 Name                                                   # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
------------------------------------------------------------------------------------------------------------------------------------- GET /                                                      50     0(0.00%)  |      10       2      23       8  |   10.00    0.00
------------------------------------------------------------------------------------------------------------------------------------- Aggregated                                                 50     0(0.00%)  |      10       2      23       8  |   10.00    0.00

 Name                                                   # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
------------------------------------------------------------------------------------------------------------------------------------- GET /                                                      70     0(0.00%)  |      11       2      37       8  |    8.33    0.00
------------------------------------------------------------------------------------------------------------------------------------- Aggregated                                                 70     0(0.00%)  |      11       2      37       8  |    8.33    0.00

 Name                                                   # reqs      # fails  |     Avg     Min     Max  Median  |   req/s failures/s
------------------------------------------------------------------------------------------------------------------------------------- GET /                                                      90     0(0.00%)  |      10       2      37       7  |    7.50    0.00
------------------------------------------------------------------------------------------------------------------------------------- Aggregated                                                 90     0(0.00%)  |      10       2      37       7  |    7.50    0.00

出力されるcsvファイルは以下となる↓

cdsl@load-test:~$ ls
test_exceptions.csv  test_stats.csv          
test_failures.csv    test_stats_history.csv  
自分が行った実験では実験開始から終了までの全てのデータが入っているtest_stats_history.csvを使用した ※他のファイル使わなかったためあまり理解が出来ていません、、、