Кластер 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

Использую эту ссылку, загружаем на наши серверы 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> - имя журнального файла для сохранения данных тестирования. Используется при генерации отчета по тестированию.
# DevOps # Linux # Серверы
Дмитрий Моск — частный мастер
Была ли полезна вам эта инструкция?

Да            Нет