データサイエンス

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

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

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

誰が使っている?

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