Нагрузочное тестирование с помощью Яндекс.Танка
TRANSCRIPT
Александр Титула-Бойченко
Нагрузочное тестирование с помощью Яндекс.Танка
15 Апреля 2014
Зачем нужно нагрузочное тестирование?
2
15 Апреля 2014
Зачем нужно нагрузочное тестирование?
3
Downtime - это очень дорого
• eBay offline — $90K / час (1999)
• Financial company down — $100K / час
• Amazon offline — $1M / час (2008)
• Если у вас «настоящий» Hi-Load ~ $50K / час
15 Апреля 2014
Зачем нужно нагрузочное тестирование?
4
Availability % Downtime/year Loss @$50K/h
90 % 36.5 days 43 800 000 $
95 % 18.25 days 21 900 000 $
98 % 7.30 days 8 760 000 $
99 % 3.65 days 4 380 000 $
99,5 % 1.83 days 2 196 000 $
99,8 % 17.52 hours 876 000 $
99,9 % 8.76 hours 438 000 $
99,95 % 4.38 hours 219 000 $
99,99 % 52.6 minutes 43 833 $
99,999 % 5.26 minutes 4 383 $
99,9999 % 31.5 seconds 438 $
15 Апреля 2014
Зачем нужно нагрузочное тестирование?
5
Медленный сайт - прямые потери
• 100 ms задержка = на 1% падают продажи (Amazon)
• 400 ms задежка = 5-9% уменьшение трафика (Yahoo!)
• 500 ms задержка = 20% уменьшение трафика (Google)
Виды тестирования «под нагрузкой»
6
Виды тестирования «под нагрузкой»
7
Load testing (нагрузочное тестирование)
• Какова максимально выдерживаемая нагрузка?
• Какой у нас есть запас по прочности?
• Через какое время запаса по прочности не хватит?
• Где наше узкое место?
Виды тестирования «под нагрузкой»
8
Performance testing (тестирование производительности)
• Насколько быстро отвечает мой сервис/компонент?
• Насколько быстро он будет отвечать через полгода?
• Когда мой сервис/компонент начнет отвечать слишком медленно?
Виды тестирования «под нагрузкой»
9
Resource utilization testing (тестирование ресурсов)
• Сколько и каких ресурсов используется при работе сервиса/компонента?!
• Какой запас по ресурсам у нас есть?
• В какой вид ресурса мы упираемся? Как нам решить эту проблему?
Виды тестирования «под нагрузкой»
10
Stress testing (стресс тестирование)
• Как умирает моя система/компонент?
• Как проходит процесс восстановления?
Виды тестирования «под нагрузкой»
11
Volume testing (Обьемное тестирование)
• Как будет работать моя система при продакшен-объёмах данных? !
• Что будет с производительностью моей системы при увеличении объемов данных?!
• Когда у меня начнутся проблемы из-за объёма данных?
Виды тестирования «под нагрузкой»
12
Stability testing (тестирование стабильности)
• Что происходит с моей системой/компонентом под длительной постоянной нагрузкой?!
• Не ухудшается ли производительность со временем?
• Как потребляются ресурсы с течением времени?
Яндекс.Танк
13
Яндекс.Танк
14
Яндекс.Танк — представитель инструментов нагрузочного тестирования интернет-сервисов. !Позволяет эмулировать нагрузку реальных пользователей на сервер. !С помощью дополнительных инструментов позволяет находить узкие места, блокировки и неоптимальные настройки приложения.
Яндекс.Танк
15
Установка (Ubuntu)
sudo apt-get install python-software-properties!
sudo add-apt-repository ppa:yandex-load/main!
sudo apt-get update!
sudo apt-get install yandex-load-tank-base!
* При высоких RPS требуется тюнинг сетевого стека Linux https://yandextank.readthedocs.org/en/latest/install.html
Яндекс.Танк
16
Терминология
Танк — источник нагрузки
Мишень — объект нагрузки
Стрельба — тест
Патрон — запрос к объекту нагрузки
Лента — последовательность запросов
Яндекс.Танк
17
Особенности
• Python
• Hit-based
• Асинхронный
• Open-source
• Консольный ( Linux-only)
• Модульный
Яндекс.Танк
18
Что умеет?
• HTTP/HTTPS/Stateless
• IPv4/IPv6
• До 100к запросов/cек
• Подробная статистика
• Мониторинг
• Графики, BFG, ab, jmeter, autostop, custom scripts, etc…
Яндекс.Танк
19
Hit-based
• Нет сценариев, совсем
• Оперируем запросами
• Полный контроль над каждым запросом
• Сведение сценариев к hit-based
Яндекс.Танк
20
Виды сценариев нагрузки
• Линейная (плавная)
• Постоянная
• Ступенчатая
Яндекс.Танк
21
Линейная
line (1,100, 30s)
Яндекс.Танк
22
Линейная
line (100, 50, 30s)
Яндекс.Танк
23
Постоянная
const (40, 30s)
Яндекс.Танк
24
Ступенчатая
step (1,100, 5, 5s)
Яндекс.Танк
25
Сценарии можно комбинировать
line(10,100,10s) const(110, 10s) step(110, 30, 20, 5s)
Яндекс.Танк
26
Подготовка к стрельбе
• Убедиться, что из-под танка доступна мишень (telnet target-ip 80)!
• Убедиться, что сервера находятся «рядом» и пакеты ходят по минимальному маршруту(traceroute targethost)!
• Убедиться, что не включены никакие Anti-DDoS средства на мишени или фаерволе.
Яндекс.Танк
27
Типичный тест
• Конфигурация стрельбы
• Подготовка патронов
• Генерация ленты
• Процесс стрельбы
• Создание отчетов и артефактов
• Хуки (опционально)
Яндекс.Танк
28
Мой первый тест
• Создаем файл load.ini
[phantom]!address=127.0.0.1:8081!rps_schedule=line(1,100,1m)!uris = /index.html!
• Запускаем команду yandex-tank
Яндекс.Танк
29
Яндекс.Танк
30
Яндекс.Танк
31
Яндекс.Танк
32
Яндекс.Танк
33
Яндекс.Танк
34
Яндекс.Танк
35
Яндекс.Танк
36
Яндекс.Танк
37
Яндекс.Танк
38
Яндекс.Танк
39
Более сложный вариант
[phantom]!address=some-site.com:443!rps_schedule=line(1,100,1m) const(100,1h)!ssl=1!headers = [Accept-Encoding: gzip]! [Cookie: some-cookies]!uris = /! /search?q=hello! /cart/list.php
Яндекс.Танк
40
А что если надо еще сложнее?
[phantom]!address=some-site.com!rps_schedule=line(1,100,1m) const(100,1h)
Яндекс.Танк
41
А что если надо еще сложнее?
• Создаем файл ammo.txt
85 tag!POST / HTTP/1.1!Host: example.com!Content-Length:5!Connection: Close!!
Hello!!
• Запускаем команду yandex-tank ammo.txt
Яндекс.Танк
42
Лента запросов
85 send-hello!POST / HTTP/1.1!Host: example.com!Content-Length:5!Connection: Close!!Hello !84 send-word!POST / HTTP/1.1!Host: example.com!Content-Length:4!Connection: Close!!word!
Яндекс.Танк
43
Еще варианты?
• В качестве ленты запросов можно использовать Access.log
• Подготовка ленты запросов из HAR файлов браузера
Яндекс.Танк
44
Что еще?
• Стрельба по нескольким мишеням
• Стрельба из нескольких IP
• Правила для автоматический остановки стрельбы
• Стрельба по базам данных
• Расширяемость плагинами
• Возможность стрелять практически по любой мишени (BFG - пушка)
Яндекс.Танк
45
Поиск узких мест — мониторинг
• Поддерживается только Linux
• Необходим безпарольный доступ по SSH c танка к мишени
• Можно мониторить несколько серверов
Яндекс.Танк
46
Что можно мониторить?
• CPU: idle, user, system, iowait, nice
• System: la, csw, int, numproc, numthreads
• Memory: free, used, cached, buff
• Disk: read, write
• Net: recv, send, default, tx, rx, retransmit, estab, closewait, timewait!
• Custom: tail - прочитать файл, call - выполнить произвольную команду
Яндекс.Танк
47
Лог файл
• Текстовый формат
• Простой (аналог CSV)
• Подробный
• Легко импортировать в любой удобный для вас инструмент (Excel, DB, gnuplot, etc.. )!
• Доступны онлайн-сервисы (http://loadosophia.org)!
• Отправка статистики стрельбы в Graphite
Яндекс.Танк
48
Лог стрельбы
1373894905.154 register 12211 637 29 11356 189 11931 833 285 0 200!
1373894906.151 login 5571 729 31 4668 143 5303 567 237 0 200!
1373894906.162 buy 22257 433 27 21662 135 22047 694 262 0 200!
1373894906.174 cart 10619 621 31 9822 145 10390 684 262 0 200!
1373894906.186 checkout 9745 420 26 9173 126 9552 676 262 0 200!
1373894906.209 logout 9894 442 28 9323 101 9720 674 262 0 200!
!
time, tag, interval_real, connect_time, send_time, latency, receive_time, interval_event, size_out, size_in, net_code proto_code
Яндекс.Танк
49
Артефакты
• Находятся в папке вида — 2014-04-15_16-00-00.*
• phout_*.log — хранилище не агрегированных данных
• load.ini — конфиг стрельбы
• answ_*.log — подробный лог запросов и ответов (опция)
• phantom_*.log — внутренней логи танка
• monitoring_*.xml — настройки мониторинга
• monitoring_*.data — лог мониторинга
Полезные ссылки
50
• Phantom — https://github.com/mamchits/phantom
• Танк — https://github.com/yandex-load/yandex-tank
• Документация танка — https://yandextank.readthedocs.org
• Клуб на Я.ру — http://clubs.ya.ru/yandex-tank/
• Loadosophia — https://loadosophia.org
• HAR в ammo.txt — https://github.com/banzalik/har2ammo
• Firebat console — http://firebat-console.readthedocs.org/
Вопросы?
51