Arquitectura de Computadores I Memoria Cache. Memoria PrincipalMemoria Cache.
Яндекс.Танк&cache-ash04.cdn.yandex.net/.../msk_pisarenko.pdf ·...
Transcript of Яндекс.Танк&cache-ash04.cdn.yandex.net/.../msk_pisarenko.pdf ·...
Я.Субботник, Москва, 28 июля, 2012 года
Олесь Писаренко
Яндекс.Танк
Руководитель службы нагрузочного тестирования
Содержание
2
• Яндекс.Танк
Содержание
3
• Яндекс.Танк
• Особенности
Содержание
4
• Яндекс.Танк
• Особенности
• Простые примеры
Содержание
5
• Яндекс.Танк
• Особенности
• Простые примеры
• Немного хардкора
Содержание
6
• Яндекс.Танк
• Особенности
• Простые примеры
• Немного хардкора
• Ссылки
Содержание
7
Жаргонарий
8
Жаргонарий
9
l Танк — источник нагрузки
Жаргонарий
10
l Танк — источник нагрузки
l Мишень — объект нагрузки
Жаргонарий
11
l Танк — источник нагрузки
l Мишень — объект нагрузки
l Стрельба — тест
Жаргонарий
12
l Танк — источник нагрузки
l Мишень — объект нагрузки
l Стрельба — тест
l Патрон — запрос к объекту нагрузки
Жаргонарий
13
l Танк — источник нагрузки
l Мишень — объект нагрузки
l Стрельба — тест
l Патрон — запрос к объекту нагрузки
l Лента — последовательность запросов
Яндекс.Танк
14
Яндекс.Танк
15
l Производительный
Яндекс.Танк
16
l Производительный
l Простой
Яндекс.Танк
17
l Производительный
l Простой
l Opensource (as is)
Движок Яндекс.Танка
18
Phantom:
Высокопроизводительный вебсервер, прокси, клиент.
Разработчик -‐ Евгений Мамчиц
hips://github.com/mamchits/phantom
Немного истории
19
Подробнее здесь:
«Вебсервер Phantom»
докладчик Влад Селиверстов
hip://clck.ru/1Knyv
Немного истории
20
О нашем инструменте:
«Танки в Лунапарке»
докладчик Андрей Кузьмичев
hip://clck.ru/1Ko-‐z
Особенности
21
Особенности
l Консольный
22
Особенности
l Консольный
l Linux-‐only
23
Особенности
l Консольный
l Linux-‐only
l Hit-‐based
24
Особенности
l Консольный
l Linux-‐only
l Hit-‐based
l Модульный
25
Что умеет
26
Что умеет
l HTTP/HTTPS/Stateless
27
Что умеет
l HTTP/HTTPS/Stateless
l IPv4/IPv6
28
Что умеет
l HTTP/HTTPS/Stateless
l IPv4/IPv6
l До 100к запросов/cек
29
Что умеет
l HTTP/HTTPS/Stateless
l IPv4/IPv6
l До 100к запросов/cек
l «Раскладка» времён
30
Что умеет
l HTTP/HTTPS/Stateless
l IPv4/IPv6
l До 100к запросов/cек
l «Раскладка» времён
l Многое другое
31
Сразу в лоб
Графиков не будет
32
Собрались
33
Установка
34
Требования:
l Ubuntu Server/Desktop
l 32/64bit
l Lucid/Precise
Установка
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
Установка
36
$ sudo apt-get update
$ sudo apt-get install yandex-load-tank-base
$ dpkg -l | grep tank ii yandex-load-tank-base
Подготовка $ lunapark ==== Welcome to Lunapark ==== Usage: lunapark AMMO-FILE [OPTIONS] Try `lunapark --help' for more information.
37
$ nano load.conf
Пример 1
Тестирование HTTP сервиса постоянной нагрузкой в 10 рпс.
Запрашиваем корневую страницу.
38
Пример 1
39
$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: uri = /
Пример 1
40
$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: uri = /
Пример 1
41
$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: uri = /
Пример 1
42
$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки # Перечисление заголовков и GET запросов: uri = /
Пример 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
Запускаем стрельбу
Пример 1
44
Пример 1
45
Пример 1
46
Пример 1
47
Пример 1
48
Пример 1
49
Пример 1
50
Пример 1
51
Пример 2
Тестирование HTTP сервиса линейно-‐возрастающей нагрузкой до 100 рпс.
Запрашиваем корневую страницу.
Используем IPv6 + SSL
52
Пример 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 = /
Пример 2
54
Пример 3
Тестирование HTTP сервиса ступенчато-‐возрастающей нагрузкой до 100 рпс.
Запрашиваем корневую страницу.
Используем IPv6 + SSL
55
Пример 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 = /
Пример 3
57
Пример 4
Тестирование HTTP сервиса c прогревом, линейно-‐ступенчато-‐возрастающей нагрузкой до 30 рпс с одним «спайком» до 100 рпс и плавным снижением нагрузки.
Запрашиваем корневую страницу.
Используем IPv6 + SSL
58
Пример 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 = /
Пример 4
60
Пример 5
Тестирование HTTP сервиса постоянной нагрузкой 10 рпс.
Запрашиваем несколько страниц с определенными заголовками.
Используем IPv6 + SSL
61
Пример 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
Пример 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
Пример 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
Пример 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
Это были цветочки
66
Да сколько можно!?
67
Потерпите, мы уже прошли половину
Немного хардкора
68
Немного хардкора
69
Что делать в сложных случаях ?
Немного хардкора
70
Как выглядит обычный HTTP запрос?
Немного хардкора
71
Request-Line
Request Headers
Data (OPTIONAL)
Немного хардкора
72
POST / HTTP/1.1
Host: example.com Content-Length:3 Connection: Close
uho
Немного хардкора
73
Запрос для Яндекс.Танка будет таким:
80 POST / HTTP/1.1 Host: example.com Content-Length:3 Connection: Close uho
Немного хардкора
74
Запрос для Яндекс.Танка будет таким:
80 POST / HTTP/1.1 Host: example.com Content-Length:3 Connection: Close uho
Немного хардкора
75
Запрос для Яндекс.Танка будет таким:
80 POST / HTTP/1.1 Host: example.com Content-Length:3 Connection: Close uho Сохраним этот запрос в файл ammo.txt
Немного хардкора
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
Немного хардкора
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
Немного хардкора
78
Упростим load.conf
$cat load.conf # Tank Config File address=127.0.0.1:80 #Адрес (IP only!) и порт стенда load = const (10,10m) #Схема нагрузки
Немного хардкора
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
Запускаем стрельбу
Немного хардкора
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
Запускаем стрельбу
Немного хардкора
81
Ура! Стреляет!
Немного хардкора
82
А теперь склеим несколько запросов и запишем их в файл ammo.txt друг за другом
Немного хардкора
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
+
+
=
Немного хардкора
84
Мы получили «ленту» запросов
Немного хардкора
85
Мы получили «ленту» запросов
Немного хардкора
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
Запуск аналогичен одиночному запросу:
Можно перед0хнУть
87
Еще немного...
88
Еще немного...
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
Еще немного...
90
phout.txt - основное хранилище не агрегированных данных
Еще немного...
91
Формат phout.txt хорошо описан в документации
Еще немного...
92
Формат phout.txt хорошо описан в документации Зачем?
Затем, что...
93
phout.txt
loadosophia
DB
API
gnuplot
JS
Excel
???
А могу ли я...? Да!
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
А могу ли я...? Да!
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
Почти всё
96
Полезные ссылки
97
Приготовились ...3..2..1
Phantom
98
http://clck.ru/1KRej
Евгений Мамчиц
Phantom ARM
99
http://clck.ru/1KRhJ
Дмитрий Билунов
Phantom Docs
100
http://clck.ru/1KRhX
Григорий Комиссаров
Firebat console
101
http://clck.ru/1KRhp
Григорий Комиссаров
Loadosophia
102
http://clck.ru/1KodD
Андрей Похилько
Яндекс.Танк
103
http://clck.ru/1KRiB
Yandex-‐load
104
http://clck.ru/1KRiP
Спасибо этим ребятам!
105
Вопросы
106
Руководитель службы НТ
doctor@yandex-‐team.ru
twiier: @doctornkz
Олесь Писаренко