はじめに
Python製負荷テストツールLocustにおいて、複数プロセスを協調動作させることで、並列化によりテスト対象ホストに大きな負荷をかけることができます。
本記事では、マルチコアのマシン1台でこれを実現する方法を紹介します。
なお、Web UIは使わないものとします。1
公式ドキュメントでは下のページで紹介されています。
以下では、前提として locust
の実行環境は整っているものとします。2
また、locustfileの書き方も特に解説しません。
動作確認環境
- locust 0.14.5
- Python 3.6.9
実行方法
下のようなシェルスクリプトを作成して、実行すればよいです。
#!/usr/bin/env bash
set -ux
# ログ、レポート出力先ディレクトリ作成
mkdir -p logs output
host=https://example.com # 試験対象ホスト
locustfile=yourlocustfile.py
slave_num=8 # slave数(並列数 - 1)
master_port=5557
max_clients=200 # 最大クライアント数
duration=90m # 総実行時間
step_clients=5 # クライアントの増加数 / インターバル
step_interval=1m # インターバル
# master
taskset -c 0 locust -f $locustfile --no-web \
-c $max_clients -t $duration -H $host \
--master --expect-slaves $slave_num --master-bind-port $master_port \
--step-load --step-clients $step_clients --step-time $step_interval \
--logfile logs/locust.master.log -L WARNING --csv output/locust.master \
&> /dev/null &
# slaves
for no in $(seq 1 ${slave_num}); do
taskset -c $no locust -f $locustfile --no-web \
-c $max_clients -H $host \
--slave --master-host 127.0.0.1 --master-port $master_port \
--logfile logs/locust.slave$no.log -L WARNING --csv output/locust.slave$no \
&> /dev/null &
done
解説
- masterプロセスと複数のslaveプロセスにより協調動作します。
- プロセスが動作するコアを指定するためにtaskset(1)コマンドを使っています。これが一番の肝です。
- master側で
--expect-slaves=N
オプションをつけることで、指定数のslaveが接続したことを待って試験を開始してくれます。 3 -
--step-load
の行はオプションです。Step Load Modeで段階的に負荷を上げたい場合にご利用下さい。 -
--csv
オプションにより、CSVで各種指標やログを記録します。 -
-L
オプションはログレベルです。デフォルトのINFO
だとCSVと情報が重複する部分が多いので、WARNING
で必要十分だと思います。ログをウォッチしておくとCPUリソース不足など問題があったときに気づけます。
補足
CPUリソース不足時の警告ログ
locust実行ホストのCPUリソースが足りない場合、以下のようなログが出ます。
このようなログが出た場合、期待した負荷をかけられないことが考えられるので、master-slave構成による並列化や、slave数の増加を考えた方が良いでしょう。
シングルプロセスのとき:
[2020-04-15 05:57:28,228] hostname/WARNING/root: Loadgen CPU usage above 90%! This may constrain your throughput and may even give inconsistent response time measurements! See https://docs.locust.io/en/stable/running-locust-distributed.html for how to distribute the load over multiple CPU cores or machines
master-slave構成で分散実行しているとき:
# master側
[2020-04-15 07:41:01,928] hostname/WARNING/locust.runners: Slave hostname_886b86153c0c4a839a5dc35a190be166 exceeded cpu threshold (will only log this once per slave)
[2020-04-15 07:43:50,863] hostname/WARNING/locust.runners: CPU usage threshold was exceeded on slaves during the test!
# slave側はシングルプロセスの場合と同じなので省略
脚注
-
Web UIを使う方法については、Python製負荷試験ツールLocustで、分散負荷試験環境を準備する - Qiitaなどで紹介されています。 ↩
-
locustのインストール方法はこちら: https://docs.locust.io/en/stable/installation.html ↩
-
https://docs.locust.io/en/stable/running-locust-without-web-ui.html#running-locust-distributed-without-web-ui ↩