четверг, 13 октября 2016 г.

Распределенное нагрузочное тестирование средствами Apache JMeter

Всем привет.

Предпосылки:

При проведение нагрузки в несколько потоков была замечена деградация производительности в секунду при превышение какого-то условного числа потоков. До этого момента производительность росла, после начала падать. Посмотрев что в конечном итоге при равном количестве совершенных запросов с ростом количества потоков время на проведения самого тестирования стало возрастать я предположил, что дело не в сервисе, а в моей рабочей машине на базе которой я и проводил все серии нагрузки.
Решение провести нагрузку в несколько потоков с нескольких машин.

Задача:

Необходимо провести нагрузочное тестирование в несколько потоков с нескольких машин. Собрать результаты и проанализировать.

Что есть под рукой:

Есть свой компьютер и несколько рабочих станций сотрудников в отделе.


Немного общей теории:

Источники вот эта PDF и вот эта статья в блоге .

И так подготовительные действия:
  1. На системах, которые будем настраивать брандмауэр должен быть отключен (или правильно настроен. Правильную настройку брандмауэра в рамках данного поста рассматривать не буду).
  2. Все клиенты JMeter должны быть  в рамках одной подсяти (можно в разных, но тут опять сложнее, у меня все в одной были).
  3. Сервер должен быть в сети с «серым» адресом (192.168.ххх.ххх или 10.ххх.ххх.ххх) если не в рамках серой сети, могут возникнут какие-то сложности ( не сталкивался)
  4. Убедитесь, что JMeter имеет доступ к серверу нагрузки.
  5. Убедитесь, что вы используете ту же версию JMeter на всех системах. Если версии ( к примеру отличаются расширениями) различны могут возникнуть проблемы с выполнением тестов.


Терминология:
Прежде чем далее рассказывать все по шагам определимся с терминологией
Master – это система, на которой запущен JMeter GUI , которая контролирует прохождение всего теста.
Slave – это система на которой запущен jmeter-server, принимает команды от графической оболочки (от Master) и посылает запросы к целевой системе (target)
Target – это целевая система. Которую мы планируем протестировать под нагрузкой.

Последовательность действий

  1. Подготавливаем себе исходный материал. Считаем что сам тест-план у нас уже есть. Нам понадобиться  архив с самим JMeter и на всякий случай JRE. По скольку я не стал долго выяснять есть ли на моих «подопытных» нужный мне софт я сразу себе собрал zip со своей же папки JMeter ( так я обеспечил условие одинаковости версий, ибо у меня все хранится прямо в самой папке, более того сам тест-план гарантированно использовал рукописные классы) и установщик JRE, так что бы везде было все одинаково. Установщик скачал с официального сайта (https://java.com/ru/download/).
  2. Скопировал подготовленные файлы на Slave машины.
  3.  Произвел настройку:
    1.  Установил JRE ( в некоторых случаях переустановил на более новую версию в некоторых установка была первой)
    2.  Распаковал архив с JMeter в папку с простым путем ( к примеру вот сюда D:\jmeter\)
    3.  Настроил следующие параметры окружения:
      1.  JEMETER_HOME  = <папка распаковки архива>
      2.  JMETER_BIN  = %JMETER_HOME%\bin\
      3.  JAVA_HOME  = <папка установки java>
      4. Path = %JAVA_HOME%\bin;%JMETER_HOME%\bin;<то что там было до этого>
    4. Проверил правильность настройки окружения в командной строке вбив две команды:  where java ; where jmeter. Должно было получиться два вот таких ответа:
    5.  Далее стартуем на Slave jmeter-server.bat . Проблемы если на компьютере несколько сетевых интерфейсов то может получиться так что по умолчанию jmeter-server запустится не на том IP-адресе. Как решить данную проблему? Через соответствующую строку запуска вот такую. Тут важно соблюдать все, включая пробелы:
    6. jmeter-server Djava.rmi.server.hostname=<требуемый ip
    7. На этом настройка Slave заканчивается далее приступаем к настройки Maste  
  4.  Настройка Master:
    1. Для этого надо в параметрах jmeter явно указать адреса всех Slave-машин. Идем в папку %JMETER_BIN% и открываем на редактирование jemeter.properties
        и меняем параметр remote_hosts. В нем через запятую перечисляем все наши Ip адреса.
    2. После запускам jmeter и открываем нужный нам тест-план.
    3. В меню у нас появляется вот такие штуки

В общем-то и все. Теперь несколько "важностей" для правильной настройки самого тест-плана. Все эти рекомендации доступны в выше приведенных источниках и в официальном описание продукта:
  • Четко помните, что каждый сервер будет выполнять не часть тестового плана, а весь тестовый план. К примеру, если у вас указано запустить 100 потоков, то каждый из серверов запустить 100 потоков.
  • Распределенное тестирование требует передачи большого объема данных, поэтому лучше всего будет собрать результаты тестирования просто в файл, а потом уже строить графики и проводить прочий анализ. По этой причине настраивайте план так, что бы все писалось именно в файл  (как это сделать я сейчас не расскажу).


На этом пока все. Приведенная выше инструкция не претендует на полноту и неоспоримость. Это описание того как я решил возникшую передо мной проблему.


Комментариев нет:

Отправить комментарий