Архитектура master/worker, запуск нескольких worker-процессов, Docker Compose для Locust.
Один процесс Locust ограничен мощностью одной машины. Для генерации десятков тысяч пользователей нужен режим master/worker, где нагрузка распределяется между несколькими процессами или машинами.
Один Locust-процесс может генерировать примерно 500–1000 пользователей на современном сервере, прежде чем CPU генератора нагрузки сам становится узким местом. Если тестируемый сервис выдерживает больше — нужно несколько worker-процессов.
Признаки, что пора переходить на distributed режим:
В distributed режиме один процесс работает как master, остальные — как worker:
Все worker'ы должны иметь доступ к одному и тому же locustfile.py. При распределённом запуске на нескольких машинах файл нужно скопировать на каждую.
Для запуска нескольких worker'ов на одной машине откройте несколько терминалов.
Запуск master (с Web UI):
locust -f locustfile.py --masterЗапуск worker (повторить нужное число раз):
locust -f locustfile.py --worker --master-host=127.0.0.1По умолчанию worker подключается к localhost на порту 5557. Если master на другой машине, укажите её IP:
locust -f locustfile.py --worker --master-host=192.168.1.10После подключения всех worker'ов открываем Web UI мастера и запускаем тест как обычно. Locust равномерно распределит пользователей между worker'ами.
По умолчанию master слушает порт 5557 (для worker'ов) и 5558 (для heartbeat). Порты можно изменить:
# Master
locust -f locustfile.py --master --master-bind-port=6000
# Worker
locust -f locustfile.py --worker --master-host=127.0.0.1 --master-port=6000Это нужно, если порт 5557 занят или запускается несколько независимых master'ов на одной машине.
Docker Compose — удобный способ запустить master и несколько worker'ов на одной машине без ручного открытия терминалов:
version: "3.8"
services:
locust-master:
image: locustio/locust
ports:
- "8089:8089"
volumes:
- ./:/mnt/locust
command: -f /mnt/locust/locustfile.py --master
locust-worker:
image: locustio/locust
volumes:
- ./:/mnt/locust
command: -f /mnt/locust/locustfile.py --worker --master-host locust-master
depends_on:
- locust-master
deploy:
replicas: 4Запуск:
docker compose up --scale locust-worker=4После запуска откройте http://localhost:8089 — Web UI мастера отобразит 4 подключённых worker'а.
Если запустить тест до того, как все worker'ы подключились, часть пользователей будет потеряна. Флаг --expect-workers заставляет мастера ждать указанное число worker'ов перед стартом (работает только в headless-режиме):
locust -f locustfile.py --master --headless \
--users 1000 --spawn-rate 50 \
--expect-workers 4Мастер будет ждать 60 секунд (по умолчанию). Таймаут изменяется через --expect-workers-max-wait.
Иногда нужно, чтобы разные worker'ы использовали разные учётные данные (например, каждый worker — свой пул тестовых пользователей). Стандартный подход — использовать событие init_worker и индекс worker'а:
from locust import events
import json
users_data = []
@events.init.add_listener
def on_locust_init(environment, **kwargs):
global users_data
# Загружаем все данные
with open("test_users.json") as f:
all_users = json.load(f)
# Каждый worker получает свой срез данных по ID
worker_id = environment.runner.worker_index if hasattr(environment.runner, "worker_index") else 0
total_workers = environment.runner.worker_count if hasattr(environment.runner, "worker_count") else 1
users_data = all_users[worker_id::total_workers]Это гарантирует, что два worker'а не будут использовать одинаковые тестовые учётные данные и не создадут конфликтов.
Web UI мастера показывает агрегированную статистику со всех worker'ов. Дополнительно в разделе Workers видно:
Если worker падает во время теста, мастер перераспределяет его пользователей между оставшимися worker'ами автоматически.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.