Нагрузочные тесты - Backend
INFO
Нагрузочные тесты - это часть репозитория Backend, единственная задача которой - проверка, выдерживает ли Backend заданное число запросов в секунду.
Тестирование MQTT
Команда для запуска:
make test-load-mqttили
uv run python -m tests.load.load_test_mqttПозволяет создать синтетическую нагрузку в виде Unit, отправляющих MQTT сообщения. Дополнительные ENV переменные Backend позволяют настроить нагрузку:
| Переменная | По умолчанию | Значения | Что делает |
|---|---|---|---|
PU_TEST_LOAD_MQTT_DURATION | 120 | 1–3600 | Время выполнения теста в секундах |
PU_TEST_LOAD_MQTT_UNIT_COUNT | 100 | 1–1024 | Число Unit, которые будут выполнять запросы |
PU_TEST_LOAD_MQTT_RPS | 200 | 1–1024 | Нагрузка, которую будет создавать каждый Unit |
PU_TEST_LOAD_MQTT_VALUE_TYPE | Text | Text / Number | Тип отправляемых значений |
PU_TEST_LOAD_MQTT_DUPLICATE_COUNT | 10 | 1–32 | Число повторяющихся сообщений подряд |
PU_TEST_LOAD_MQTT_MESSAGE_SIZE | 15 | 1–512 | Размер MQTT сообщений в символах |
PU_TEST_LOAD_MQTT_POLICY_TYPE | TimeWindow | LastValue / NRecords / TimeWindow / Aggregation | Тип политики DataPipe для обработки всех сообщений в тесте |
PU_TEST_LOAD_MQTT_WORKERS | 10 | 1–128 | Число процессов multiprocessing, создающих нагрузку |
DANGER
Backend использует всегда только 1 воркер Gunicorn для обработки MQTT сообщений. Он способен обработать ~4000 rps сообщений из системных топиков domain.com/+/+/+/pepeunit. Для топиков DataPipe c паттерном domain.com/+/pepeunit количество сообщений может составлять ~25000 rps.
Тестирование REST и GQL
Команда для запуска:
make test-load-restили
uv run locust -f tests/load/locustfile.pyПозволяет создать синтетическую нагрузку на публичные ручки Instance. Дополнительные ENV переменные Backend:
| Переменная | По умолчанию | Значения | Что делает |
|---|---|---|---|
LOCUST_HEADLESS | True | True / False | CLI формат работы locust |
LOCUST_USERS | 400 | 1–8192 | Число виртуальных Пользователей, которые будут создавать нагрузку |
LOCUST_SPAWN_RATE | 10 | 1–8192 | Нарастание числа виртуальных Пользователей в секунду. При значениях по умолчанию 400 пользователей появятся за 40 секунд |
LOCUST_RUN_TIME | 120 | 1–3600 | Время выполнения теста в секундах |
INFO
По умолчанию проверяются публичные ручки текущего инстанса:
GET /pepeunit/api/v1/instances/currentGET /pepeunit/api/v1/instancesPOST /pepeunit/graphql-getInstancesUrlsPOST /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