負荷試験のはなしの続き
さて,遅くなってしまいましたが「負荷試験のはなし」の続きを書いていきたいと思います.
負荷試験のツールに locust を採用したという話までしましたね.
では,locust のコードについて書いていきたいと思います.前に書いたとおり,Install などについては省略しますね.
構成について
master が 1 台,slave が 2 台の 合計 3 台で負荷をかけていきます.
実行方法について
master で下記のようなコマンドを,実行します.
sudo locust -f locustfile.py --host=http://stress-test.xxx.xxx --master --logfile='./log/locust.log'
そして,slave で下記のようなコマンドを実行します.
sudo locust -f locustfile.py --slave --host=http://stress-test.xxx.xxx --master-host=1.1.1.1
master と slave の間では,必要なポートを許可しておく必要があります.
また,負荷試験の対象となるサーバーは,コマンドラインオプションで指定します.
コードについて
resource.setrlimit(resource.RLIMIT_NOFILE, (10000, 10000)) URLS = [ "a=1", "a=2", "a=3" ] PW = getpass.getpass(' Enter Password:') logfile = open('./log/result.csv', 'w') var = 0 data = [] def output_request_log_as_csv_format(request_type, name, response_time, response_length, **kw): . . . def close_log_file(): . . . events.request_success += output_request_log_as_csv_format events.quitting += close_log_file class UserBehavior(TaskSet): def on_start(self): self.client.headers = self.headers @task(5000) def action_landing_page(self): self.client.get(random.sample(URLS, 1)[0], auth=("user", PW)) class WebsiteUser(HttpLocust): task_set = UserBehavior min_wait=1000 max_wait=3000
コード全体のイメージとしては,上記のようになります.
events.request_success
と events.quitting
でリクエストが成功した時と,リクエストが終了した時に
それぞれ処理を実行しています.
ここでは,レスポンスタイムなどの情報が欲しかったので,CSV として,結果を書き込んでいます.
そして,リクエストが終了した時に CSV ファイルを閉じています.
我々の環境では,負荷試験用の環境には認証をかけているので,elf.client.get("/", auth=("user", PW))
のようにしています.
そして,UserBehavior
でいわゆるシナリオ,ユーザーの振る舞いを記述しています.
URLS 配列の中からランダムに1つを選び,Get しています.
また,十分にresourcesを使えるよう
resource.setrlimit(resource.RLIMIT_NOFILE, (10000, 10000))
のようにして,RLIMIT_NOFILE
を増やしています.
この子たちは,Python の Script などで自由度はとても高いです.
反面,やりたいことは自分で書かなければならない部分も大きいですが,この程度の処理ならさほど時間もかからないでしょう.
最後に,所感ですが,複数台でそれなりの負荷がかけられるツールとしては,locust は利用しやすいと思います. 詳細な分析を必要としなければ,locust を採用してみてはいかがでしょう?