pythonのlocustで負荷テストを行う

大量のアクセスがきてもサーバーが落ちないこと。これは大事なデータを扱うサービスの重要な要素であったりします そんなことの無いようにリリース前に負荷テストをしようぜということになりました

今回はpythonlocustという負荷テストツールを使ったメモです

誰が使ってる?

f:id:gri-blog:20210630140131p:plain
locustページから

locustの公式ページにはGoogle, mozilla, amazonなどが使っているようです

インストール

# pipから
pip install locust

※Dockerでも公式イメージがあるので、その場合はローカル環境へのインストールは不要です

# versionの確認
locust -V # locust 1.5.2

私の環境では1.5.2のバージョンになります

コード

公式のTutorialから

# locustfile.py

import time
from locust import HttpUser, task, between

class QuickstartUser(HttpUser):
    wait_time = between(1, 2.5) # 1ユーザーのページ滞在秒数の範囲

    @task
    def hello_world(self):
        self.client.get("/hello")
        self.client.get("/world")

    @task(3) # 数字はtaskの重み
    def view_items(self):
        for item_id in range(10):
            self.client.get(f"/item?id={item_id}", name="/item")
            time.sleep(1)

    def on_start(self):
        self.client.post("/login", json={"username":"foo", "password":"bar"})
  • 実行後、各メソッドはランダムにリクエストされる
    • 重み task(3)と入れることで、hello_worldメソッドよりもリクエストが単純に3倍呼ばれる率が高くなる
  • on_startはユーザーのリクエストの最初に行われるメソッド. 上記はon_startでページログインを行なった後、hello_workd, view_itemsそれぞれのメソッドを実行する

実行

locust -f locustfile.py

※Dockerの場合

docker run -p 8089:8089 -v $PWD:/locust locustio/locust -f locustfile.py

f:id:gri-blog:20210630140943p:plain

ではブラウザからhttp://0.0.0.0:8089にアクセスしてみます

f:id:gri-blog:20210630141032p:plain

  • Number of total users to simulate
    • 最大の同時接続数
  • Spawn rate
    • 1秒あたり何ユーザー増やしていくか (最初から最大数にしたい場合は”Number of total users to simulate”と同じ数字にすればよい)
  • Host

イメージ図

f:id:gri-blog:20210630141649p:plain

f:id:gri-blog:20210630141730p:plain

リアルタイムで動作確認ができます また、プロセスを止めた時、コンソールにサマリー結果を出力してくれます

f:id:gri-blog:20210630142142p:plain

図ではきれいな数字ですが、実際にはステータスが500(サーバーダウン)になる閾値を見つけてインスタンス数やスペックの調整をしたりしました

参考

Locust Documentation — Locust 1.5.3 documentation
負荷テストツール、Locustで遊ぶ

higashi kunimitsu