2013年11月13日水曜日

Locust なる load testing tool

軽量な Web アプリのロードテストツールを探してたところ、Locust なる
Powered by Python なプログラムを発見。これ結構使える。
動作は Python コードで書くので柔軟性がある。

インストールは pip で一発だが、CentOS6 で可能な限り rpm で入れたいので
以下のように。そのうち自分で spec 作るか。

mater ブランチ持ってきてもいいけど、一応タグ打ってある版をここから
持ってきた。

# yum install python-devel python-zmq libevent-devel
# wget https://github.com/locustio/locust/archive/v0.6.2.tar.gz  -O locust-0.6.2.tar.gz
# tar xvzf locust-0.6.2.tar.gz
# cd locust-0.6.2
# python setup.py install

インストールが終わったら、適当に使ってみる。今回はユーザ毎にパラメータ
を変更した GET リクエストをたくさん投げる負荷テストをしてみたかったので
以下のような簡単なソースに。

テスト対象の動作の定義は、TaskSet クラスを継承したクラス(ここでは
MyFirstTasks) に適当な名前のメソッドを作り、その中でリクエストの URL
とパラメータを self.client.get() に指定すればいいだけ。複数メソッドを定義
した場合はランダムにそれを実行してくれる模様。@task(n) の n は、そのメソッ
ドの実行割合らしい。

実行順を定義したかったらクラスの定義をネストすれば良いらしい(私はまだやっ
たことがないが)。

Locust クラスを継承したクラス(ここでは MyFirstUser)は、操作するユーザ
を模したクラスらしい。この中の task_set という attribute に、上記した TaskSet
のクラス名を定義する。min_wait と max_wait はようわからんのだが、ユー
ザインスタンス間の実行間隔を定義しているらしい。
from locust import Locust, TaskSet, task
import random

class MyFirstTasks(TaskSet):
    @task(1)
    def myfunc(self):
        teststr = "teststr-" + "%04d" % random.randint(1,100)
        self.client.get("/mytest/?teststr=%s" % teststr)
class MyFirstUser(Locust):
    task_set = MyFirstTasks
    min_wait = 500
    max_wait = 1500

上記ファイル名を myfirsttest.py としたとして、下記のように実行する。

    locust -f myfirsttest.py -H http://www.fastriver.net

-H はリクエストを送るホストを定義する。

すると、http://localhost:8089 に管理画面が表れ、ここでスタート/ストップが
できたり、実行結果がわかったりする。

とまぁ超簡単な動作はこんな感じでできるが、複雑なもテストも動作を Python で
書けるので、Form に送る値を csv ファイル等に定義しておいて、ランダムにそれ
を送出するようなテストもできそう。

あと、master/slave 構成にもできるようなので、テストクライアント自体の
負荷分散も可能でかなり多くのリクエストを同時に送ることができそう。

また時間があったら詳しい使い方なんかを書いてみようと思う...書けたらいいな。。




0 件のコメント:

コメントを投稿