Никому не нравится, когда его грузят. Только если это не микросервис в hh.ru.
Всем привет, меня зовут Илья, я бэкенд-разработчик в команде Архитектура. В этой статье я немного расскажу про нагрузочное тестирование.
Виды тестирования производительности
Принято выделять несколько видов тестирования. Latency testing — тестирование задержки, Throughput testing — тестирование пропускной способности. Endurance testing, оно же тестирование стабильности — это многочасовое тестирование со средним уровнем нагрузки. Проводится, например, для выявления утечек памяти.
Еще есть тестирование деградации (Degradation testing) — проверка работоспособности системы при снижении производительности или других проблемах. Capacity planning test проводится для определения ресурсов, необходимых для работы системы в заданных условиях. Стресс-тесты (Stress testing) проводятся для оценки работоспособности системы в результате непредвиденных обстоятельств, а также для выявления способности системы к регенерации.
И, конечно, нагрузочное тестирование — Load testing. Оно проводится для оценки производительности системы и времени отклика при заданной целевой нагрузке.
Как проводится нагрузочное тестирование в hh.ru
Что проверяем: дополнительно нагружаем сайт в прайм-тайм, используя данные аналитики для формирования пользовательских запросов, тем самым имитируя реальную нагрузку. Чем проверяем: для управления запусками тестов используем систему непрерывной интеграции Atlassian Bamboo. В качестве источника нагрузки используем Яндекс.Танк.
Как проверяем: подготавливаем данные и каждую неделю формируем профиль нагрузки. По описанию категории url-ов формируем относительные пропорции каждой категории в общей нагрузке на основании аналитических данных. Каждый день формируем запросы, которые будем отправлять — по профилю, с учетом пропорций и используя аналитику. Затем мы запускаем тесты и отправляем запросы, полученные на предыдущем шаге.
Для сбора и анализа результатов используем собственный плагин для Яндекс.Танка. Благо, инструмент предоставляет возможности для расширения. Результаты отправляются в корпоративный мессенджер. В сводке можно найти информацию о продолжительности статистики ответов и ошибок. Ошибки анализируются, и уже на основании результатов анализа принимаются меры для повышения стабильности сайта.
Технологии и инструменты
В компании существует потребность в нагрузочном тестировании отдельных сервисов: как в прод, так и в тест-окружении. Цель — контроль возможной деградации. Чтобы закрыть данную потребность, мы разработали сервис для управления нагрузочными тестами на базе нашего опенсорс-фреймворка frontik, а под капотом используем Яндекс.Танк. Сервис предоставляет возможность запускать и останавливать тесты, получать информацию об их состоянии, а также сохранять и переиспользовать пресеты параметров, с которыми они будут запускаться.
Как я уже говорил ранее, Яндекс.Танк расширяется с помощью плагинов. Поэтому для отправки уведомлений и сбора и анализа результатов мы смогли легко использовать те плагины, которые у нас уже были. Мы решили использовать именно Яндекс.Танк, поскольку у нас уже был опыт эксплуатации инструмента, нам нравилась расширяемость, мы понимаем принципы его работы, а еще нам важно иметь возможность переиспользовать кодовую базу.
Сам Яндекс.Танк написан на Python и предоставляет удобный API, поэтому нам не составило особого труда интегрировать его во frontik и настроить необходимую обвязку. Бизнес-требования были такие: возможность сохранения и переиспользования параметров, доступ к истории запусков, возможность выполнения по расписанию и гарантированно остановить выполнение по запросу в любой момент. Кроме того, в сервисе реализована дополнительная логика, например, по взаимодействию с базой данных и работе с сигналами операционной системы. А еще — удобная интеграция с внутренними ресурсами экосистемы hh.ru.
Взаимодействовать с сервисом можно как из командной строки, так и с помощью графического интерфейса, интегрированного в административную панель сайта. Благодаря этому наши команды могут запускать индивидуальные тесты для конкретных сервисов и на основании полученных данных проводить мероприятия направленные на повышение стабильности сайта. Сейчас покажу, как это работает.
Говорим и показываем
Вместо заключения просто покажу, как все это выглядит. Графический интерфейс сервиса состоит из нескольких страниц. На этой странице осуществляется конфигурация тестов с помощью пресетов:
Пресет — это переиспользуемый набор параметров, их можно создавать, изменять и удалять. Есть небольшие удобства в виде фильтрации, но самое интересное — отсюда запускаются тесты.
После запуска посмотреть состояние и некоторую дополнительную информацию можно на следующей странице, где отображаются все тесты:
Для удобства можно пользоваться фильтрацией. Также, на этой странице присутствует важная штука — кнопка остановки:
В идеальном мире ручной остановкой пользоваться не предполагается, так как тесты в состоянии остановиться самостоятельно в случае ошибок или увеличения времени отклика. Все это благодаря возможностям конфигурирования Яндекс.Танка.
И напоследок: последняя страница в нашем интерфейсе — это страница с информацией о конкретном запуске:
На ней можно увидеть подробную информацию о тесте с некоторой служебной информацией, которая может пригодиться при отладке.