Нагрузочное
тестирование
Яндекс.Танком
Алексей Лавренюк
PyCon 2014
Зачем проводить нагрузочное
тестирование?
3
Не хватило ресурсов
время
обслуженныеклиенты
макс. производительность
ожидаемыйрост
испорченная репутация
потери
Узкие места в архитектуре
- выбрали решение, основываясь на советах
и рекламе
- получили низкую производительность
именно в вашем случае
- потеряли время и ресурсы на переделку с
нуля
5
…на ней правда
можно возить сервера?
Масштабируемость
- стало не хватать ресурсов
- добавили второй сервер
- производительность выросла
незначительно
- потеряли ресурсы и время на глубокую
переделку в авральном режиме
6
если что, добавим
второй тоннель
whoops!
Задача нагрузочного тестирования
Управление рисками, связанными с
производительностью:
идентификация
анализ
мониторинг
7
Этапы нагрузочного тестирования
сбор информации
подготовка стенда и инструментов
тестирование
анализ результатов
8
Яндекс.Танк
9
Что такое Яндекс.Танк?
open-source продукт
не генератор, а удобная обертка над
генераторами
написан на Python
быстрый генератор на C++ (phantom)
поддержка JMeter
10
Функция танка
превратить описание стрельбы и тестовые данные
в отчет путем проведения тестирования
load.ini
ammo report.html
Архитектура танка
12
Общая архитектурная схема
на стороне

мишеньки
Конфигурация
Каждый следующий — переопределяет и дополняет опции предыдущего:
системный конфиг
пользовательский конфиг
конфиг стрельбы
опции командной строки
Список плагинов тоже определяется конфигом. Т. е., можно подключить
плагин из конфига стрельбы и даже из командной строки.
14
Жизненный цикл теста
Модуль поддержки phantom
внешняя стрелялка C++
(подробнее — позже)
генерит файл с результатами
его читает агрегатор
Агрегатор, консоль, автостопы
агрегатор — собрать
информацию у стрелялки
посекундно
консольный вывод: статистика
по текущей стрельбе,
мониторинг, и другое — через
виджеты
автостопы — по критериям на
основе мониторинга и
статистики стрельбы
Отчеты
данные собираются в .json
.json кладется в .html
(генерится по шаблону)
этот .html содержит js-ку,
которая динамически строит
графики
шаблоны кастомизируемые
Мониторинг
на мишеньки (и, возможно, не
только) раскладываются
агенты
агенты собирают данные и
шлют обратно
все через SSH
phantom
20
Стрелялка на базе phantom
веб-сервер + клиент
standalone приложение на C++
асинхронный ввод-вывод: корутиновый движок
можно запускать без танка, но не нужно
выжимали 500 000 RPS в идеальных условиях
на вход ждет конфиг и файл с патронами с проставленными временами
21
Прегенерация патронов
size-prefixed формат: заголовок + запрос
заголовок: размер (следующего запроса), время, метка
тела запросов полностью: включая http-заголовки, данные форм
можно произвольные данные, даже бинарные
текущая версия степпера: 65 000 - 200 000 патронов в секунду
22
Архитектура степпера
Входные форматы патронов
/my/page
/my/other/page
список url, access.log, …
автомаркировка на базе
содержимого
фильтры на базе содержимого и
маркера
86 clck_page
GET /clck/page?data=hello HTTP/1.1
Host: example.org
Accept-Encoding: gzip,deflate
маркер
размер
Формат phantom
86 12349 clck_page
GET /clck/page?data=hello HTTP/1.1
Host: example.org
Accept-Encoding: gzip,deflate
патрон — tuple
выходной формат — заголовок +
тело запроса
маркер
время

отправки
размер
Расписания
rps_schedule=line(1, 10, 10s) const(10, 15m) line(10, 100, 20s)
композиция шагов разного типа
знаем зависимость rps от
времени
нужно зависимость ts от номера
патрона
постоянныйлинейный участок снова линейный
Генерация таймстемпов
27
время
время
запросы

в секунду
запросы

в секунду
BFG
28
Эксперимент BFG
экспериментальная пушка на Python
можно написать свою стрелялку и передать ее в BFG через конфиг
thrift, mysql, …
ответственность на вас
2000 RPS в локальный nginx — хватает для многих кейсов даже в
Яндексе
29
Архитектура BFG
постановка

задач
агрегация
результатов
стрельба

в мишень
Планы и чаяния
доработка и верификация BFG
быстрая и простая стрелялка на Java
система конфигурирования и автодокументирование опций
распределенные тесты
обновление и унификация онлайн и офлайн отчетов
31
Спасибо за внимание!
Алексей Лавренюк, Яндекс
twitter: @direvius
Ссылки
https://github.com/yandex-load/yandex-tank — репозиторий Я.Танка
http://clubs.ya.ru/yandex-tank/ — клуб на Я.ру
33

Нагрузочное тестирование с помощью Яндекс.Танк - Алексей Лавренюк, PyCon RU 2014)