LoginSignup
25
28

More than 1 year has passed since last update.

Locustを触ってみた

Last updated at Posted at 2020-01-26

概要

  • これまでJmeterを使っていたが、別の負荷試験ツールにも触れてみたくなったのでLocustにチャレンジ
  • とりあえず動かしてみる
  • 実務で使いながら随時更新

この記事ではLocust 1系を前提にまとめています。
Locust 2系については以下でまとめています。

参考

環境構築

  • ここではCentOSベースのサーバーに構築
# pythonのバージョンを確認
# 2020/01時点のサポートバージョンは「2.7, 3.5, 3.6, 3.7, 3.8」
python --version
> Python 2.7.5

# pipがすでに入っていれば不要
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
pip --version

# locustインストール
python -m pip install locustio
locust --version
  • 高負荷なテストを行いたい場合、file open数も気にしておく
  • 仮に同時に300リクエストを実効するテストを行いたい場合file openも300以上にしておく必要がある
# 確認
ulimit -n
> 65535

# 変更したい場合
vi /etc/security/limits.conf

とりあえず動くところまで

準備

locustfile.py
from locust import HttpLocust, TaskSet, task, between, constant

class UserBehavior(TaskSet):
    @task(1)
    def profile(self):
        self.client.get("/sample", verify=False)

class WebsiteUser(HttpLocust):
    task_set = UserBehavior
    wait_time = constant(0)
  • verify=Falseはhttpsで通信する時にエラーが出たので付与
    • pythonになれてなくてsslのあれこれがよくわかってない...
  • pathにはプロトコルや、ホストは記載しない
    • あとでUIで入力する

起動

locust
# これと一緒
# locust -f ./locustfile.py
  • 8089ポートでUIが起動する
スクリーンショット 2020-01-26 21.12.09.png
  • Number of total users to simulate
    • 想定ユーザー数
    • アクセス元のスレッド数と考えても良さそう
    • 目標rps = ユーザー数 / (レスポンスタイム + time wait)
  • Hatch rate
    • 例えば10と設定すると1秒間に10ずつユーザー数が増えていく
    • maxは「Number of total users to simulate」の設定値
  • Host
    • プロトコル+ホスト+ポートを指定
    • http://localhost:8080とか

Start swarmingで起動!

Chartsタブを見ると試験状況が確認できる!

スクリーンショット 2020-01-26 21.30.13.png

master/slave構成

  • locustはmaster/slaveを使用することでスケーリング可能
  • master/slaveの管理のためにこれ以降dockerを使用する

docker準備

インストール手順は省略
以下のコマンドが叩けることを確認

docker-compose --version
docker --version

single構成をdockerで

Dockerfile
FROM python

RUN pip install locustio

WORKDIR /locust
COPY ./locustfile.py .

CMD ["locust"]

起動

docker run -d \
    -p 8089:8089 \
    --name locust locust

# ストップ&削除
# docker stop locust
# docker rm locust

次はdocker-composeで

docker-compose.yml
version: '3'
services:
  locust-single:
    build: .
    ports:
      - "8089:8089"

起動

docker-compose up -d

docker ps
# CONTAINER ID        IMAGE                  COMMAND             CREATED             STATUS              PORTS                    NAMES
# d836d979d4b5        locust_locust-single   "locust"            10 seconds ago      Up 9 seconds        0.0.0.0:8089->8089/tcp   locust_locust-single_1

master/slave

  • 起動用シェル作成
    • 環境変数によってモードを切り替え
run.sh
#!/bin/bash

echo "mode: $MODE"

if [ "$MODE" == 'master' ]; then
  locust --master
elif [ "$MODE" == 'slave' ]; then
  locust --slave --master-host=locust-master
fi
  • Dockerfileを修正
    • ./run.shを呼び出す
Dockerfile
FROM python

RUN pip install locustio

WORKDIR /locust
COPY ./locustfile.py .
COPY ./run.sh .

ENTRYPOINT ["./run.sh"]
  • docker-compose.ymlを修正
    • slaveは一旦3台
docker-compose.yml
version: '2'
x-locust-service: &locust-service
  build: .
services:
  locust-master:
    <<: *locust-service
    ports:
      - "8089:8089"
    environment:
      MODE: master
  locust-slave-1:
    <<: *locust-service
    environment:
      MODE: slave
  locust-slave-2:
    <<: *locust-service
    environment:
      MODE: slave
  locust-slave-3:
    <<: *locust-service
    environment:
      MODE: slave

起動!

docker-compose -f docker-compose-master-slave.yml up -d
# 開発時は毎回build
# docker-compose -f docker-compose-master-slave.yml up -d --build
スクリーンショット 2020-01-26 23.42.39.png

slavesが3になってる!!!

25
28
1

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
25
28