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