Skip to content

Нагрузочные тесты - Backend

INFO

Нагрузочные тесты - это часть репозитория Backend, единственная задача которой - проверка, выдерживает ли Backend заданное число запросов в секунду.

Тестирование MQTT

Команда для запуска:

bash
make test-load-mqtt

или

bash
uv run python -m tests.load.load_test_mqtt

Позволяет создать синтетическую нагрузку в виде Unit, отправляющих MQTT сообщения. Дополнительные ENV переменные Backend позволяют настроить нагрузку:

ПеременнаяПо умолчаниюЗначенияЧто делает
PU_TEST_LOAD_MQTT_DURATION12013600Время выполнения теста в секундах
PU_TEST_LOAD_MQTT_UNIT_COUNT10011024Число Unit, которые будут выполнять запросы
PU_TEST_LOAD_MQTT_RPS20011024Нагрузка, которую будет создавать каждый Unit
PU_TEST_LOAD_MQTT_VALUE_TYPETextText / NumberТип отправляемых значений
PU_TEST_LOAD_MQTT_DUPLICATE_COUNT10132Число повторяющихся сообщений подряд
PU_TEST_LOAD_MQTT_MESSAGE_SIZE151512Размер MQTT сообщений в символах
PU_TEST_LOAD_MQTT_POLICY_TYPETimeWindowLastValue / NRecords / TimeWindow / AggregationТип политики DataPipe для обработки всех сообщений в тесте
PU_TEST_LOAD_MQTT_WORKERS101128Число процессов multiprocessing, создающих нагрузку

DANGER

Backend использует всегда только 1 воркер Gunicorn для обработки MQTT сообщений. Он способен обработать ~4000 rps сообщений из системных топиков domain.com/+/+/+/pepeunit. Для топиков DataPipe c паттерном domain.com/+/pepeunit количество сообщений может составлять ~25000 rps.

Тестирование REST и GQL

Команда для запуска:

bash
make test-load-rest

или

bash
uv run locust -f tests/load/locustfile.py

Позволяет создать синтетическую нагрузку на публичные ручки Instance. Дополнительные ENV переменные Backend:

ПеременнаяПо умолчаниюЗначенияЧто делает
LOCUST_HEADLESSTrueTrue / FalseCLI формат работы locust
LOCUST_USERS40018192Число виртуальных Пользователей, которые будут создавать нагрузку
LOCUST_SPAWN_RATE1018192Нарастание числа виртуальных Пользователей в секунду. При значениях по умолчанию 400 пользователей появятся за 40 секунд
LOCUST_RUN_TIME12013600Время выполнения теста в секундах

INFO

По умолчанию проверяются публичные ручки текущего инстанса:

  • GET /pepeunit/api/v1/instances/current
  • GET /pepeunit/api/v1/instances
  • POST /pepeunit/graphql - getInstancesUrls
  • POST /pepeunit/graphql - getInstancesRegistries

WARNING

Время ожидания клиентом до отправки следующего запроса составляет 1 секунду, соответственно rps ~= числу пользователей. Нагрузка делится между REST и GQL классами пользователей

DANGER

REST и GQL запросы обрабатываются многопоточно, увеличение числа воркеров почти линейно увеличивает число обрабатываемых запросов в единицу времени. 4 воркера Gunicorn выдерживают ~400rps без перезагрузок. Процентили в миллисекундах:

Type     Name                                    50%    66%    75%    80%    90%    95%    98%    99%  99.9% 99.99%   100% # reqs
--------|------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
GET      /pepeunit/api/v1/instances              11     14     17     19     28     44     82    110    260    550    550   9600
GET      /pepeunit/api/v1/instances/current      11     14     16     18     27     41     78    110    290    400    400   9697
POST     gql:getInstancesRegistries              12     15     17     19     26     38     62     84    200    540    540   9614
POST     gql:getInstancesUrls                    12     14     17     18     27     40     64     93    350    540    540   9686
--------|------------------------------------|--------|------|------|------|------|------|------|------|------|------|------|------
         Aggregated                              12     14     17     19     27     41     71    100    260    540    550  38597