Skip to content

Instantly share code, notes, and snippets.

@sameoldmadness
Last active March 29, 2024 09:02
Show Gist options
  • Star 56 You must be signed in to star a gist
  • Fork 13 You must be signed in to fork a gist
  • Save sameoldmadness/9abeef4c2125bc760ba2f09ee1150330 to your computer and use it in GitHub Desktop.
Save sameoldmadness/9abeef4c2125bc760ba2f09ee1150330 to your computer and use it in GitHub Desktop.
Нагрузочное тестирование c Yandex.Tank и JMeter

Нагрузочное тестирование c Yandex.Tank и JMeter

На этой странице описывается процесс настройки нагрузочного тестирования внешних ресурсов.

Кратко

Для тестирования поведения сервиса под нагрузкой используется утилита Yandex Tank.

Танку можно указать патроны (HTTP-запросы, которые будут отправлены на целевой сервер) и расписание (количество запросов в секунду к целевому серверу в каждый момент времени стрельб, а также продолжительность стрельб). Также к танку можно подключить плагин мониторинга, позволяющий снимать показатели (например, количество свободной памяти или загрузку процессора) с целевого сервера.

В процессе стрельб все эти показатели отправляются в сервис Overload, который отображает эти метрики в удобном для восприятия виде. Напомню, что на этой странице мы говорим о тестировании внешних ресурсов. Если требуется пострелять по сервису Яндекса, стоит воспользоваться документацией Qloud.

Последний сервис, о котором стоит упомянуть – JMeter. Он может быть использован в качестве альтернативного генератора нагрузки для танка. Такая возможность пригодится, если в сценариях тестирования нужно эмулировать пользовательские сессий либо другие сложные сценарии, которые танк из коробки не поддерживает.

Yandex Tank

Установка

Рекомендуемый способ – запустить танк в докер-контейнере.

Финальная команда запуска может выглядеть так:

docker run 
  --entrypoint /bin/bash    // подключаемся к контейнеру (иначе контейнер будет остановлен после окончания стрельб)
  -v $(pwd):/var/loadtest   // монтируем текущую директорию (в ней будут конфиги и патроны)
  -v $HOME/.ssh:/root/.ssh  // монтируем папку с ssh-ключами (для настройки мониторинга)
  -it direvius/yandex-tank  // публичный образ Яндекс.Танка

Неочевидные моменты:

  • Для использования JMeter понадобится Java. Если вам не по душе ставить заново при каждом запуске контейнера, лучше подготовить свой образ.
  • Танку в паре с JMeter не хватит стандартных 2GB памяти, лучше сразу удвоить объём выделяемой памяти. В Docker for Mac этот параметр есть в настройках приложения.

Конфигурация

Основной файл конфигурации – load.yaml.

Документация иногда продолжает ссылать на старый формат – ini, но верить ей не стоит – парсер ini-конфигов сломан, и ряд опций в этом формате задать просто не получится.

Если нужный вам параметр представлен в только в ini-формате, узнать его название в формате yaml можно из исходников. Например, вот пример описания схемы секции плагина JMeter.

Пример простейшего конфига.

phantom:
  address: 127.0.0.1:8080
  ssl: true
  load_profile:
    load_type: rps
    schedule: const(10, 1m)
  ammofile: /var/loadtest/ammo_local.txt
  ammo_type: uripost
telegraf:
  enabled: false
uploader:
  enabled: false

Здесь следует обратить внимание на следующие поля:

  • address – домен (или ip-адрес) и порт цели. Если нужна поддержка https, используйте параметр ssl.
  • ammofile – файл с патронами (запросами к цели). Есть несколько способов задавать патроны.
  • load_profileрасписание. Тут задаётся нагрузка и продолжительность стрельб.
  • telegraf – мониторинг, о нём отдельно поговорим ниже.
  • uploader – агрегатор, о нём – тоже поговорим.

Пример патронов

[Host: example.com]
[Connection: close]
[User-Agent: Tank]
[Content-Type: application/json]
12 /path/to/enpoint
request body

Запуск

Достаточно выполнить команду

yandex-tank -c config.yaml

Monitoring (Telegraf)

Для настроки Телеграфа нужно настроить ssh-соединение с целью. Для этого публичный ключ танка нужно добавить на целевой сервис.

Далее нужно сконфигурировать секцию в основном конфиге load.yaml.

telegraf:
  config: monitoring.xml
  enabled: true
  kill_old: false
  package: yandextank.plugins.Telegraf
  ssh_timeout: 30s

Как видно, для мониторинга нужен отдельный конфиг – monitoring.xml. В простейшем виде он выглядит так.

<Monitoring>
  <Host address="example.com" interval="1" username="my-user">
    <CPU/> <Kernel/> <Net/> <System/> <Memory/> <Disk/> <Netstat /> <Nstat/>
  </Host>
</Monitoring>

Uploader (Overload)

Для начала нужно получить токен.

Для этого нужно авторизоваться на сайте, кликнуть на аватарку и скопировать токен. Затем нужно создать файл token.txt и положить туда токен.

Простейший конфиг выглядит так.

uploader:
  enabled: true
  operator: my-username
  package: yandextank.plugins.DataUploader
  token_file: /var/loadtest/token.txt

Ссылка на результаты отобразится в терминале при запуске стрельб.

JMeter

JMeter – альтернативный генератор нагрузки для танка.

Он более сложен в настройке, чем дефолтный генератор – phantom, но в тоже время более гибок. Мы будем использовать его для нетривиальных сценариев запросов – например, для эмуляции пользовательских сессий, когда запросы от одного пользователя должны выполнятся последовательно.

Установка

В контейнере должна быть установлена Java. Можно подготовить собственный образ либо установить пакет вручную.

apt-get update
apt-get install openjdk-8-jre

Теперь нужно скачать архив с бинарниками и распаковать его.

wget http://www-us.apache.org/dist/jmeter/binaries/apache-jmeter-3.3.tgz
tar xzvf apache-jmeter-3.3.tgz

Также может потребоваться установить дополнительные плагины. Для этого откройте JMeter локально, через графический интерфейс установите плагин plugin-manager и откройте тестовый сценарий. Вам будет предложено установить недостающие плагины. После установки папку ext можно будет перенести в контейнер.

Конфигурация

Конфигурация JMeter разнесена между тестовым сценарием *.jmx и конфигом танка load.yaml.

Секция JMeter load.yaml может выглядеть так.

jmeter:
  enabled: true
  package: yandextank.plugins.JMeter
  jmx: ammo.jmx
  jmeter_path: /var/loadtest/apache-jmeter-3.3/bin/jmeter
  buffered_seconds: 0
  ext_log: none
  variables:
    protocol: http
    host: 127.0.0.1
    port: 8080
    path: /path/to/endpoint
    thread_rpm: 300
    loops: 20
    texts: scenarios.csv

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

Описание принципов создания тестового сценария выходит за рамки данной статьи.

@velp
Copy link

velp commented Aug 20, 2020

Спасибо за инструкцию, то что надо

@micronull
Copy link

Весьма кстати.

@somalil
Copy link

somalil commented Dec 8, 2021

Начал изучать эту тему и возник вопрос: для чего использовать jmeter в связке с Яндекс танком? Что это дает? Разве не проще запускать jmeter отдельно?

@lodgvideon
Copy link

Танк дает стандартную обвязку. Преимущество - если у вас много тестов на разных Тулах - можно использовать 1 инструмент для запуска и хранения результатов. Как следствие - меньше времени будете тратить на поддержку разных скриптов для разных инструментов.

@IvanSavelyev
Copy link

А чем Gatling плох?

@micronull
Copy link

А чем Gatling плох?

А кто сказал что Gatling плох?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment