負荷テストツールlocustを試してみた
保育ICTを愛するみなさまこんにちは、H.G.M Developers S.K です。
はじめに
負荷テストを行うことになり、その事前調査として負荷テストツールの locust を使ってみました。
locust はテストスクリプトを Python で書けるため、普段 Python を書き慣れている人間には取っ付きやすかったので、サクッと試してみました!
開発環境
- MacBook Pro M1
- VS Code
ライブラリ
- Python 3.10
- pipenv 2022.9.24
- locust 2.19.1
環境構築
pipenv で仮想環境を作成します。
$ pipenv --python 3.10
pipenv install で locust をインストールします。
$ pipenv install locust
テストスクリプト作成
locustfile.pyを作成し、テストのスクリプトを書いていきます。
今回はトップ画面に対してリクエストをしたいのですが、トップ画面の表示にはログインが必要なので、on_startにログイン処理を記述しています。
on_start はUserクラスのメソッドでユーザーが実行を開始する際に1度だけ呼び出されます。
from locust import HttpUser, task
from lxml import html
class QuickstartUser(HttpUser):
def on_start(self):
# ログイン処理
response = self.client.get("/login")
tree = html.fromstring(response.text)
auth_token = tree.xpath('//form/input[@name="authenticity_token"]/@value')[0]
self.client.post(
"/sessions",
json={
"login_id": "user00@example.com",
"password": "password", # パスワードを記述
"commit": "ログイン",
"authenticity_token": auth_token,
},
)
@task
def dashboards(self):
self.client.get("/dashboards")
lxml はauth_tokenを取るのに使いたかったので追加で pipenv install
でインストールしました。
テストの実行
locust のWebツールを起動します。
デフォルトの場合は http://0.0.0.0:8089
でlocustが起動します。
$ locust
locust —web-port 8088
のようにポートを変更することや、CUIで実行することもできます。
ブラウザでlocustの画面を表示するとこのような画面が表示されます。
- Number of users: 最大同時接続数
- Spawn rate: 1秒あたりに増加する接続数
- Host: リクエスト対象のホスト
を入力して、Start swarming
ボタンをクリックすることでテストが実行されます。
ひとまず、 Number of users
、 Spawn rate
のどちらも1で実行してみます。
テストを実行すると、テスト結果の画面が表示されます。
Chartsタブには
- Total Requests per Second
- RPS(Request per Second): 1秒あたりの総リクエスト数
- Failures/s: 1秒あたりのリクエストの失敗した数
- Response Times(ms)
- 50th percentile: 50%のユーザーのレスポンス時間
- 95th percentile: 95%のユーザーのレスポンス時間
- Number of Users
- Users: その時点のユーザー数
の3種類のチャートが表示されます。このチャートを元に分析していきます。
Number of usersを10にして実行してみた場合はこのようになりました。
おわりに
今回はlocustの動作を試しただけですが、テストスクリプトでタスクを増やしたり、タスクごとの重みづけをつけたりすることで実際の通信パターンを再現することもできます。
実際の負荷テストではテスト計画を立てた上で、監視ツールでテスト対象のサーバーやデータベースの状態を監視しながらテストを実行するため、前提として負荷テスト自体に関する理解の重要性を痛感しました。
以上、H.G.M Developers S.K でした。
Discussion