Locust on Ubuntu — PythonでシナリオベースのAPIストレステスト

開発環境

Locust は Python で負荷テストシナリオを書けるオープンソースツールです。locustfile.py@task デコレータでリクエストを定義するだけで、数十〜数千ユーザーの同時アクセスをシミュレートできます。ブラウザで動くWeb UIとCLIのヘッドレスモードを両方持っているので、「手で確認したい」と「CIで回したい」のどちらにも対応します。

この記事では Ubuntu 24.04 LTS に Locust 2.44.4 をインストールし、Flask のテストサーバーに対して実際に負荷テストを実行した結果を載せます。

この記事のポイント

  • Ubuntu 24.04 では pip install locust を直接実行すると PEP 668 エラーになる——必ず python3 -m venv で仮想環境を作ってから入れる
  • @task(weight) の数字で「どのエンドポイントに何割アクセスするか」を比率で指定できる
  • 実測: 20ユーザー / 15秒で 270 リクエスト、エラー率 0%、スループット 19.4 req/s
  • ヘッドレスモード(--headless)で UI なしのバッチ実行・CSV出力が可能
  • Web UI はデフォルト localhost:8089 で立ち上がり、リアルタイムでグラフを確認できる

動作確認済み環境

項目 バージョン・詳細
OS Ubuntu 24.04 LTS(Noble Numbat)
Python Python 3.12.3(Docker ubuntu:24.04 実測)
Locust 2.44.4(pip install / 2026-06-22)
実行環境 docker run ubuntu:24.04 / ホスト直接インストール

インストール手順

手順1:システムパッケージを更新する

まず apt でリポジトリ情報を更新し、Python 関連のパッケージを入れます。




ubuntu@linuxlab: ~
$ sudo apt update
Hit:1 http://archive.ubuntu.com/ubuntu noble InRelease
Reading package lists… Done
$ sudo apt install -y python3 python3-venv python3-pip
Setting up python3-venv (3.12.3-0ubuntu2) …
Setting up python3-pip (24.0+dfsg-1ubuntu1) …
$ python3 –version
Python 3.12.3

手順2:仮想環境(venv)を作って Locust をインストールする

Ubuntu 24.04 では PEP 668 の制限により、システムの Python に直接 pip install するとエラーになります。必ず python3 -m venv で仮想環境を作ってから入れてください。正直、最初にこれで詰まりました。

注意:Ubuntu 24.04 で pip install が通らない場合

error: externally-managed-environment と表示されたら PEP 668 によるブロックです。--break-system-packages を使うとシステムの Python が壊れるリスクがあります。必ず venv を使ってください。




ubuntu@linuxlab: ~/myapp
$ python3 -m venv locust-env
$ source locust-env/bin/activate
(locust-env) $
(locust-env) $ pip install locust
Collecting locust
Downloading locust-2.44.4-py3-none-any.whl
Installing collected packages: gevent, flask, … locust
Successfully installed locust-2.44.4
(locust-env) $ locust –version
locust 2.44.4 from locust-env/lib/python3.12/site-packages/locust (Python 3.12.3)
Locust インストール実ログ(Ubuntu 24.04 LTS)実測
Locust インストール実ログ(Ubuntu 24.04 LTS)実測

インストール時に flaskgeventgeventhttpclientpython-socketio など Web UI と分散実行に必要なパッケージが一緒に入ります。

locustfile.py の書き方

Locust は locustfile.py というファイルにテストシナリオを定義します。最小構成は次のとおりです。




locustfile.py
from locust import HttpUser, task, between

class APIUser(HttpUser):
wait_time = between(0.5, 1.5) # リクエスト間の待ち時間(秒)
host = “http://localhost:5000”

@task(3) # 全体の 3/8 の割合で実行
def index(self):
self.client.get(“/”)

@task(2) # 全体の 2/8
def api_users(self):
self.client.get(“/api/users”)

@task(2) # 全体の 2/8(重めのエンドポイントを同比率でテスト)
def api_search(self):
self.client.get(“/api/search”)

@task(1) # 全体の 1/8(最低頻度)
def api_health(self):
self.client.get(“/api/health”)
locustfile.py の構造説明図(illustrative)
locustfile.py の構造説明図(illustrative)

ポイントは @task の括弧内の数字です。@task(3)@task(2)@task(2)@task(1) を並べると、3:2:2:1 の比率で各タスクが実行されます。実際の API の使われ方に近い比率に合わせると、より実態に即したテストになります。

wait_time を短くするほどユーザー1人あたりのリクエスト頻度が上がります。between(0.5, 1.5) は「0.5〜1.5秒のランダムな間隔」という意味で、実際のユーザーの操作感に近い揺らぎを再現できます。

Web UI でテストを実行する

locust コマンドを引数なしで実行すると、ブラウザで操作できる Web UI が起動します。




ubuntu@linuxlab: ~/myapp
(locust-env) $ locust -f locustfile.py –host http://localhost:5000
[INFO/locust.main] Starting Locust 2.44.4
[INFO/locust.main] Starting web interface at http://0.0.0.0:8089
ブラウザで http://localhost:8089 を開いてください

①起動直後の設定画面

ブラウザで http://localhost:8089 を開くと、ユーザー数とスポーンレートを設定する画面が表示されます。

Locust Web UI 起動直後のテスト設定画面(実撮影)
Locust Web UI 起動直後のテスト設定画面(実撮影)

「Number of users」に同時接続ユーザー数、「Spawn rate」に1秒あたりの増加人数を入れて「Start」を押します。今回は 10 ユーザー、スポーンレート 2 で実行しました。

②テスト実行中のダッシュボード

テストが始まるとリアルタイムでリクエスト数・レスポンスタイム・エラー数が更新されます。

Locust Web UI テスト実行中ダッシュボード(実撮影)
Locust Web UI テスト実行中ダッシュボード(実撮影)

③Charts ビュー

上部タブの「Charts」を選ぶと、スループット(req/s)・レスポンスタイム・同時ユーザー数の推移グラフをリアルタイムで確認できます。

Locust Web UI Charts ビュー(実撮影)
Locust Web UI Charts ビュー(実撮影)

「Stop」ボタンを押してテストを止めると、最終集計が画面に残ります。「Download Data」からCSVレポートをダウンロードすることもできます。

ヘッドレスモードで自動実行する

CI/CDパイプラインや定期実行では --headless フラグを使います。ブラウザを開かずにテストを走らせ、結果を CSV に保存できます。




ubuntu@linuxlab: ~/myapp
(locust-env) $ locust -f locustfile.py \
–headless \
–users 20 \
–spawn-rate 5 \
–run-time 15s \
–csv result \
–host http://localhost:5000
[INFO/locust.main] Starting Locust 2.44.4
[INFO/locust.runners] Ramping to 20 users at a rate of 5.00 per second
Type Name # reqs # fails | Avg Min Max Med | req/s
GET / 87 0 | 1 0 3 1 | 6.25
GET /api/users 77 0 | 1 0 9 1 | 5.53
GET /api/search 67 0 | 8 4 11 8 | 4.81
GET /api/health 39 0 | 1 0 4 1 | 2.80
Aggregated 270 0 | 2 0 11 2 | 19.38
Locust ヘッドレスモード実出力(実測)
Locust ヘッドレスモード実出力(実測)

実測値:20ユーザー・15秒で 270リクエスト、エラー率 0%、スループット 19.4 req/s。レスポンスタイムの中央値は 2ms(/api/search は sleep 処理を含むため 8ms)でした。

実測結果:エンドポイント別の詳細統計

ヘッドレステストで取得した CSV データを集計した結果です。

Locust ヘッドレステスト実測結果テーブル(実測)
Locust ヘッドレステスト実測結果テーブル(実測)

注目点は /api/search のレスポンスタイムです。意図的に 3〜10ms の遅延を入れていたためで、中央値が他のエンドポイントの 5 倍になっています。実際のサービスでも「遅いエンドポイントを特定してボトルネックを探る」という使い方がよくあります。

Ubuntu 22.04 と 24.04 のインストール方法の違い

Ubuntu バージョン別インストール比較(実測)
Ubuntu バージョン別インストール比較(実測)

Ubuntu 22.04(Jammy)では pip3 install locust が venv なしでも通りますが、24.04(Noble)からは PEP 668 の施行で venv が事実上必須になりました。新規サーバーを立てるなら 24.04 + venv の組み合わせを選ぶのが今後の標準になります。

よくあるエラーと解決策

error: externally-managed-environment




ubuntu@linuxlab: ~
$ pip install locust
error: externally-managed-environment
× This environment is externally managed
To install packages, use python3 -m venv and pip inside it.

Ubuntu 24.04 特有のエラーです。python3 -m venv locust-env && source locust-env/bin/activate を先に実行してから pip install locust を実行してください。

Connection refused(Web UI に繋がらない)

Locust のプロセスが起動していない、またはポートが別アプリに使われています。




ubuntu@linuxlab: ~
$ ss -tlnp | grep 8089
LISTEN 0 128 0.0.0.0:8089 0.0.0.0:* users:((“locust”,…))
# 何も表示されなければ Locust が起動していない
$ locust -f locustfile.py –web-port 8090 # ポートを変える場合

No module named ‘locust’(venv 外で実行した)

仮想環境を有効化せずに locust コマンドを叩くと発生します。source locust-env/bin/activate を実行してから試してください。

仮想環境の有効化を忘れやすいポイント

ターミナルを開き直すたびに source locust-env/bin/activate が必要です。(.env) という表示がプロンプトに出ていれば有効化済みです。

まとめ

Ubuntu 24.04 への Locust セットアップの流れをまとめます。

  • Ubuntu 24.04 では venv を作ってから pip install locust する(PEP 668 のため)
  • locustfile.pyHttpUser クラスを定義し、@task(weight) でシナリオを書く
  • Web UI(localhost:8089)で GUI 操作、--headless で CLI 実行
  • ヘッドレスモードで --csv result を付けると詳細な統計 CSV が出力される
  • 実測: 20ユーザー・15秒で 270 リクエスト、エラー率 0%、スループット 19.4 req/s

VPS でテスト対象の API を動かしているなら、Locust を別のサーバーから実行すると実際のネットワーク遅延も含めた測定ができます。

本格的な負荷テスト環境を VPS に構築するなら、 も参考にしてください。

コメント

タイトルとURLをコピーしました