最速でlocustを体験してみた

負荷試験ツールであるLocustが他の負荷試験ツールと何が異なるのか、最速で環境構築して機能などを確認してみました。
2022.11.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。ゲームソリューション部の出村です。

負荷試験でLocustを扱う機会がありました。これまでJMeterやgatlingの利用経験はありましたがLocustは初体験となります。

他の負荷試験ツールとの違いに触れつつLocastのセットアップ方法や機能について解説します。

Locastとは

ざっくりいえばJMeterなどと同じく負荷試験ツールのことです。 他の負荷試験ツールと異なる点は次のことが挙げられます。

  • Pythonで動く
  • サーバ、スレーブ構成が可能
  • シナリオがPythonで書ける

Python3で動く

動作環境で必要なのがPython 3です。Python3.10以上がインストールされている環境であれば動作しますし、インストールもpipコマンドだけで終わります。

シナリオがPythonで書ける

シナリオのスクリプトもPythonで書けます。Pythonであれば書き慣れている人も多いと思うので、シナリオを書くために学ぶ事は少ないのでは無いかと思います。

シナリオがどんな雰囲気のコードなのかは、このあとご紹介します。

サーバ、スレーブ構成が可能

規模が大きな負荷試験を実施しようとすると、負荷を掛けるサーバが必要となります。

規模によってはクラスタ構成しないと達成が困難なことも考えられます。他の負荷分散ツールだと同時にいくつも起動して一度に実行するみたいな手間をかけるといった事が必要な事もありますが、Locustではmaster / workerモードでサポートされており、それを使う事で大規模な負荷がかけられます。

体験できる環境を最短で構築する

Locustの利用感を掴むため、Locustが体験できる環境を最速で構築します。詳細についてはLocustのインストールマニュアルを参考にしてください。

検証した環境は次の通りです。

 - LOCUST 2.13.0
 - WSL2 + Ubuntu22.04

Locustのインストール

Python3.7以上がインストールされている環境を用意します。あとはpipを使ってインストールします。

$ pip3 install locust

スクリプトを用意

スクリプトを用意します。今回はサンプルを少しだけ変更したスクリプトを利用しました。スクリプトの保存先は任意ですが、今回は、~/locustフォルダに保存してます。

今回のシナリオはサンプル程度のあっさりしたものですが、もっと複雑な処理を指定することも可能ですし、Pythonスクリプトとして指定できるのでより柔軟に指定できます。

$ cat ~/locust/locustfile.py
from locust import HttpUser, task

class HelloWorldUser(HttpUser):
    @task
    def hello_world(self):
        self.client.get("/hello.html")
        self.client.get("/world.html")

Webサーバを用意

何でも良いのですが、今回はRubyを使ってサクッと立てました。とりあえず静的なHTMLを返すだけの非常にシンプルな構成となってます。今回は諸事情により3031番ポートに割り当てて起動しています。

$ tree ~/tmp/websrv
/home/abc/tmp/websrv
├── hello.html
└── world.html
$ ruby -run -ehttpd . -p3001

これで、localhost 3031番ポートにアクセスするとWebページが観られます。

Locustを起動する

Locustを起動します。Locustを起動するとユーザ数をアクセス先のURLを指定します。これで負荷試験が開始されます。 ここでも諸事情により3000番ポートに割り当てています。

[/bash] $ locust --web-port 3000

起動直後はこのような画面が表示されるのでパラメータ等を設定した後、ボタンを押下します。

ここではWebサーバを起動して計測していますが、Web UIなしで起動することも可能です。

取得したデータを眺める

どのような情報が取得できるのか確認してみます。これまで他の負荷試験ツールを使っていたのであれば、それらの差分を把握することで、Locustの勘所が短時間に理解できるのではないでしょうか。

Statistics

リクエストの発行状況やレスポンスなどをみる機能です。恐らくいちばんよく観る機能かと思います。

ここのパラメータを観ると若干の物足りなさを感じるかもしれません。例えば75パーセンタイルの値が知りたい、といった具合です。

そのような詳細な値は関しては、CSVをダウンロードするとみることができます。

Charts

発行されているリクエストの状況、レスポンスタイムの状況、アクセスしているユーザ数の状況をグラフでみることができます。

Failures

失敗したアクセスの詳細です。具体的にどこにアクセスしているときにどのような失敗をしているかをみることができます。

Exceptions

例外ですね。何かエラーが発生したときの状況が把握できる機能です。今回は画面紹介のみに留めます。

Current ratio

シナリオの実行状況をみることができる機能です。今回はシンプルすぎてあまり意味がないですが、複雑な物になると、シナリオを実行する程度を調整するのに役立つと思います。

Download Data

これらの測定結果をCSVファイルで保存することもできます。過去のデータとの比較、Excelなどを使った分析で使えます。

ちなみにStatisticsのcsvでは、75パーセンタイルでのレスポンス値など先のWebUIのStatisticsで取得できる詳細な値が取得出来ます。

まとめ

Locustを今回初めて利用してみましたが、かなり大規模な負荷を掛ける際には有効なツールだと感じました。あとはシナリオを書くのがPythonという一般的な言語で書ける点も魅力的だとも感じました。

使用するか悩んだ場合はサクッと試して観る価値はあるでしょう。