На этой странице описывается процесс настройки нагрузочного тестирования внешних ресурсов.
Для тестирования поведения сервиса под нагрузкой используется утилита Yandex Tank.
Танку можно указать патроны (HTTP-запросы, которые будут отправлены на целевой сервер) и расписание (количество запросов в секунду к целевому серверу в каждый момент времени стрельб, а также продолжительность стрельб). Также к танку можно подключить плагин мониторинга, позволяющий снимать показатели (например, количество свободной памяти или загрузку процессора) с целевого сервера.
В процессе стрельб все эти показатели отправляются в сервис Overload, который отображает эти метрики в удобном для восприятия виде. Напомню, что на этой странице мы говорим о тестировании внешних ресурсов. Если требуется пострелять по сервису Яндекса, стоит воспользоваться документацией Qloud.
Последний сервис, о котором стоит упомянуть – JMeter. Он может быть использован в качестве альтернативного генератора нагрузки для танка. Такая возможность пригодится, если в сценариях тестирования нужно эмулировать пользовательские сессий либо другие сложные сценарии, которые танк из коробки не поддерживает.
Рекомендуемый способ – запустить танк в докер-контейнере.
Финальная команда запуска может выглядеть так:
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
Для настроки Телеграфа нужно настроить 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>
Для начала нужно получить токен.
Для этого нужно авторизоваться на сайте, кликнуть на аватарку и скопировать токен. Затем нужно создать файл token.txt и положить туда токен.
Простейший конфиг выглядит так.
uploader:
enabled: true
operator: my-username
package: yandextank.plugins.DataUploader
token_file: /var/loadtest/token.txt
Ссылка на результаты отобразится в терминале при запуске стрельб.
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
– пользовательские переменные (аналог переменных окружения), которые будут проброшены в тестовый сценарий.
Описание принципов создания тестового сценария выходит за рамки данной статьи.
Танк дает стандартную обвязку. Преимущество - если у вас много тестов на разных Тулах - можно использовать 1 инструмент для запуска и хранения результатов. Как следствие - меньше времени будете тратить на поддержку разных скриптов для разных инструментов.