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

52
Александр Титула-Бойченко Нагрузочное тестирование с помощью Яндекс.Танка 15 Апреля 2014

Upload: alex-boychenko

Post on 15-Jun-2015

1.723 views

Category:

Internet


6 download

TRANSCRIPT

Page 1: Нагрузочное тестирование с помощью Яндекс.Танка

Александр Титула-Бойченко

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

15 Апреля 2014

Page 2: Нагрузочное тестирование с помощью Яндекс.Танка

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

2

Page 3: Нагрузочное тестирование с помощью Яндекс.Танка

15 Апреля 2014

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

3

Downtime - это очень дорого

• eBay offline — $90K / час (1999)

• Financial company down — $100K / час

• Amazon offline — $1M / час (2008)

• Если у вас «настоящий» Hi-Load ~ $50K / час

Page 4: Нагрузочное тестирование с помощью Яндекс.Танка

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 $

Page 5: Нагрузочное тестирование с помощью Яндекс.Танка

15 Апреля 2014

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

5

Медленный сайт - прямые потери

• 100 ms задержка = на 1% падают продажи (Amazon)

• 400 ms задежка = 5-9% уменьшение трафика (Yahoo!)

• 500 ms задержка = 20% уменьшение трафика (Google)

Page 6: Нагрузочное тестирование с помощью Яндекс.Танка

Виды тестирования «под нагрузкой»

6

Page 7: Нагрузочное тестирование с помощью Яндекс.Танка

Виды тестирования «под нагрузкой»

7

Load testing (нагрузочное тестирование)

• Какова максимально выдерживаемая нагрузка?

• Какой у нас есть запас по прочности?

• Через какое время запаса по прочности не хватит?

• Где наше узкое место?

Page 8: Нагрузочное тестирование с помощью Яндекс.Танка

Виды тестирования «под нагрузкой»

8

Performance testing (тестирование производительности)

• Насколько быстро отвечает мой сервис/компонент?

• Насколько быстро он будет отвечать через полгода?

• Когда мой сервис/компонент начнет отвечать слишком медленно?

Page 9: Нагрузочное тестирование с помощью Яндекс.Танка

Виды тестирования «под нагрузкой»

9

Resource utilization testing (тестирование ресурсов)

• Сколько и каких ресурсов используется при работе сервиса/компонента?!

• Какой запас по ресурсам у нас есть?

• В какой вид ресурса мы упираемся? Как нам решить эту проблему?

Page 10: Нагрузочное тестирование с помощью Яндекс.Танка

Виды тестирования «под нагрузкой»

10

Stress testing (стресс тестирование)

• Как умирает моя система/компонент?

• Как проходит процесс восстановления?

Page 11: Нагрузочное тестирование с помощью Яндекс.Танка

Виды тестирования «под нагрузкой»

11

Volume testing (Обьемное тестирование)

• Как будет работать моя система при продакшен-объёмах данных? !

• Что будет с производительностью моей системы при увеличении объемов данных?!

• Когда у меня начнутся проблемы из-за объёма данных?

Page 12: Нагрузочное тестирование с помощью Яндекс.Танка

Виды тестирования «под нагрузкой»

12

Stability testing (тестирование стабильности)

• Что происходит с моей системой/компонентом под длительной постоянной нагрузкой?!

• Не ухудшается ли производительность со временем?

• Как потребляются ресурсы с течением времени?

Page 13: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

13

Page 14: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

14

Яндекс.Танк — представитель инструментов нагрузочного тестирования интернет-сервисов. !Позволяет эмулировать нагрузку реальных пользователей на сервер. !С помощью дополнительных инструментов позволяет находить узкие места, блокировки и неоптимальные настройки приложения.

Page 15: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

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

Page 16: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

16

Терминология

Танк — источник нагрузки

Мишень — объект нагрузки

Стрельба — тест

Патрон — запрос к объекту нагрузки

Лента — последовательность запросов

Page 17: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

17

Особенности

• Python

• Hit-based

• Асинхронный

• Open-source

• Консольный ( Linux-only)

• Модульный

Page 18: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

18

Что умеет?

• HTTP/HTTPS/Stateless

• IPv4/IPv6

• До 100к запросов/cек

• Подробная статистика

• Мониторинг

• Графики, BFG, ab, jmeter, autostop, custom scripts, etc…

Page 19: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

19

Hit-based

• Нет сценариев, совсем

• Оперируем запросами

• Полный контроль над каждым запросом

• Сведение сценариев к hit-based

Page 20: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

20

Виды сценариев нагрузки

• Линейная (плавная)

• Постоянная

• Ступенчатая

Page 21: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

21

Линейная

line (1,100, 30s)

Page 22: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

22

Линейная

line (100, 50, 30s)

Page 23: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

23

Постоянная

const (40, 30s)

Page 24: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

24

Ступенчатая

step (1,100, 5, 5s)

Page 25: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

25

Сценарии можно комбинировать

line(10,100,10s) const(110, 10s) step(110, 30, 20, 5s)

Page 26: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

26

Подготовка к стрельбе

• Убедиться, что из-под танка доступна мишень (telnet target-ip 80)!

• Убедиться, что сервера находятся «рядом» и пакеты ходят по минимальному маршруту(traceroute targethost)!

• Убедиться, что не включены никакие Anti-DDoS средства на мишени или фаерволе.

Page 27: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

27

Типичный тест

• Конфигурация стрельбы

• Подготовка патронов

• Генерация ленты

• Процесс стрельбы

• Создание отчетов и артефактов

• Хуки (опционально)

Page 28: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

28

Мой первый тест

• Создаем файл load.ini

[phantom]!address=127.0.0.1:8081!rps_schedule=line(1,100,1m)!uris = /index.html!

• Запускаем команду yandex-tank

Page 29: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

29

Page 30: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

30

Page 31: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

31

Page 32: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

32

Page 33: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

33

Page 34: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

34

Page 35: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

35

Page 36: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

36

Page 37: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

37

Page 38: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

38

Page 39: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

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

Page 40: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

40

А что если надо еще сложнее?

[phantom]!address=some-site.com!rps_schedule=line(1,100,1m) const(100,1h)

Page 41: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

41

А что если надо еще сложнее?

• Создаем файл ammo.txt

85 tag!POST / HTTP/1.1!Host: example.com!Content-Length:5!Connection: Close!!

Hello!!

• Запускаем команду yandex-tank ammo.txt

Page 42: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

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!

Page 43: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

43

Еще варианты?

• В качестве ленты запросов можно использовать Access.log

• Подготовка ленты запросов из HAR файлов браузера

Page 44: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

44

Что еще?

• Стрельба по нескольким мишеням

• Стрельба из нескольких IP

• Правила для автоматический остановки стрельбы

• Стрельба по базам данных

• Расширяемость плагинами

• Возможность стрелять практически по любой мишени (BFG - пушка)

Page 45: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

45

Поиск узких мест — мониторинг

• Поддерживается только Linux

• Необходим безпарольный доступ по SSH c танка к мишени

• Можно мониторить несколько серверов

Page 46: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

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 - выполнить произвольную команду

Page 47: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

47

Лог файл

• Текстовый формат

• Простой (аналог CSV)

• Подробный

• Легко импортировать в любой удобный для вас инструмент (Excel, DB, gnuplot, etc.. )!

• Доступны онлайн-сервисы (http://loadosophia.org)!

• Отправка статистики стрельбы в Graphite

Page 48: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

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

Page 49: Нагрузочное тестирование с помощью Яндекс.Танка

Яндекс.Танк

49

Артефакты

• Находятся в папке вида — 2014-04-15_16-00-00.*

• phout_*.log — хранилище не агрегированных данных

• load.ini — конфиг стрельбы

• answ_*.log — подробный лог запросов и ответов (опция)

• phantom_*.log — внутренней логи танка

• monitoring_*.xml — настройки мониторинга

• monitoring_*.data — лог мониторинга

Page 50: Нагрузочное тестирование с помощью Яндекс.Танка

Полезные ссылки

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/

Page 51: Нагрузочное тестирование с помощью Яндекс.Танка

Вопросы?

51

Page 52: Нагрузочное тестирование с помощью Яндекс.Танка

Александр Титула-Бойченко [email protected]

@banzalik

15 Апреля 2014