読者です 読者をやめる 読者になる 読者になる

負荷試験のはなしの続き

さて,遅くなってしまいましたが「負荷試験のはなし」の続きを書いていきたいと思います.

負荷試験のツール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_successevents.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 を採用してみてはいかがでしょう?