Перейти к основному контенту
Tech Path Finder
КурсыИнтервьюКод-ревьюБлог
Tech Path Finder

Персонализированный путеводитель в IT. Квизы, мок-интервью, код ревью и аналитика прогресса.

@potapov_me

Платформа

  • Курсы
  • Прогресс
  • Мок-интервью
  • Код ревью
  • Живое ревью с ИИ
  • Тренажёр переговоров
  • Закладки

Контент

  • Блог
  • Главная
  • Обратная связь

Компания

  • О проекте
  • Тарифы
  • Условия использования
  • Конфиденциальность
  • Согласие на обработку данных
  • Cookie
  • Реквизиты

Аккаунт

  • Войти
  • Зарегистрироваться
  • Профиль

© 2026 Tech Path Finder. Все права защищены.

·ИП Потапов К.С.·Политика конфиденциальности·
Сделано с ❤️ в России
  1. Распределённое тестирование: master/worker, Docker
distributed_testing

Распределённое тестирование: master/worker, Docker

Архитектура master/worker, запуск нескольких worker-процессов, Docker Compose для Locust.

Распределённое тестирование: master/worker, Docker

Один процесс Locust ограничен мощностью одной машины. Для генерации десятков тысяч пользователей нужен режим master/worker, где нагрузка распределяется между несколькими процессами или машинами.

#1. Когда нужно распределённое тестирование

Один Locust-процесс может генерировать примерно 500–1000 пользователей на современном сервере, прежде чем CPU генератора нагрузки сам становится узким местом. Если тестируемый сервис выдерживает больше — нужно несколько worker-процессов.

Признаки, что пора переходить на distributed режим:

  • CPU на машине с Locust стабильно выше 70–80% во время теста
  • Latency запросов кажется высокой, но тестируемый сервис показывает низкую загрузку
  • Нужно симулировать нагрузку из разных географических точек

#2. Архитектура master/worker

В distributed режиме один процесс работает как master, остальные — как worker:

  • Master управляет тестом: запускает/останавливает, собирает статистику от всех worker'ов, показывает Web UI. Master сам не генерирует нагрузку.
  • Worker выполняет задачи пользователей и отправляет статистику мастеру через ZeroMQ.

Все worker'ы должны иметь доступ к одному и тому же locustfile.py. При распределённом запуске на нескольких машинах файл нужно скопировать на каждую.

#3. Запуск master и worker локально

Для запуска нескольких 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'ами.

#4. Параметры порта

По умолчанию 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'ов на одной машине.

#5. Docker Compose для распределённого теста

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'а.

#6. Ожидание всех 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.

#7. Синхронизация данных между worker'ами

Иногда нужно, чтобы разные 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'а не будут использовать одинаковые тестовые учётные данные и не создадут конфликтов.

#8. Мониторинг распределённого теста

Web UI мастера показывает агрегированную статистику со всех worker'ов. Дополнительно в разделе Workers видно:

  • Сколько worker'ов подключено
  • Число пользователей на каждом worker'е
  • Статус каждого worker'а (ready, spawning, running, stopped)

Если worker падает во время теста, мастер перераспределяет его пользователей между оставшимися worker'ами автоматически.

Далее: Кастомные клиенты: FastHttpUser, WebSocket, gRPC