Tomorrow Will Be A Better Day

Published

- 4 min read

Python製負荷試験ツールLocustで、分散負荷試験環境を準備する

img of Python製負荷試験ツールLocustで、分散負荷試験環境を準備する

Locustでも、Jmeterのようなmaster×1-slave×N環境を準備できるということで、実際に分散負荷試験環境を構築するまでのメモ

参考サイト

Locust なる load testing tool Python 製の負荷試験ツール Locust を試してみた Running Locust distributed

Locustインストール

pipのインストール作業は割愛。
Locust自体のインストールは以下の2つがあれば十分なので、非常に簡単。

   pip install pyzmq
pip install locustio

pyzmqをインストールせずにLocustを起動すると、以下のようなWARNINGが出力される。

   Warning: WARNING: Using pure Python socket RPC implementation instead of zmq. If running in distributed mode, this could cause a performance decrease. We recommend you to install the pyzmq python package when running in distributed mode.
warnings.warn("WARNING: Using pure Python socket RPC implementation instead of zmq. If running in distributed mode, this could cause a performance decrease. We recommend you to install the pyzmq python package when running in distributed mode.")

なお、環境によっては、pyzmqインストール時に、

   <code>gcc: error trying to exec 'cc1plus': execvp: そのようなファイルやディレクトリはありません</code>

というエラーが出る時があるので、こういったときはyum install gcc-c++などで必要なライブラリをインストールしてあげる。

Locust設定

master-slave間は、ポート5557,5558を空けておく(デフォルト)

テストシナリオ準備

LocustはPythonでシナリオを記述できるということが、JmeterのXMLよりも開発者に優しい仕様。
今回は分散負荷試験環境を準備するまでがメインなので、サイトに直アクセスするだけのテストシナリオを準備した。

   from locust import HttpLocust, TaskSet, task
class MyTaskSet(TaskSet):
    @task(1)
    def index(self):
        self.client.get("/")
class MyLocust(HttpLocust):
    task_set = MyTaskSet

Locust起動

master(10.127.29.162)

   # locust -f test.py -H http://www.example.com --master
[2014-07-21 13:16:51,592] ip-10-127-29-162/INFO/locust.main: Starting web monitor at *:8089
[2014-07-21 13:16:51,596] ip-10-127-29-162/INFO/locust.main: Starting Locust 0.7.1

slave(10.172.132.249)

   # locust -f test.py -H http://www.example.com --slave --master-host=10.127.29.162
[2014-07-21 13:17:07,447] ip-10-172-132-249/INFO/locust.main: Starting Locust 0.7.1

メモ

slaveの接続に成功すると、master側に以下のようなログが出力される。

   [2014-07-21 13:17:07,454] ip-10-127-29-162/INFO/locust.runners: Client 'ip-10-172-132-249_5f40fc0bbaf6951a803e51d16dea946e' reported as ready. Currently 1 clients ready to swarm.

slaveがmasterから外されたときは、以下のようなログが出力される。

   [2014-07-21 13:22:24,523] ip-10-127-29-162/INFO/locust.runners: Client 'ip-10-172-132-249_5f40fc0bbaf6951a803e51d16dea946e' quit. Currently 0 clients connected.

Locust起動画面

スタンドアローンでの起動画面

スタンドアローンでの起動画面

master-slaveでの起動画面(右上にslaveの数が記載される)

master-slaveでの起動画面(右上にslaveの数が記載される)

Locustの負荷試験中の画面

Locustの負荷試験中の画面

まとめ

起動オプションで、Locustの分散負荷試験環境が準備できた。
他の方が書いているように、Jmeterほど高機能さはないけど、簡単な負荷試験にはちょうどよさそう。
個人的には、以下の項目に該当するなら、Locustでの負荷試験を検討してもよいのではないかと思われる。

  • JmeterのJavaヒープサイズまわりのチューニングが面倒くさい
  • XMLでテストシナリオを管理したくない(≒Pythonで書きたい)
  • Webで負荷がけ状況を把握したい(Jmeterのためだけに、X11設定するのが面倒くさい)
  • 豪華なグラフなど、Jmeterほどしっかりした試験結果は不要