Кроме горячо любимых Apache Bench и JMeter имеется интересная утилита Yandex Tank.
Ей давно пользуются наши QA, пришло время и мне его потрогать для проверки одной проблемы с Kubernetes, о которой поговорим в следующем посте.
В этом — посмотрим на базовые возможности Yandex.Tank.
Из особенно приятного — в отличии от Apache Bench выводит статистику по кодам ответов, и проще в настройке и запуске, чем JMeter, плюс гибкая настройка автостопа на случай, если «Что-то пошло не так» (с)
Для выполнения тестов имеется несколько модулей Load generators, по-умолчанию используется Phantom на С++.
Telegraf — для мониторинга тестируемого хоста — подключается по SSH, запускает свой агент и снимает метрики CPU/mem/etc.
Overloader — используется для загрузки полученных данных в Yandex Overloader или InfluxDB, но мы им не воспользуемся. См. Artifact uploaders.
Кроме того, в примерах ниже не рассматривается создание отдельных «патронов» (ammo), т.к. мы не QA, и мне пока достаточно будет простых GET на какие-нибудь URI. Still, см. документацию по ним в Preparing requests.
header_http: версия HTTP для тестов, зададим 1.1, что бы использовать одно соединение на запросы, а не открывать новое каждый раз (см. HTTP persistent connection)
headers: заголовки, передаваемые на тестируемый сервер
uris: список URI, к которым выполняем запросы
load_profile:
load_type: может быть rps или instances:
rps: requests per second — указываем желаемое количество запросов в секунду
instances: указываем желаемое количество активных тредов, которые будут генерировать столько rps, сколько смогут, см. Dynamic thread limit
schedule: может быть const, line или step (или все три вместе) — определяет характер генерируемой нагрузки, см. Tutorials:
const: указывается в виде(load,dur), где load — кол-во rps, dur — время для выполнение тестирования, в примере выше — выполняем 1 запрос в секундв течении 30 секунд
line: указывается в виде (a,b,dur), где a — начальное кол-во rps, b — конечное, dur — время для выполнение тестирования, в кечении котрого значение будет линейно увеличиваться от a до b
step: указывается в виде (a,b,step,dur), где a — начальное кол-во rps, b — конечное, step — на сколько rps увеличивать, dur — время между каждым step
ssl: включаем поддержку запросов по HTTPS (не забываем указать 443 в address)
console: включаем вывод результатов в консоль
telegraf: агент мониторинга для сбора метрик с тестируемого хоста, рассмотрим в Monitoring (Telegraf)
И запускаем Танк из Docker-образа:
docker run --rm -v $(pwd):/var/loadtest -it direvius/yandex-tank
Результат:
Monitoring (Telegraf)
С помощью Telegraf можно по SSH подключиться к тестируемом хосту, и с нимать метрики с него, после чего отображать их в результатах тестирования в режиме реального времени.
Тут в address — сервер, с которого будем собирать метрики, interval — интервал сбора метрик, username — пользователь, под которым Telegraf будет подключаться на сервер.
При этом у этого пользователя на тестируемом хосте в ~/.ssh/authorized_keys должна быть записана публичная часть SSH-ключа для аутентификации (см. SSH: авторизация по ключам).
Приватную часть передадим в контейнер исмонтируем в контейнер в файл /root/.ssh/id_rsa, т.к. процессы в контейнере запускаются под рутом:
docker run --rm -v $(pwd):/var/loadtest -v /home/setevoy/.ssh/setevoy-do-nextcloud-production-d10-03-11:/root/.ssh/id_rsa -it direvius/yandex-tank
Paramiko: SSHException: not a valid RSA private key file
При первом запуске Telegraf выдал ошибку:
16:32:54 [ERROR] Failed to install monitoring agent to rtfm.co.ua
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/yandextank/plugins/Telegraf/client.py", line 209, in install
out, errors, err_code = self.ssh.execute(cmd)
File "/usr/local/lib/python2.7/dist-packages/yandextank/common/util.py", line 72, in execute
with self.connect() as client:
File "/usr/local/lib/python2.7/dist-packages/yandextank/common/util.py", line 42, in connect
timeout=self.timeout, )
File "/usr/local/lib/python2.7/dist-packages/paramiko/client.py", line 437, in connect
passphrase,
File "/usr/local/lib/python2.7/dist-packages/paramiko/client.py", line 749, in _auth
raise saved_exception
SSHException: not a valid RSA private key file
Возникает она из-за формата ключа — на DigitalOcean он по-умолчанию в PEM/OpenSSH.