А давай бабахнем?

Всем привет, я опять на связи. На днях возникла необходимость провести нагрузочное тестирование и встал вопрос освежить свои знания в нагрузочном тестировании. В процессе наткнулся на давно известный мне, но который так и не получилось потрогать и пощупать инструмент от яндекса под названием яндекс.Танк (хотя в итоге я все равно взял для своих целей jmeter =) ). Так что давайте потрогаем его вместе.

жахать прост. о пушках, минометах и т.д; издать сильный низкий звук при выстреле ◆ Жахнуло, обдало лейтенанта снегом и пламенем, ударило комками земли в лицо, забило рот, катануло по траншее, словно зайчонка. В. П. Астафьев

Живет и разрабатывается он тут: https://github.com/yandex/yandex-tank Ни шатко ни валко, кто нибудь да пульнет в него раз в две недели коммит. Собственно что это такое? Сиё есть питонячая обертка над несколькими генераторами нагрузки, которая позволяет вполне себе удобно всадить по самые … нагрузить какой нибудь сервер, до тех пор пока ему не поплохеет, либо не подавится, что позволит нам узнать основные его параметры производительности. Из коробки поддерживаются следующие генераторы нагрузки (сам танк очевидно ничего не нагружает, он всего лишь говорит кому, что и чем нагружать): phantom, JMeter, BFG, и неведомая мне хрень под названием pandora.
Phantom это нечто, судя по всему разрабатываемое кем-то из яндекса, способное генерировать нагрузку и используемое танком по умолчанию. Старый добрый JMeter знают все, чтобы воспользоваться им в танке, необходимо подготовить .jmx с тест планом и подключить нужный плагин. С другими двумя генераторами еще не разобрался.

Установка несложная, но сам по себе танк похоже работает только на дебианоподобных системах, типа ubuntu, поэтому если вы не можете себя назавать убунтоводом или же психиатр не поставил вам диагноз ubuntu головного мозга, то стоит воспользоваться докер контейнером, любезно предоставленным нам разработчиками танка.

Может бабахнем? Обязательно бабахнем. И не раз. Весь мир в труху! Но потом.

Прежде чем стрелять, надо сначала понять чем, куда, и как. Мы не будем сейчас вдаваться в тонкости профиля нагрузки, типов нагрузки, какие у нас требования к производительности и т.д. Мы просто хотим жахнуть, да посильнее. И это то, что танк умеет! Давайте представим что у нас есть сервер, который мы хотим протестировать, и он крутиться по адресу: 192.168.1.100 на порту 8989. И пульнуть в него мы хотим тысячью HTTP реквестов в течении одной минуты. Что нам для этого надо? Очевидно нам нужно как-то сказать танку что мы от него хотим, поэтому мы создаем конфигурацию нагрузки. По умолчанию танк для этих целей ищет и потом использует файл load.ini поэтому создаем его со следующим содержимым:

1
2
3
4
[phantom]
address=192.168.1.100
port=8989
rps_schedule=const(1000, 60s)

Все на первый взгляд очевидно, но для самых продвинутых подсказываю: [phantom] это название секции которую он же и будет использовать для нагрузки. address это собственно адрес, а port собственно порт. А вот с rps_schedule поинтересней будет, нигде в документации не сказано, что это и зачем, поэтому методом дедукции предполагаем что это некое расписание нагрузки… на самом деле это ключевой параметр который задает профиль нагрузки. Он может быть следующих видов:

  • сonst(1, 20s) постоянная нагрузка в 1 rps в течении 20 сек
  • line(1, 100, 10m) линейная нагрузка с 1 rps до 100 rps, в течении 10 минут
  • step(5, 100, 5, 60) пошаговая нагрузка с 5 rps до 100 rps c шагом 5 rps в течении 60 секунд

Далее… Дальше нам нужно понять что конкретно нужно делать. Дёргать один URI или несколько? Какие заголовки использовать? Какие куки?

Слышу стук. Это нетерпеливый читатель, бьет копытом и вопрошает: ну когда же жахнем?! Скоро.. Осталось совсем немного.

Добавляем в load.ini заголовки и uri по которым будем стрелять:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
[phantom]
address=192.168.1.100
port=8989
rps_schedule=const(1000, 60s)

headers = [Host: www.target.com]
  [Connection: close]

uris = /
  /test
  /test?param=10
  /test/path/resource

Ну вот теперь все, можно жахать. А жахнем мы выполнив команду находясь в той же директории, что и наш файл load.ini:

1
docker run -v $(pwd):/var/loadtest -v $HOME/.ssh:/root/.ssh --net host -it direvius/yandex-tank --name tank

Расшифровывать что эта строка значит, не буду, не маленькие. Сразу после скачивания и запуска контейенера пойдет нагрузка. Должна по крайней мере.

Вот собственно и жахнули. Не впечатлило? А все потому, что мы и не поняли, что произошло. А чтобы понять подключим мы еще пару фич. Для этого выполним еще пару телодвижений:

Для начала заходим на https://overload.yandex.net/ авторизовываемся и получаем свой api token. Сохраняем его в файл token.txt.

Добавляем еще несколько строк в файл load.ini

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
[phantom]
address=192.168.1.100
port=8989
rps_schedule=const(1000, 60s)

headers = [Host: www.target.com]
  [Connection: close]

uris = /
  /test
  /test?param=10
  /test/path/resource

[overload]
token_file=token.txt

[tank]
plugin_overload=yandextank.plugins.Overload

Сохраняем и жахаем еще раз:

1
docker start tank

затем смотрим в логи танка и ищем строку вида: Web link: https://overload.yandex.net/XXXX:

1
docker logs tank

Проходим по ссылке и наслаждаемся графиками, и сразу становиться ясно, что не зря столько старались.

Всем спасибо, на сегодня все.

PS

В ходе данной пристрелки, ни одного программиста не пострадало.