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

	
  

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

	
  




2	
  
Содержание	
  
•  Яндекс.Танк	
  

	
  

	
  




3	
  
Содержание	
  
•  Яндекс.Танк	
  

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

	
  

	
  




4	
  
Содержание	
  
•  Яндекс.Танк	
  

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

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

	
  

	
  



5	
  
Содержание	
  
•  Яндекс.Танк	
  

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

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

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

	
  

	
  

6	
  
Содержание	
  
•  Яндекс.Танк	
  

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

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

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

•  Ссылки	
  

	
  

7	
  
Жаргонарий	
  

	
  
	
  




8	
  
Жаргонарий	
  

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



	
  




9	
  
Жаргонарий	
  

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



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



	
  




10	
  
Жаргонарий	
  

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



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



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

	
  




11	
  
Жаргонарий	
  

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



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



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

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

	
  



12	
  
Жаргонарий	
  

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



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



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



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



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




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

	
  
	
  




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

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



	
  




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

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



	
   	
  Простой	
  
l 



	
  




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

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



	
   	
  Простой	
  
l 



  	
  Opensource	
  (as	
  is)	
  
l 




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

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

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

hips://github.com/mamchits/phantom	
  

	
  



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

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

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

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

hip://clck.ru/1Knyv	
  

	
  




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

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

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

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

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

	
  




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




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

l     	
  Консольный	
  

	
  




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

l     	
  Консольный	
  

l     	
  Linux-­‐only	
  

	
  




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

l     	
  Консольный	
  

l     	
  Linux-­‐only	
  

l     	
  Hit-­‐based	
  

	
  




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

  	
  Консольный	
  
l 



  	
  Linux-­‐only	
  
l 



  	
  Hit-­‐based	
  
l 



  	
  Модульный	
  
l 




25	
  
Что	
  умеет 	
  	
  




26	
  
Что	
  умеет 	
  	
  

l     	
  HTTP/HTTPS/Stateless	
  

	
  




27	
  
Что	
  умеет 	
  	
  

l     	
  HTTP/HTTPS/Stateless	
  

l     	
  IPv4/IPv6	
  

	
  




28	
  
Что	
  умеет 	
  	
  

  	
  HTTP/HTTPS/Stateless	
  
l 



  	
  IPv4/IPv6	
  
l 



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




29	
  
Что	
  умеет 	
  	
  

l     	
  HTTP/HTTPS/Stateless	
  

l     	
  IPv4/IPv6	
  

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

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

	
  



30	
  
Что	
  умеет 	
  	
  

  	
  HTTP/HTTPS/Stateless	
  
l 



  	
  IPv4/IPv6	
  
l 



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



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



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




31	
  
Сразу	
  в	
  лоб	
  


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




32	
  
Собрались	
  




33	
  
Установка	
  

Требования:	
  
	
  
	
   	
  Ubuntu	
  Server/Desktop	
  
l 



  	
  32/64bit	
  
l 



  	
  Lucid/Precise	
  
l 




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

	
     # 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




35	
  
Установка	
  
	
     $ sudo apt-get update

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

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




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



       $ nano load.conf




37	
  
Пример	
  1	
  

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

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

 	
  

 	
  



38	
  
Пример	
  1	
  

    $cat load.conf

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




39	
  
Пример	
  1	
  

    $cat load.conf

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




40	
  
Пример	
  1	
  

    $cat load.conf

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




41	
  
Пример	
  1	
  

    $cat load.conf

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




42	
  
Пример	
  1	
  
  Запускаем стрельбу

    $ 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




43	
  
Пример	
  1	
  




44	
  
Пример	
  1	
  




45	
  
Пример	
  1	
  




46	
  
Пример	
  1	
  




47	
  
Пример	
  1	
  




48	
  
Пример	
  1	
  




49	
  
Пример	
  1	
  




50	
  
Пример	
  1	
  




51	
  
Пример	
  2	
  

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

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

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

 	
  

 	
  

52	
  
Пример	
  2	
  

    $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 = /




53	
  
Пример	
  2	
  




54	
  
Пример	
  3	
  

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

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

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

 	
  

 	
  

55	
  
Пример	
  3	
  

    $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 = /




56	
  
Пример	
  3	
  




57	
  
Пример	
  4	
  

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

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

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

 	
  

 	
  
58	
  
Пример	
  4	
  

    $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 = /




59	
  
Пример	
  4	
  




60	
  
Пример	
  5	
  

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

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

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

 	
  

 	
  
61	
  
Пример	
  5	
  

    $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




62	
  
Пример	
  5	
  

    $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




63	
  
Пример	
  5	
  

    $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




64	
  
Пример	
  5	
  

    $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




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




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

	
  
	
  




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

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

	
  
	
  




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

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




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

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




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

               Request-Line
	
  
	
  
               Request Headers




               Data (OPTIONAL)




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

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



               uho




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

	
  80
    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


  Сохраним этот запрос в файл ammo.txt



75	
  
Немного	
  хардкора	
  
Упростим 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




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) #Схема нагрузки




78	
  
Немного	
  хардкора	
  
  Запускаем стрельбу

    $ 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




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	
  
Немного	
  хардкора	
  
  Ура! Стреляет!




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


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




82	
  
Немного	
  хардкора	
  
             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


83	
  
Немного	
  хардкора	
  
   Мы получили «ленту» запросов




84	
  
Немного	
  хардкора	
  
  Мы получили «ленту» запросов




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

    $ 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




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




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




88	
  
Еще	
  немного...	
  
  Все результаты теста сбрасываются в файл phout.txt

  $ 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




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

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




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

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




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

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

   Зачем?




92	
  
Затем,	
  что...	
  
                       Excel   loadosophia
     gnuplot




         JS
                 phout.txt       DB




                  API           ???


93	
  
А	
  могу	
  ли	
  я...?	
  Да!	
  
     THREAD TEST         SPIKE TEST
                                             CUSTOM TIMINGS
                                 WEBDAV
          GZIP           POST
                                            RECOVERY TEST

                 POP3            REQ FILE
CGI PARAM                                       GET
                           SMTP
     URLENCODE
                                      LOOP       MULTIPART
                        COOKIE

             TAGS                         HEADERS


94	
  
А	
  могу	
  ли	
  я...?	
  Да!	
  
     THREAD TEST         SPIKE TEST
                                             CUSTOM TIMINGS
                                 WEBDAV


README.TXT
          GZIP           POST
                                            RECOVERY TEST

                 POP3            REQ FILE
CGI PARAM                                       GET
                           SMTP
     URLENCODE
                                      LOOP       MULTIPART
                        COOKIE

             TAGS                         HEADERS


95	
  
Почти	
  всё	
  




96	
  
Полезные	
  ссылки	
  
Приготовились ...3..2..1
	
  

	
  




97	
  
Phantom	
  
http://clck.ru/1KRej
	
  

	
  

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




98	
  
Phantom	
  ARM	
  	
  
http://clck.ru/1KRhJ
	
  

	
  

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




99	
  
Phantom	
  Docs	
  	
  
http://clck.ru/1KRhX
	
  

	
  

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




100	
  
Firebat	
  console	
  	
  
http://clck.ru/1KRhp
 	
  

 	
  

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




 101	
  
Loadosophia	
  	
  
http://clck.ru/1KodD
	
  

	
  

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




102	
  
Яндекс.Танк	
  	
  
http://clck.ru/1KRiB
	
  

	
  




103	
  
Yandex-­‐load	
  	
  
http://clck.ru/1KRiP
 	
  

 	
  




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

	
  

	
  




105	
  
 

	
  
          Вопросы	
  




106	
  
Олесь	
  Писаренко	
  
Руководитель	
  службы	
  НТ	
  
	
  
doctor@yandex-­‐team.ru	
  

twiier:	
  @doctornkz	
  

	
  

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

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