Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

33

Transcript of Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Page 1: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)
Page 2: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Нагрузочное тестирование Яндекс.Танком

Алексей Лавренюк PyCon 2014

Page 3: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Зачем проводить нагрузочное тестирование?

3

Page 4: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Не хватило ресурсов

время

обсл

ужен

ные

клие

нты

макс. производительностьож

идае

мый рос

т

испорченная репутация

потери

Page 5: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Узкие места в архитектуре

- выбрали решение, основываясь на советах и рекламе

- получили низкую производительность именно в вашем случае

- потеряли время и ресурсы на переделку с нуля

5

…на ней правда можно возить сервера?

Page 6: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Масштабируемость

- стало не хватать ресурсов

- добавили второй сервер

- производительность выросла незначительно

- потеряли ресурсы и время на глубокую переделку в авральном режиме

6

если что, добавим второй тоннель

whoops!

Page 7: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Задача нагрузочного тестирования

Управление рисками, связанными с производительностью:

идентификация

анализ

мониторинг

7

Page 8: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Этапы нагрузочного тестирования

сбор информации

подготовка стенда и инструментов

тестирование

анализ результатов

8

Page 9: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Яндекс.Танк

9

Page 10: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Что такое Яндекс.Танк?

open-source продукт

не генератор, а удобная обертка над генераторами

написан на Python

быстрый генератор на C++ (phantom)

поддержка JMeter

10

Page 11: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Функция танка

превратить описание стрельбы и тестовые данные в отчет путем проведения тестирования

load.ini

ammo report.html

Page 12: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Архитектура танка

12

Page 13: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Общая архитектурная схема

на сторонемишеньки

Page 14: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Конфигурация

Каждый следующий — переопределяет и дополняет опции предыдущего:

системный конфиг

пользовательский конфиг

конфиг стрельбы

опции командной строки

Список плагинов тоже определяется конфигом. Т. е., можно подключить плагин из конфига стрельбы и даже из командной строки.

14

Page 15: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Жизненный цикл теста

Page 16: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Модуль поддержки phantom

внешняя стрелялка C++ (подробнее — позже)

генерит файл с результатами

его читает агрегатор

Page 17: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Агрегатор, консоль, автостопы

агрегатор — собрать информацию у стрелялки посекундно

консольный вывод: статистика по текущей стрельбе, мониторинг, и другое — через виджеты

автостопы — по критериям на основе мониторинга и статистики стрельбы

Page 18: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Отчеты

данные собираются в .json

.json кладется в .html (генерится по шаблону)

этот .html содержит js-ку, которая динамически строит графики

шаблоны кастомизируемые

Page 19: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Мониторинг

на мишеньки (и, возможно, не только) раскладываются агенты

агенты собирают данные и шлют обратно

все через SSH

Page 20: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

phantom

20

Page 21: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Стрелялка на базе phantom

веб-сервер + клиент

standalone приложение на C++

асинхронный ввод-вывод: корутиновый движок

можно запускать без танка, но не нужно

выжимали 500 000 RPS в идеальных условиях

на вход ждет конфиг и файл с патронами с проставленными временами

21

Page 22: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Прегенерация патронов

size-prefixed формат: заголовок + запрос

заголовок: размер (следующего запроса), время, метка

тела запросов полностью: включая http-заголовки, данные форм

можно произвольные данные, даже бинарные

текущая версия степпера: 65 000 - 200 000 патронов в секунду

22

Page 23: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Архитектура степпера

Page 24: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Входные форматы патронов

/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

маркер

размер

Page 25: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Формат phantom

86 12349 clck_page GET /clck/page?data=hello HTTP/1.1 Host: example.org Accept-Encoding: gzip,deflate

патрон — tuple

выходной формат — заголовок + тело запроса

маркервремя

отправки

размер

Page 26: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Расписания

rps_schedule=line(1, 10, 10s) const(10, 15m) line(10, 100, 20s)

композиция шагов разного типа

знаем зависимость rps от времени

нужно зависимость ts от номера патрона

постоянныйлинейный участок снова линейный

Page 27: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Генерация таймстемпов

27

время

время

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

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

Page 28: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

BFG

28

Page 29: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Эксперимент BFG

экспериментальная пушка на Python

можно написать свою стрелялку и передать ее в BFG через конфиг

thrift, mysql, …

ответственность на вас

2000 RPS в локальный nginx — хватает для многих кейсов даже в Яндексе

29

Page 30: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Архитектура BFG

постановказадач

агрегация результатов

стрельбав мишень

Page 31: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Планы и чаяния

доработка и верификация BFG

быстрая и простая стрелялка на Java

система конфигурирования и автодокументирование опций

распределенные тесты

обновление и унификация онлайн и офлайн отчетов

31

Page 32: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Спасибо за внимание!

Алексей Лавренюк, Яндекс twitter: @direvius

Page 33: Load Testing with Yandex.Tank (in russian, PyCon Russia 2014)

Ссылки

https://github.com/yandex-load/yandex-tank — репозиторий Я.Танка

http://clubs.ya.ru/yandex-tank/ — клуб на Я.ру

33