Найти в Дзене
Мысли CTO [CTO Thoughts]

Нагрузочное тестирование

Оглавление

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

Пример проведения нагрузочного тестирования
Пример проведения нагрузочного тестирования

Нагрузочное тестирование используется для проверки работоспособности бэкенд приложений (или например 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.

Обязательно подписывайтесь на канал! И буду очень признателен, если напишите в комментариях, интересен ли вам контент такого технического плана!

----

🚀 Читайте мои посты раньше всех — подписывайтесь на мой Телеграм канал! 🚀

Мысли CTO [CTO Thoughts]