Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)
-
Upload
alexey-lavrenuke -
Category
Software
-
view
194 -
download
14
Transcript of Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)
Нагрузочное тестирование Яндекс.Танком
Алексей Лавренюк 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