LoginSignup
8
8

More than 3 years have passed since last update.

Locustを1台のマシンで分散実行する(CLI編)

Last updated at Posted at 2020-04-22

はじめに

Python製負荷テストツールLocustにおいて、複数プロセスを協調動作させることで、並列化によりテスト対象ホストに大きな負荷をかけることができます。
本記事では、マルチコアのマシン1台でこれを実現する方法を紹介します。
なお、Web UIは使わないものとします。1

公式ドキュメントでは下のページで紹介されています。

以下では、前提として locust の実行環境は整っているものとします。2
また、locustfileの書き方も特に解説しません。

動作確認環境

  • locust 0.14.5
  • Python 3.6.9

実行方法

下のようなシェルスクリプトを作成して、実行すればよいです。

run-locust-distributed.sh
#!/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側はシングルプロセスの場合と同じなので省略

脚注

8
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
8