Стоит ли вообще браться за 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