Олесь Писаренко "Открываем Яндекс.Танк"

107
Я.Субботник, Москва, 28 июля, 2012 года Олесь Писаренко Яндекс.Танк Руководитель службы нагрузочного тестирования

Upload: yandex

Post on 11-Nov-2014

8.036 views

Category:

Technology


4 download

DESCRIPTION

Инструмент нагрузочного тестирования Яндекс.Танк. Рассказ об истории возникновения инструмента, его возможностях и примерах использования.

TRANSCRIPT

Page 1: Олесь Писаренко "Открываем Яндекс.Танк"

Я.Субботник,  Москва,  28  июля,  2012  года  

 

 

 

Олесь  Писаренко  

Яндекс.Танк  

Руководитель службы нагрузочного тестирования

Page 2: Олесь Писаренко "Открываем Яндекс.Танк"

 

 

Содержание  

2  

Page 3: Олесь Писаренко "Открываем Яндекс.Танк"

•  Яндекс.Танк  

 

 

Содержание  

3  

Page 4: Олесь Писаренко "Открываем Яндекс.Танк"

•  Яндекс.Танк  

•  Особенности  

 

 

Содержание  

4  

Page 5: Олесь Писаренко "Открываем Яндекс.Танк"

•  Яндекс.Танк  

•  Особенности  

•  Простые  примеры  

 

 

Содержание  

5  

Page 6: Олесь Писаренко "Открываем Яндекс.Танк"

•  Яндекс.Танк  

•  Особенности  

•  Простые  примеры  

•  Немного  хардкора  

 

 

Содержание  

6  

Page 7: Олесь Писаренко "Открываем Яндекс.Танк"

•  Яндекс.Танк  

•  Особенности  

•  Простые  примеры  

•  Немного  хардкора  

•  Ссылки  

 

Содержание  

7  

Page 8: Олесь Писаренко "Открываем Яндекс.Танк"

Жаргонарий  

 

 

8  

Page 9: Олесь Писаренко "Открываем Яндекс.Танк"

Жаргонарий  

 

 

9  

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

 

Page 10: Олесь Писаренко "Открываем Яндекс.Танк"

Жаргонарий  

 

 

10  

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

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

 

Page 11: Олесь Писаренко "Открываем Яндекс.Танк"

Жаргонарий  

 

 

11  

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

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

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

 

Page 12: Олесь Писаренко "Открываем Яндекс.Танк"

Жаргонарий  

 

 

12  

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

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

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

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

 

Page 13: Олесь Писаренко "Открываем Яндекс.Танк"

Жаргонарий  

 

 

13  

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

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

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

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

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

Page 14: Олесь Писаренко "Открываем Яндекс.Танк"

Яндекс.Танк  

 

 

14  

Page 15: Олесь Писаренко "Открываем Яндекс.Танк"

Яндекс.Танк  

 

 

15  

l   Производительный  

 

Page 16: Олесь Писаренко "Открываем Яндекс.Танк"

Яндекс.Танк  

 

 

16  

l   Производительный  

l   Простой  

 

Page 17: Олесь Писаренко "Открываем Яндекс.Танк"

Яндекс.Танк  

 

 

17  

l   Производительный  

l   Простой  

l   Opensource  (as  is)  

Page 18: Олесь Писаренко "Открываем Яндекс.Танк"

Движок  Яндекс.Танка  

 

 

18  

Phantom:  

Высокопроизводительный  вебсервер,  прокси,  клиент.    

Разработчик  -­‐  Евгений  Мамчиц  

hips://github.com/mamchits/phantom  

 

Page 19: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  истории  

 

 

19  

Подробнее  здесь:  

«Вебсервер  Phantom»  

докладчик  Влад  Селиверстов  

hip://clck.ru/1Knyv  

 

Page 20: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  истории  

 

 

20  

О  нашем  инструменте:  

«Танки  в  Лунапарке»  

докладчик  Андрей  Кузьмичев  

hip://clck.ru/1Ko-­‐z  

 

Page 21: Олесь Писаренко "Открываем Яндекс.Танк"

Особенности  

21  

Page 22: Олесь Писаренко "Открываем Яндекс.Танк"

Особенности  

l   Консольный  

 

22  

Page 23: Олесь Писаренко "Открываем Яндекс.Танк"

Особенности  

l   Консольный  

l   Linux-­‐only  

 

23  

Page 24: Олесь Писаренко "Открываем Яндекс.Танк"

Особенности  

l   Консольный  

l   Linux-­‐only  

l   Hit-­‐based  

 

24  

Page 25: Олесь Писаренко "Открываем Яндекс.Танк"

Особенности  

l   Консольный  

l   Linux-­‐only  

l   Hit-­‐based  

l   Модульный  

25  

Page 26: Олесь Писаренко "Открываем Яндекс.Танк"

Что  умеет    

26  

Page 27: Олесь Писаренко "Открываем Яндекс.Танк"

Что  умеет    

l   HTTP/HTTPS/Stateless  

 

27  

Page 28: Олесь Писаренко "Открываем Яндекс.Танк"

Что  умеет    

l   HTTP/HTTPS/Stateless  

l   IPv4/IPv6  

 

28  

Page 29: Олесь Писаренко "Открываем Яндекс.Танк"

Что  умеет    

l   HTTP/HTTPS/Stateless  

l   IPv4/IPv6  

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

29  

Page 30: Олесь Писаренко "Открываем Яндекс.Танк"

Что  умеет    

l   HTTP/HTTPS/Stateless  

l   IPv4/IPv6  

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

l   «Раскладка»  времён  

 

30  

Page 31: Олесь Писаренко "Открываем Яндекс.Танк"

Что  умеет    

l   HTTP/HTTPS/Stateless  

l   IPv4/IPv6  

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

l   «Раскладка»  времён  

l   Многое  другое  

31  

Page 32: Олесь Писаренко "Открываем Яндекс.Танк"

Сразу  в  лоб  

Графиков  не  будет  

32  

Page 33: Олесь Писаренко "Открываем Яндекс.Танк"

Собрались  

33  

Page 34: Олесь Писаренко "Открываем Яндекс.Танк"

Установка  

 

 

34  

Требования:  

l   Ubuntu  Server/Desktop  

l   32/64bit  

l   Lucid/Precise  

Page 35: Олесь Писаренко "Открываем Яндекс.Танк"

Установка    

 

 

35  

# Ubuntu Lucid deb http://mirror.yandex.ru/mirrors/tank common main deb http://mirror.yandex.ru/mirrors/tank lucid main

Добавляем необходимые репозитории

# Ubuntu Precise deb http://mirror.yandex.ru/mirrors/tank common main deb http://mirror.yandex.ru/mirrors/tank precise main

Page 36: Олесь Писаренко "Открываем Яндекс.Танк"

Установка    

 

 

36  

$ sudo apt-get update

$ sudo apt-get install yandex-load-tank-base

$ dpkg -l | grep tank ii yandex-load-tank-base

Page 37: Олесь Писаренко "Открываем Яндекс.Танк"

Подготовка  $ lunapark ==== Welcome to Lunapark ==== Usage: lunapark AMMO-FILE [OPTIONS] Try `lunapark --help' for more information.

 

 

 

37  

$ nano load.conf

Page 38: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

Тестирование  HTTP  сервиса  постоянной  нагрузкой  в  10  рпс.    

Запрашиваем  корневую  страницу.    

 

 

38  

Page 39: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

39  

$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: uri = /

Page 40: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

40  

$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: uri = /

Page 41: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

41  

$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: uri = /

Page 42: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

42  

$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: uri = /

Page 43: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

43  

$ lunapark ==== Welcome to Lunapark ==== doctor-desktop.yandex.ru (doctor) phantom=0.14.0 yandex-load-tank=N/A ammo=/home/doctor/10/ammo_20120725-180420.txt ==== Stepper ==== Creating cases tree: 100% Case: 3. Ammo type: uri Ammo Generating: 100% lunapark: starting preproc... Done

Запускаем стрельбу

Page 44: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

44  

Page 45: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

45  

Page 46: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

46  

Page 47: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

47  

Page 48: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

48  

Page 49: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

49  

Page 50: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

50  

Page 51: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  1  

51  

Page 52: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  2  

Тестирование  HTTP  сервиса  линейно-­‐возрастающей  нагрузкой  до  100  рпс.    

Запрашиваем  корневую  страницу.    

Используем  IPv6  +  SSL  

 

 

52  

Page 53: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  2  

53  

$cat load.conf # Tank Config File address=0:0:0:0:0:0:0:1:443 # load = line (1,100,10m) #Схема нагрузки ssl=1 # включение режима SSL # Перечисление заголовков и GET запросов: uri = /

Page 54: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  2  

54  

Page 55: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  3  

Тестирование  HTTP  сервиса  ступенчато-­‐возрастающей  нагрузкой  до  100  рпс.    

Запрашиваем  корневую  страницу.    

Используем  IPv6  +  SSL  

 

 

55  

Page 56: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  3  

56  

$cat load.conf # Tank Config File address=0:0:0:0:0:0:0:1:443 # load = step (1,100,10,1m) #Схема нагрузки ssl=1 # включение режима SSL # Перечисление заголовков и GET запросов: uri = /

Page 57: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  3  

57  

Page 58: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  4  

Тестирование  HTTP  сервиса  c  прогревом,  линейно-­‐ступенчато-­‐возрастающей  нагрузкой  до  30  рпс  с  одним  «спайком»  до  100  рпс  и  плавным  снижением  нагрузки.    

Запрашиваем  корневую  страницу.    

Используем  IPv6  +  SSL  

 

 58  

Page 59: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  4  

59  

$cat load.conf # Tank Config File address=0:0:0:0:0:0:0:1:443 # load = const(1,1m), line(1,10,1m), step(10,30,10,1m) load = const(30,1m), const(100,1), line(100,1,1m) ssl=1 # включение режима SSL # Перечисление заголовков и GET запросов: uri = /

Page 60: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  4  

60  

Page 61: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  5  

Тестирование  HTTP  сервиса  постоянной  нагрузкой  10  рпс.    

Запрашиваем  несколько  страниц  с  определенными  заголовками.    

Используем  IPv6  +  SSL  

 

 61  

Page 62: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  5  

62  

$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: header_http = 1.1 header_connection = close header_host = example.com uri = / uri = /buy

Page 63: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  5  

63  

$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: header_http = 1.1 header_connection = close header_host = example.com uri = / uri = /buy

Page 64: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  5  

64  

$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: header_http = 1.1 header_connection = close header_host = example.com uri = / uri = /buy

Page 65: Олесь Писаренко "Открываем Яндекс.Танк"

Пример  5  

65  

$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: header_http = 1.1 header_connection = close header_host = example.com uri = / uri = /buy

Page 66: Олесь Писаренко "Открываем Яндекс.Танк"

Это  были  цветочки  

66  

Page 67: Олесь Писаренко "Открываем Яндекс.Танк"

Да  сколько  можно!?  

 

 

67  

Потерпите,  мы  уже  прошли  половину  

Page 68: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

 

 

68  

Page 69: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

 

 

69  

Что делать в сложных случаях ?

Page 70: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

 

 

70  

Как выглядит обычный HTTP запрос?

Page 71: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

 

 

71  

Request-Line

Request Headers

Data (OPTIONAL)

Page 72: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

 

 

72  

POST / HTTP/1.1

Host: example.com Content-Length:3 Connection: Close

uho

Page 73: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

 

 

73  

Запрос для Яндекс.Танка будет таким:

80 POST / HTTP/1.1 Host: example.com Content-Length:3 Connection: Close uho

Page 74: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

 

 

74  

Запрос для Яндекс.Танка будет таким:

80 POST / HTTP/1.1 Host: example.com Content-Length:3 Connection: Close uho

Page 75: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

 

 

75  

Запрос для Яндекс.Танка будет таким:

80 POST / HTTP/1.1 Host: example.com Content-Length:3 Connection: Close uho Сохраним этот запрос в файл ammo.txt

Page 76: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

 

 

76  

Упростим load.conf

$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: header_http = 1.1 header_connection = close header_host = target.yandex.net uri = / uri = /buy

Page 77: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

 

 

77  

Упростим load.conf

$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: header_http = 1.1 header_connection = close header_host = target.yandex.net uri = / uri = /buy

Page 78: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

 

 

78  

Упростим load.conf

$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки

Page 79: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

79  

$ lunapark ammo.txt ==== Welcome to Lunapark ==== doctor-desktop.yandex.ru (doctor) phantom=0.14.0 yandex-load-tank=N/A ammo=/home/doctor/10/ammo.txt ==== Stepper ==== Creating cases tree: 100% Case: 3. Ammo type: request Ammo Generating: 100% lunapark: starting preproc... Done

Запускаем стрельбу

Page 80: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

80  

$ lunapark ammo.txt ==== Welcome to Lunapark ==== doctor-desktop.yandex.ru (doctor) phantom=0.14.0 yandex-load-tank=N/A ammo=/home/doctor/10/ammo.txt ==== Stepper ==== Creating cases tree: 100% Case: 3. Ammo type: request Ammo Generating: 100% lunapark: starting preproc... Done

Запускаем стрельбу

Page 81: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

81  

Ура! Стреляет!

Page 82: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

82  

А теперь склеим несколько запросов и запишем их в файл ammo.txt друг за другом

Page 83: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

83  

80 POST / HTTP/1.1 Host: example.com Content-Length:3 Connection: Close uho

80 POST / HTTP/1.1 Host: example.com Content-Length:3 Connection: Close nos

80 POST / HTTP/1.1 Host: example.com Content-Length:3 Connection: Close rot

+

+

=

Page 84: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

84  

Мы получили «ленту» запросов

Page 85: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

85  

Мы получили «ленту» запросов

Page 86: Олесь Писаренко "Открываем Яндекс.Танк"

Немного  хардкора  

86  

$ lunapark ammo.txt ==== Welcome to Lunapark ==== doctor-desktop.yandex.ru (doctor) phantom=0.14.0 yandex-load-tank=N/A ammo=/home/doctor/10/ammo.txt ==== Stepper ==== Creating cases tree: 100% Case: 3. Ammo type: request Ammo Generating: 100% lunapark: starting preproc... Done

Запуск аналогичен одиночному запросу:

Page 87: Олесь Писаренко "Открываем Яндекс.Танк"

Можно  перед0хнУть  

87  

Page 88: Олесь Писаренко "Открываем Яндекс.Танк"

Еще  немного...  

88  

Page 89: Олесь Писаренко "Открываем Яндекс.Танк"

Еще  немного...  

89  

$ head phout* ==> phout_20120725-172045.txt <== 1343222446.181 front_page 1533 273 29 1002 229 1238 18 297 0 200 1343222446.288 front_page 1261 681 14 519 47 1144 18 297 0 200 1343222446.388 front_page 926 365 18 506 37 830 18 297 0 200 1343222446.488 front_page 883 242 11 600 30 811 18 297 0 200 1343222446.588 front_page 521 214 9 267 31 437 18 297 0 200 1343222446.688 front_page 877 228 15 524 110 720 18 297 0 200 1343222446.788 front_page 1240 677 15 506 42 1145 18 297 0 200 1343222446.888 front_page 1102 319 16 722 45 1006 18 297 0 200 1343222446.988 front_page 857 246 14 552 45 757 18 297 0 200

Все результаты теста сбрасываются в файл phout.txt

Page 90: Олесь Писаренко "Открываем Яндекс.Танк"

Еще  немного...  

90  

phout.txt - основное хранилище не агрегированных данных

Page 91: Олесь Писаренко "Открываем Яндекс.Танк"

Еще  немного...  

91  

Формат phout.txt хорошо описан в документации

Page 92: Олесь Писаренко "Открываем Яндекс.Танк"

Еще  немного...  

92  

Формат phout.txt хорошо описан в документации Зачем?

Page 93: Олесь Писаренко "Открываем Яндекс.Танк"

Затем,  что...  

93  

phout.txt

loadosophia

DB

API

gnuplot

JS

Excel

???

Page 94: Олесь Писаренко "Открываем Яндекс.Танк"

А  могу  ли  я...?  Да!  

94  

POST

GET

WEBDAV GZIP

COOKIE

POP3

SMTP URLENCODE

MULTIPART

CGI PARAM

SPIKE TEST THREAD TEST

REQ FILE

TAGS

LOOP

CUSTOM TIMINGS

HEADERS

RECOVERY TEST

Page 95: Олесь Писаренко "Открываем Яндекс.Танк"

А  могу  ли  я...?  Да!  

95  

POST

GET

WEBDAV GZIP

COOKIE

POP3

SMTP URLENCODE

MULTIPART

CGI PARAM

SPIKE TEST THREAD TEST

REQ FILE

TAGS

LOOP

CUSTOM TIMINGS

HEADERS

RECOVERY TEST README.TXT

Page 96: Олесь Писаренко "Открываем Яндекс.Танк"

Почти  всё  

96  

Page 97: Олесь Писаренко "Открываем Яндекс.Танк"

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

 

 

97  

Приготовились ...3..2..1

Page 98: Олесь Писаренко "Открываем Яндекс.Танк"

Phantom  

 

 

98  

http://clck.ru/1KRej

Евгений Мамчиц

Page 99: Олесь Писаренко "Открываем Яндекс.Танк"

Phantom  ARM    

 

 

99  

http://clck.ru/1KRhJ

Дмитрий Билунов

Page 100: Олесь Писаренко "Открываем Яндекс.Танк"

Phantom  Docs    

 

 

100  

http://clck.ru/1KRhX

Григорий Комиссаров

Page 101: Олесь Писаренко "Открываем Яндекс.Танк"

Firebat  console    

 

 

101  

http://clck.ru/1KRhp

Григорий Комиссаров

Page 102: Олесь Писаренко "Открываем Яндекс.Танк"

Loadosophia    

 

 

102  

http://clck.ru/1KodD

Андрей Похилько

Page 103: Олесь Писаренко "Открываем Яндекс.Танк"

Яндекс.Танк    

 

 

103  

http://clck.ru/1KRiB

Page 104: Олесь Писаренко "Открываем Яндекс.Танк"

Yandex-­‐load    

 

 

104  

http://clck.ru/1KRiP

Page 105: Олесь Писаренко "Открываем Яндекс.Танк"

Спасибо  этим  ребятам!    

 

 

105  

Page 106: Олесь Писаренко "Открываем Яндекс.Танк"

Вопросы  

 

 

106  

Page 107: Олесь Писаренко "Открываем Яндекс.Танк"

Руководитель  службы  НТ  

doctor@yandex-­‐team.ru  

twiier:  @doctornkz  

 

Олесь  Писаренко