Нагрузочное тестирование - это оценка производительности и устойчивости работы системы. В статье расскажу, что это и как можно попробовать запустить.
Нагрузочное тестирование используется для проверки работоспособности бэкенд приложений (или например SSR у фронтенда) под высокой нагрузкой и способности ее выдерживать. Позволяет понять при какой нагрузке ваше приложение может "упасть".
Профессионалы в области как правило делят оценку производительности и нагрузочное тестирование, но я постараюсь описать общую схему которая бы позволила провести и начать внедрять нагрузочное тестирование у вас на практике.
Метрики
В работе используются следующие метрики:
- Время отклика - время от начала отправки запроса до момента получения. Измеряется в миллисекундах, при оценке итоговых результатов делят в срезах по перцентилям. Чуть ниже опишу, что это значит.
- Среднее время - время в среднем сколько составил ответ от сервера
- Пиковое время - максимальное время которое потребовалось для ответа
- Количество пользователей - как ведет себя система при определенном количестве пользователей. Уже включает в себя сценарный план типовых действий и отправки нескольких запросов. Таких сценариев как правило несколько. Например сценарий визита пользователя страницы с балансом: зашел на сайт, получил данные с эндпоинта по проверке аутентификации, запросил информацию о балансе.
- Количество запросов в секунду (RPS) - как ведет себя эндпоинт в рамках конкретного запроса. Хотя иногда может высчитывается в целом по системе, но как правило это размытые данные и лучше делить по эндпоинтам для наглядности.
- Количество ошибок - какое количество ошибок/отказов в обслуживании возникает при определенной нагрузке.
Перцентиль
Теперь, что такое перцентиль в рамках нагрузочного тестирования - это срез процента запросов которые выполняются за указанное время. Например запись ниже говорит о том, что в 99.5% случаях общее время отклика составило 334 мс.
Percentiles (all/last 1m/last), ms:
99.5% < 334.0 316.0 316.0
Существует несколько видов тестов:
- Стресс тесты - проверка работоспособности системы под возрастающей нагрузкой
- Тесты выносливости - проверка работоспособности системы под длительной нагрузкой
Ниже я буду описывать механику под стресс тесты, но фактически ничего не мешает проверять аналогично тесты выносливости за изменением некоторых настроек.
Практика
Теперь перейдем непосредственно к практике.
В идеальном варианте нагрузочное тестирование внедряется:
- В процесс CI/CD одним из этапов
- В скрам процесс при решении бэкенд задач, где тестируются новые эндпоинты специалистами по нагрузочному тестированию или тестировщиками с соответствующими навыками.
Средства реализации
Инструментов для проведения нагрузочного тестирования существует немало: JMeter, Yandex Tank, Yandex Cloud Load Testing, K6 и т.д.
Я остановлюсь на Yandex Tank. Пример ниже будет реализован для него.
Предположим, у нас есть HTTP эндпоинт который принимает на вход параметр числового значения методом GET. Сам эндпоинт: /counter/{\d+}
Нам нужно посмотреть, как он ведет себя под нагрузкой.
Составим конфиг для Yandex Tank:
phantom:
address: app:8080
uris:
- /counter/1
- /counter/2
- /counter/3
- /counter/4
- /counter/5
load_profile:
load_type: rps
schedule: line(100, 5000, 3m)
console:
enabled: true
telegraf:
enabled: false
Разумеется, что на практике значений гораздо больше, чем от 1 до 5.
Поэтому, можно использовать:
- ammo generators в Яндекс Танк (ammofile вместо uris)
- заботливые ручонки и просто вставить урлы в список uris для GET запросов
Результаты теста:
- До 1000 RPS: 99.5 перцентиль ≤2 мс
- Свыше 1000 RPS: деградация до 665 мс
- При 5000 RPS: стабилизация около 540 мс
Как видим, наше приложение стабильно держит нагрузку до 5000 RPS при среднем отклике 500мс без отказов в обслуживании.
PS. Ранее Yandex Tank позволял загружать отчеты на сервис Overload (https://overload.yandex.net/), но в начале марта 2023 года сервис закрылся. Теперь предлагается переезд на Yandex Cloud Load Testing.
Обязательно подписывайтесь на канал! И буду очень признателен, если напишите в комментариях, интересен ли вам контент такого технического плана!
----
🚀 Читайте мои посты раньше всех — подписывайтесь на мой Телеграм канал! 🚀