Яндекс.танк — инструмент нагрузочного тестирования

2012-08-02

28 июля на я.субботнике был представлен новый инструмент для нагрузочного тестирования Яндекс.танк. Это внутреняя разработка яндекса, которая наконец-то вышла в свет. Видел я этот танк ещё на YaC 2011, когда были соревнования по конфигурированию nginx.

Это консольный инструмент, пока не имеющий графического интерфейса, но дающий довольно полную картину в этой самой консоли.

Вот сам интерфейс:

Сам проект и документация находится на github'е: https://github.com/yandex-load/yandex-tank

В кратце обрисую возможности:

Можно нагружать одну страницу или сразу список урлов (которые будут запрашиваться примерно в одинаковых соотношениях).

А можно самому составить список запросов со своими заголовками. Например, можно реализовать нагрузку от запросов от анонимных пользователей и залогиненных. Через скрипт (php, python, bash, etc) залогиниться на сайте и получить нужные куки. Сгенерировать в нужном формате данные для танка и запустить тест.

Танк позволяет создать 3 вида нагрузки:

  • Постоянная - указывается количество запросов и время
  • Линейный рост - указывается начальное и конечное значение и время
  • Рост шагами - указывается начальное и конечное значение, шаг увеличения нагрузки и время.

Причём эти виды нагрузки можно комбинировать в одном тесте.

Особенно хочеться отметить простоту и понятность синтаксиса.

#Подогреваем кэш
load = const(1, 10s)
# Линейно увеличиваем нагрузку с одного запроса в секунду до 10 в течение 2 минут
load = line(1, 10, 2m)
# Начинаем нагружать 10 запросами в секунду в течение 1 минуты, потом увеличиваем на 5 запросов и так до 40. Т.е. на каждый шаг будет затрачено по  минут
load = line(10, 40, 5, 1m)
# Указываем нагружаемых хост, только ip (!)
address = 192.168.100.254:80
# Посылаемые заголовки
header = [Host: test.server]
header = [Connection: close]
header_http = 1.1
# Нагружаемые страницы
uri = /
uri = /another_page/

Вот что случается, когда сервер не справляется:

Думаю, что проект со временем будет обрастаться графическими интерфейсами, разработанными самим яндексом или сообществом.

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

Метки: load, testing, yandex

10 комментариев:

  1. Direvius #
    Direvius
    [2012-08-13 19:14]

    | Я даже уже придумал, что можно сделать. Получать статистику на | нагружаемом сервере через vmstat и выводить красивые графики для | быстрого нахождения наиболее узкого места: память, cpu, io.

    Для этой цели можно использовать замечательный инструмент (хотя и несколько сырой в плане интерфейса) -- Graphite К нему через плагин очень простым образом подключается Collectd -- сборщик статистики по используемым ресурсам. Огромное количество метрик, много плагинов.

    P.S. цитаты и капча у вас глючат

  2. Stamm #
    Stamm
    [2012-08-15 14:06]

    Direvius, спасибо за ценную информацию.

    Цитаты починил, а что с капчей?

  3. iMelnik #
    iMelnik
    [2012-08-23 13:25]

    А получилось ли сделать графики на основе вывода фантома? Пытаюсь построить график кол-во запросов/среднее время ответа. Нашел упоминание R в readme, но пока не совсем освоил. Есть мысли?

  4. asocial #
    asocial
    [2012-10-04 12:45]

    Через скрипт (php, python, bash, etc) залогиниться на сайте и получить нужные куки. Сгенерировать в нужном формате данные для танка и запустить тест.

    а поточнее не расскажете как это сделать?? у меня не получилось((

  5. direvius #
    direvius
    [2012-10-11 18:30]

    Теперь графики рисует сам танк, в новой версии. Стартует локальный веб-сервис, можно браузером тыкнуться и посмотреть. Там процентили для времен ответа и средние времена... В общем, смотрите сами =)

  6. direvius #
    direvius
    [2012-10-11 18:31]

    Direvius, спасибо за ценную информацию. Цитаты починил, а что с капчей?

    Честно говоря, не помню, но сейчас, по-моему, все в порядке.

  7. Stamm #
    Stamm
    [2012-10-16 11:48]

    associal, тут немного другие примеры, но смысл такой же: http://clubs.ya.ru/yandex-tank/14

    Но ещё нужно сгенерировать запрос, который вернёт нужную куку и потом её подставлять в ленту запроса

    Что-то типо этого:

    [bash]
    
    curl  --include -F 'login=stamm&password' "http://www.yandex.ru/login" | grep "Set-Cookie:"
    
  8. doctor #
    doctor
    [2012-10-16 12:52]

    asocial, есть способ попроще, вы можете сделать такой конфиг для Яндекс.Танка: [phantom] address= <адрес мишени> rps_schedule=<какая-то нагрузка> headers = [Cookie: <Кукa из браузера>]

    задавайте вопрос в клубике http://clubs.ya.ru/yandex-tank/ , поможем.

  9. inkvizitor68sl #
    inkvizitor68sl
    [2013-02-28 13:38]

    Веб-морда есть, кстати. На :8080 на танке запускается.

  10. Александр #
    Александр
    [2013-03-04 20:44]

    Doctor, так есть способ получать Cookie автоматически? Например зная логин\пароль, или отправляя post запрос от формы регистрации?

Оставить комментарий

Поля со * нужно обязательно заполнить.

Можно использовать синтаксис Markdown или HTML.

Код регистро-зависимый