Pull to refresh

Рецепт нагрузочного тестирования на JMeter

Reading time4 min
Views36K

Стоит ли вообще браться за JMeter


Если с JMeter-ом вы не знакомы, то, например, по-быстренькому с ним у вас точно не выйдет.
Если вы все же решили взяться и выделить пару дней, то могу предложить свой рецепт по приготовлению нагрузочного теста на JMeter.

Составление сценария


В моем случае было необходимо протестировать сервис, и понять как долго он еще протянет без оптимизации кода или добавления серверов.
В идеале нужно загрузить в JMeter сценарий по которому как бы работает пользователь, после чего прогнать сценарий в несколько потоков, наблюдая за скорость обработки запросов.
Главная сложность в том, как этот сценарий получить и собственно этим рецептом я и хочу поделиться.

Возможно, что вам подойдет рецепт описанный в этом посте. Однако если у вас много POST-запросов или есть сессии, то простым подсовыванием логов с сервера в JMeter вы уже не отделаетесь.

От простого к более сложному


Для начала возьмем лог с сервера и разделим запросы на две части:
  • статические (их можно подсунуть в JMeter через Access Log Sampler)
  • динамические (POST запросы и запросы, передающие параметры)

Для логов nginx-а я написал скрипты что-то типа:
awk -F '\t' '{if($4 == "GET" && $6 == "-"){print $0}}' access.log > static.log
т.е. фильтруем все простые GET-запросы без параметров в отдельный файл.
awk -F '\t' '{if($6 != "-"){print $0}}' access.log > dynamic.log

В вашем случае номера столбцов access-лога могут отличаться.
Предположим, что вы достаточно знакомы с bash-программированием и утилитами, чтобы подсчитать кол-во нужных строк в файле и в итоге получить следующие цифры
  • Процент всех статических запросов
  • Процент всех динамических запросов в общем и каждого в отдельности

Статику мы загоним в сценарий всю разом через Access Log Sampler, а все динамические запросы пропишем по отдельности.
Как составлять Test Plan в JMeter уже писали, поэтому не буду повторяться.
Что должно получиться показано на следующем скриншоте.


Описание всех элементов вы легко найдете на сайте проекта, поэтому опишу только общий принцип работы.

В начало добавляем два конфигурационных элемента.
HTTP Request Defaults, чтобы не писать имя сервера в каждый HTTP Request.
HTTP Cookie Manager, чтобы хранить сессионные куки.

Далее следует Once Only Controller, чтобы инициализировать сессию только один раз, т.к. сценарий внутри элемента Thread Group в моем случае будет выполняться бесконечное число циклов. Собственно эмуляция работы пользователя будет производиться только при прогоне большого количества циклов.
Внутри этого контроллера вставляем HTTP Request, например, POST-запрос для логина в систему.

Далее следует два элемента Throughput Controller.
В первом будут все динамические запросы, а во втором все статические.
Для каждого выбираем соответствующий Percent Execution и вводим подсчитанные ранее цифры.
Смысл этих контроллеров в том, что JMeter будет выполнять то, что указано внутри этих контроллеров не каждый цикл, а в соответствии с указанным процентом из общего количества циклов.

Для каждого из динамических запросов создаем свой HTTP Request c нужными параметрами и данными для отправки. Данные можно брать из файла.
Тут есть несколько особенностей:
  • Не стоит указывать полный путь, иначе могут быть проблемы с запуском на удаленной машине
  • Не нужно указывать Parameter Name, если не хотите, чтобы JMeter отправлял файл как часть формы (об этом можно прочитать в описании к элементу на сайте)

После каждого HTTP Request добавляем Constant Timer, чтобы был небольшой интервал отправки, если тестирование производится в локальной сети с маленьким пингом.

Различные HTTP-запросы, имеющие одинаковую частоту, т.е. процент выполнения можно объединять (суммируя процент в Throughput Controller) и миксовать внутри уже с помощью Random Controller как это показано на скриншоте выше.

Для статических запросов готовим лог файл в специальном формате и прописываем имя файла в Log Access Sampler

Крайне важно добавить в конце Thread Group еще один таймер, который будет срабатывать в конце каждого цикла, иначе JMeter быстро завалит сервер запросами и сценарий будет представлять работу разве что нереально быстрого пользователя.

Значение таймера можно подобрать исходя из частоты клика пользователя по динамическим запросам и процентном соотношении этих запросов.
Например, если пользователь что-то кликает каждые 4 сек, порождая динамические запросы в количестве 15% от общего числа, то можно поставить таймер на 4000 x 0,15 = 600 мс

Запуск сценария на удаленном сервере


Несмотря на то, что процедура подробно описана в user manual, запустить все с первого раза у меня не получилось.

Удаленный запуск обладает рядом особенностей, поэтому если у вас как и у меня нет особого желания разбираться в деталях, то необходимо обеспечить следующее:
  • Загрузить на удаленный сервер все файлы с данными, которые использует сценарий (в каталог bin, если вы указывали только имя файла без пути)
  • Клиент с которого производится запуск сценария и удаленный сервер должны находиться в локальной сети, т.к. сервер инициирует обратное соединение с клиентом
  • Серверу можно указать ip-адрес для использования -Djava.rmi.server.hostname=xxx.xxx.xxx.xxx
  • Как указать какой ip-адрес использовать клиенту я нагуглить не смог. Похоже, что JMeter будет использовать первый попавшийся. Он должен быть из той же сети, что и адрес сервера
  • В случае ошибок соединения клиента с сервером (см. jmeter.log) или сервера с клиентом (см. jmeter-server.log) — отключить на них firewall, selinux
Tags:
Hubs:
+43
Comments10

Articles

Change theme settings