Нагрузочный тест с помощью JMeter
Load Testing можно использовать для тестирования сервиса с постоянной нагрузкой по протоколу HTTPS с помощью генератора нагрузки JMeter.
Чтобы провести нагрузочное тестирование:
- Подготовьте облако к работе.
- Подготовьте цель тестирования.
- Подготовьте инфраструктуру.
- Создайте агент.
- Подготовьте файл с тестовыми данными.
- Запустите тест.
Если созданные ресурсы вам больше не нужны, удалите их.
Подготовьте облако к работе
Зарегистрируйтесь в Yandex Cloud и создайте платежный аккаунт:
- Перейдите в консоль управления
, затем войдите в Yandex Cloud или зарегистрируйтесь. - На странице Yandex Cloud Billing
убедитесь, что у вас подключен платежный аккаунт, и он находится в статусеACTIVE
илиTRIAL_ACTIVE
. Если платежного аккаунта нет, создайте его.
Если у вас есть активный платежный аккаунт, вы можете создать или выбрать каталог, в котором будет работать ваша инфраструктура, на странице облака
Подробнее об облаках и каталогах.
Необходимые платные ресурсы
Если агент размещается на платформе Yandex Cloud, взимается плата за вычислительные ресурсы (см. тарифы Yandex Compute Cloud).
На стадии Preview использование сервиса Load Testing не тарифицируется.
Подготовьте цель тестирования
В этом примере будет тестироваться сервис с внутренним IP-адресом 172.17.0.10
в той же подсети, где будет размещен агент.
Убедитесь, что для доступа к сервису по протоколу HTTPS используется порт по умолчанию — 443
.
Load Testing также можно использовать для нагрузочного тестирования сервиса, доступного публично или находящегося в другой подсети и группе безопасности относительно агента.
Для сервиса, доступного публично, разрешите входящий HTTPS-трафик на порт 443
.
Для сервиса, находящегося в другой подсети и группе безопасности относительно агента, создайте правило для входящего HTTPS-трафика на порт 443
в группе безопасности, где размещается цель тестирования.
Подготовьте инфраструктуру
Создайте сервисный аккаунт
- Создайте сервисный аккаунт
sa-loadtest
в каталоге, где будет размещаться агент, с которого будет подаваться нагрузка. - Назначьте сервисному аккаунту роль
loadtesting.generatorClient
.
Настройте сеть
Создайте и настройте NAT-шлюз в подсети, где размещается цель тестирования и будет размещен агент. Это обеспечит доступ агента к сервису Load Testing.
Настройте группы безопасности
-
Настройте группу безопасности агента тестирования:
- Создайте группу безопасности агента
agent-sg
. - Добавьте правила:
-
Правило для исходящего HTTPS-трафика к публичному API Load Testing:
- Диапазон портов:
443
. - Протокол:
TCP
. - Назначение:
CIDR
. - CIDR блоки:
0.0.0.0/0
.
Это позволит подключить агент к сервису Load Testing, чтобы управлять тестами из интерфейса и получать результаты тестирования.
- Диапазон портов:
-
Правило для входящего SSH-трафика:
- Диапазон портов:
22
. - Протокол:
TCP
. - Назначение:
CIDR
. - CIDR блоки:
0.0.0.0/0
.
Это позволит подключаться к агенту по протоколу SSH и управлять тестами из консоли или собирать отладочную информацию.
- Диапазон портов:
-
Правило для исходящего трафика при подаче нагрузки к цели тестирования:
- Диапазон портов:
0-65535
. - Протокол:
Любой
. - Назначение:
Группа безопасности
.
ВыберитеИз списка
. Укажите группу безопасности, в которой находится нужная цель тестирования.
Создайте такое правило для каждой цели тестирования с уникальной группой безопасности.
- Диапазон портов:
-
- Создайте группу безопасности агента
-
Настройте группу безопасности цели тестирования:
-
Создайте группу безопасности цели тестирования
load-target-sg
. -
Добавьте правило для входящего трафика при подаче нагрузки к цели тестирования:
- Диапазон портов:
0-65535
. - Протокол:
Любой
. - Назначение:
Группа безопасности
.
ВыберитеИз списка
. Укажите группу безопасности, в которой находится нужная цель тестирования.
Это правило позволит агентам подавать нагрузку на эту цель или подключать дополнительные средства мониторинга.
- Диапазон портов:
-
Создайте агент тестирования
-
Если у вас еще нет пары SSH-ключей, создайте их.
-
Создайте агент:
Консоль управления-
В консоли управления
выберите каталог, в котором будет создан агент. -
В списке сервисов выберите Load Testing.
-
На вкладке Агенты нажмите кнопку Создать агент.
-
Укажите имя агента, например
agent-008
. -
Укажите ту же зону доступности, в которой находится цель тестирования.
-
В блоке Агент:
- Выберите подходящий тип агента. Подробнее см. в разделе Производительность агентов.
- Укажите подсеть, в которой находится цель тестирования. В подсети должен быть создан и настроен NAT-шлюз.
- Если вам доступны группы безопасности, выберите заранее настроенную группу безопасности агента.
-
В блоке Доступ укажите данные для доступа к агенту:
-
Выберите сервисный аккаунт
sa-loadtest
. -
В поле Логин введите имя пользователя.
Внимание
Не используйте логин
root
или другие имена, зарезервированные операционной системой. Для выполнения операций, требующих прав суперпользователя, используйте командуsudo
. -
В поле SSH-ключ вставьте содержимое файла открытого ключа.
-
-
Нажмите Создать.
-
Дождитесь завершения процесса создания виртуальной машины. Статус агента должен смениться на
Ready for test
.Примечание
Процесс создания агента может остановиться на статусе
Initializing connection
, если не выполнены условия:- У агента есть доступ к
loadtesting.api.cloud.yandex.net:443
и публичный IP-адрес. - В целевой подсети настроен NAT-шлюз.
- У сервисного аккаунта, который назначен агенту, есть необходимые роли.
- У агента есть доступ к
-
-
Привяжите публичный IP-адрес к агенту для доступа по протоколу SSH:
Консоль управления- В консоли управления
выберите каталог, в котором размещен агент. - Выберите сервис Compute Cloud.
- Выберите ВМ с именем
agent-008
. - В блоке Сетевой интерфейс в правом верхнем углу нажмите
и выберите Добавить публичный IP-адрес. - В открывшемся окне:
- В поле Публичный адрес выберите получение адреса Автоматически.
- Нажмите Добавить.
- В консоли управления
Подготовьте сценарий нагрузочного тестирования
Создайте сценарий нагрузочного тестирования в UI JMeter и сохраните его в файл с расширением .jmx
. Подробнее см. в документации JMeter
Пример сценария JMeter
Создайте файл test.jmx
и поместите в него следующий код, указав в поле HTTPSampler.domain
актуальный IP-адрес вашей цели тестирования:
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.6.2">
<hashTree>
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="Test Plan" enabled="true">
<boolProp name="TestPlan.functional_mode">false</boolProp>
<boolProp name="TestPlan.tearDown_on_shutdown">false</boolProp>
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
</TestPlan>
<hashTree>
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="Thread Group" enabled="true">
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="Loop Controller" enabled="true">
<stringProp name="LoopController.loops">600</stringProp>
<boolProp name="LoopController.continue_forever">false</boolProp>
</elementProp>
<stringProp name="ThreadGroup.num_threads">1</stringProp>
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
<boolProp name="ThreadGroup.delayedStart">false</boolProp>
<boolProp name="ThreadGroup.scheduler">false</boolProp>
<stringProp name="ThreadGroup.duration"></stringProp>
<stringProp name="ThreadGroup.delay"></stringProp>
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
</ThreadGroup>
<hashTree>
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP Request" enabled="true">
<boolProp name="HTTPSampler.postBodyRaw">false</boolProp>
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="User Defined Variables" enabled="true">
<collectionProp name="Arguments.arguments"/>
</elementProp>
<stringProp name="HTTPSampler.domain">172.17.0.10</stringProp>
<stringProp name="HTTPSampler.path">/test?sleep=100</stringProp>
<stringProp name="HTTPSampler.method">GET</stringProp>
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
<boolProp name="HTTPSampler.BROWSER_COMPATIBLE_MULTIPART">false</boolProp>
<boolProp name="HTTPSampler.image_parser">false</boolProp>
<boolProp name="HTTPSampler.concurrentDwn">false</boolProp>
<stringProp name="HTTPSampler.concurrentPool">6</stringProp>
<boolProp name="HTTPSampler.md5">false</boolProp>
<intProp name="HTTPSampler.ipSourceType">0</intProp>
</HTTPSamplerProxy>
<hashTree/>
<ConstantThroughputTimer guiclass="TestBeanGUI" testclass="ConstantThroughputTimer" testname="Constant Throughput Timer" enabled="true">
<intProp name="calcMode">1</intProp>
<doubleProp>
<name>throughput</name>
<value>600.0</value>
<savedValue>0.0</savedValue>
</doubleProp>
</ConstantThroughputTimer>
<hashTree/>
</hashTree>
</hashTree>
</hashTree>
</jmeterTestPlan>
В этом примере создается одна Thread-группа с одним HTTP-запросом (запрос sleep
на 100 миллисекунд) и задается IP-адрес тестируемого ресурса. Запросы отправляются с периодичностью 600 запросов в минуту, длительность теста составляет 600 запросов.
Запустите тест
-
В консоли управления
выберите сервис Load Testing. -
На панели слева выберите
Тесты. Нажмите Создать тест. -
В поле Агенты выберите агент
agent-008
. -
В блоке Прикрепленные файлы нажмите Выбрать файлы и выберите файл со сценарием, созданный ранее.
-
В блоке Настройки теста:
-
В поле Генератор нагрузки выберите
JMETER
. -
В поле Сценарий jmx выберите
Прикрепленный файл
.Если в блоке Прикрепленные файлы вы загрузили несколько файлов, выберите
Указать файл
и в поле Имя прикрепленного файла или URL для скачивания укажите имя файла со сценарием. Если ваш сценарий недоступен локально, укажите в этом поле URL для его скачивания.
-
-
(опционально) В меню Переопределить значения переменных jmx сценария вы можете добавить переменные со значениями в формате
var=value
. В этом случае в сценарий будут переданы пользовательские переменные, а внутри сценария к таким переменным можно будет обращаться в формате${var}
. -
(опционально) В меню Параметры запуска JMeter:
- Если вы используете свою версию JMeter, которую предварительно вручную скопировали на агент, в поле Путь до исполняемого файла jmeter укажите путь к исполняемому файлу JMeter.
- В поле Дополнительные аргументы запуска jmeter укажите дополнительные аргументы — они позволяют использовать команды запуска Non-GUI режима. Подробнее см. в документации JMeter
.
-
В меню Автостоп нажмите
Автостоп и введите описание:- Тип автостопа 1 —
QUANTILE
. - Квантиль —
75
. - Лимит времени ответов —
100ms
. - Размер окна —
10s
.
Этот критерий остановит тест, если в течение 10 секунд 75 процентиль превысит 100 миллисекунд (в течение 10 секунд время обработки 25% запросов превысит 100 миллисекунд).
- Тип автостопа 1 —
-
В поле Время принудительной остановки теста укажите время, после которого сработает автостоп, если тест не будет остановлен по другим причинам. Значение параметра должно быть немного больше ожидаемой продолжительности теста.
-
В блоке Информация о тесте укажите имя, описание и номер тестируемой версии. Это поможет сделать отчет читаемым.
-
Нажмите Создать.
После этого конфигурация пройдет проверки, и агент начнет нагружать тестируемый сервис.
Чтобы наблюдать за результатами выполнения тестирования, выберите созданный тест и перейдите на вкладку Результаты теста.
Как удалить созданные ресурсы
Некоторые ресурсы платные. Чтобы за них не списывалась плата, удалите ресурсы, которые вы больше не будете использовать: