Кластер JMeter для нагрузочного тестирования

Для нагрузочного тестирования нам может не хватить одного сервера, создающего нагрузку, и нам может понадобиться кластер. В данной инструкции мы рассмотрим процесс создания такого кластера из серверов JMeter. Он будет состоять из трех узлов:
- jmanager (192.168.0.10) — сервер управления. С него мы запускаем задания.
- jworker01 (192.168.0.11) — рабочий сервер 1. Он создает нагрузку.
- jworker02 (192.168.0.12) — рабочий сервер 2.
* само собой, в вашей среде могут быть другие имена и адреса.
Наша инструкция подойдет для Linux (на базе как RPM, так и DEB).
Подготовка серверов
Перед тем, как приступить к установке JMeter, подготовим наши узлы кластера.
Настройка брандмауэра
Наши узлы должны обмениваться сетевыми запросами, используя большое количество портов. Нам необходимо разрешить диапазон портов 1024-65535. Безопаснее сделать так, чтобы они были открыты только для других участников кластера.
Не все системы по умолчанию используют брандмауэр. Он может быть отключен или настроен по принципу «разрешить все». В таком случае, настройки правил нам не потребуются.
Наши действия будут отличаться в зависимости от утилиты управления брандмауэром.
а) firewalld:
firewall-cmd --permanent --zone=trusted --add-source=192.168.0.0/24
* в доверенную зону мы добавили всю подсеть. Однако, если мы хотим сделать соединение более защищенным, то можно указать не подсеть, а конкретные адреса других нод кластера.
Теперь откроем порты для доверенной зоны:
firewall-cmd --permanent --zone=trusted --add-port=1024-65535/tcp
firewall-cmd --reload
* подробнее о настройке firewalld читайте в инструкции Настройка firewalld в CentOS.
б) iptables:
iptables -I INPUT -p tcp -s 192.168.0.0/24 --dport 1024:65535 -j ACCEPT
Сохранить правила можно с помощью iptables-persistent:
apt install iptables-persistent
netfilter-persistent save
* в зависимости от системы, способы сохранения правил могут быть разные. Читайте подробнее в инструкции Настройка netfilter с помощью iptables.
Установка необходимых пакетов
Предварительно, необходимо установить пакеты:
- tar — для распаковки архива с jmeter.
- wget — для загрузки архива jmeter с официального сайта.
- openjdk — jmeter разработан на Java и для своей работы требует соответствующую среду. Однако, разработчик рекомендует установить не JRE, а JDK.
В зависимости от типа Linux, команды для установки данных пакетов будут различаться.
а) Для Deb (Ubuntu / Debian / Astra Linux):
apt update
apt install openjdk-11-jdk wget tar
б) Для RPM (Rocky / CentOS / РЕД ОС):
yum install java-11-openjdk wget tar
Если система запросит подтверждение наших действий, вводим Y.
Пакет openjdk имеет несколько сборок и вариантов установки. Если у вас возникли проблемы с его установкой, прочитайте инструкцию Установка OpenJDK на Linux.
После смотрим версию openjdk:
java -version
Мы должны увидеть что-то на подобие:
openjdk version "11.0.19" 2023-04-18 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.19.0.7-1.el7_9) (build 11.0.19+7-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.19.0.7-1.el7_9) (build 11.0.19+7-LTS, mixed mode, sharing)
Продолжаем.
Установка JMeter
Установку выполняем на все ноды кластера.
Переходим на официальную страницу загрузки JMeter и копируем ссылку на загрузку tgz-архива:
Использую эту ссылку, загружаем на наши серверы jmeter:
wget https://dlcdn.apache.org//jmeter/binaries/apache-jmeter-5.6.2.tgz
* на момент обновления инструкции это была версия 5.6.2.
Создадим каталог, куда будет выполнена установка jmeter:
mkdir /opt/jmeter
Распакуем в него содержимое скачанного архива:
tar -zxf apache-jmeter-*.tgz -C /opt/jmeter --strip-components 1
Для удобства работы создаем файл для настройки переменных окружения:
vi /etc/profile.d/jmeter.sh
export JMETER_HOME=/opt/jmeter
export PATH=$JMETER_HOME/bin:$PATH
* в данном примере мы создаем переменную JMETER_HOME с путем до нашего каталога и добавляем ее значение к переменной PATH, которая используется для поиска системой файлов запуска.
Запускаем на выполнение файл, чтобы создать в текущей сессии нужные нам переменные окружения:
source /etc/profile.d/jmeter.sh
Вводим:
jmeter -v
Мы должны увидеть версию нашего jmeter:
_ ____ _ ____ _ _ _____ _ __ __ _____ _____ _____ ____
/ \ | _ \ / \ / ___| | | | ____| | | \/ | ____|_ _| ____| _ \
/ _ \ | |_) / _ \| | | |_| | _| _ | | |\/| | _| | | | _| | |_) |
/ ___ \| __/ ___ \ |___| _ | |___ | |_| | | | | |___ | | | |___| _ <
/_/ \_\_| /_/ \_\____|_| |_|_____| \___/|_| |_|_____| |_| |_____|_| \_\ 5.6.2
Copyright (c) 1999-2023 The Apache Software Foundation
Инструмент установлен.
Настройка
Для возможности создать достаточно большую нагрузку, выполним тюнинг наших серверов.
На всех
Для максимального быстродействия, отключаем SSL. Для этого открываем файл:
vi /opt/jmeter/bin/jmeter.properties
И приводим значение директивы server.rmi.ssl.disable к:
server.rmi.ssl.disable=true
Идем дальше.
На управляющей ноде
Открываем конфигурационный файл:
vi /opt/jmeter/bin/jmeter.properties
* обратите внимание, что мы устанавливали jmeter в каталог /opt/jmeter. У вас это может быть другой путь.
Находим настройку:
remote_hosts=127.0.0.1
Меняем значение:
remote_hosts=jworker01,jworker02
* мы указали на сервере управления, что нагрузку будут создавать серверы jworker01 и jworker02. Обратите внимание, что наш сервер должен разрешать эти имена в IP-адреса.
На узлах для тестирования
Открываем файл:
vi /opt/jmeter/bin/jmeter
Редактируем значения для опции HEAP:
: "${HEAP:="-Xms8g -Xmx16g -XX:MaxMetaspaceSize=256m"}"
* данные значения зависят от возможностей нашей системы. Опция Xms указывает начальный пул выделения памяти для Java. Xmx указывает максимальный пул выделения памяти. Указываем значения ближе к максимуму памяти.
Выполним оптимизацию ядра для обработки сетевых соединений:
vi /etc/sysctl.d/99-jmeter.conf
net.ipv4.tcp_tw_reuse = 1
net.core.somaxconn = 60000
net.core.netdev_max_backlog = 7000
net.ipv4.tcp_max_syn_backlog = 7000
net.ipv4.ip_local_port_range = 2000 65000
* где:
- net.ipv4.tcp_tw_reuse — разрешает или запрещает использовать сокеты в состоянии TIME_WAIT. По умолчанию значение 0. Это не безопасно, но для тестирования нам нужно выжимать максимум.
- net.core.somaxconn — размер очереди для сокетов, ожидающих соединения. По умолчанию 128. Максимальное значение 65535, рекомендуется для серверов тестирования установить размер, близкий к этому числу.
- net.core.netdev_max_backlog — длина очереди для входящих пакетов между сетевой картой и ядром операционной системы. По умолчанию 300. Для интерфейса 1 Гбит оптимальное значение от 3000 до 7000, но не более 10000, для 10 Гбит до 30000.
- net.ipv4.tcp_max_syn_backlog — буфер под хранение SYN запросов на соединение. По умолчанию 1024.
- net.ipv4.ip_local_port_range — указываем диапазон портов, который может использоваться для исходящих. По умолчанию с 32768 по 61000. Для задач тестирования может понадобиться больший диапазон.
Применяем настройки:
sysctl -p /etc/sysctl.d/99-jmeter.conf
Создаем юнит-файл для сервиса jmeter:
vi /lib/systemd/system/jmeter.service
[Unit]
Description=Apache Jmeter server
Documentation=https://jmeter.apache.org/usermanual/remote-test.html
Wants=network-online.target
After=network-online.target
[Service]
LimitNOFILE=10240
Type=simple
Restart=on-failure
RestartSec=180s
WorkingDirectory=/tmp
ExecStart=/opt/jmeter/bin/jmeter-server
[Install]
WantedBy=multi-user.target
Разрешаем автозапуск jmeter и стартуем его:
systemctl enable jmeter --now
Проверяем статус запущенного сервиса:
systemctl status jmeter
Мы готовы запускать тесты.
Запуск теста
Пример запуска тестирования будет выглядеть так:
jmeter -t /tmp/my_test_file.jmx -n -r -X -f -l jmeter.jtl
* где /tmp/my_test_file.jmx — путь до файла с тестами (разработка данного файла не входит в тему данной инструкции).
где:
- -t <path/to/test>.jmx - путь и имя файла сценария тестирования;
- -n - запуск сценария в режиме командной строки, рекомендуется для щадящего использования памяти;
- -r - запуск сценария на тестирующих нодах, указанных в директиве remote_hosts файла конфигурации bin/jmeter.properties;
- -X - остановка сервера на тестирующих узлах, после окончания теста;
- -f - очистка журнала тестирования при запуске;
- -l <name.jtl> - имя журнального файла для сохранения данных тестирования. Используется при генерации отчета по тестированию.