Как использовать Apache JMeter для выполнения нагрузочного тестирования на веб-сервере
Введение
В этом руководстве мы рассмотрим, как использовать Apache JMeter для выполнения базового нагрузочного и стресс-тестирования в среде вашего веб-приложения. Мы покажем вам, как использовать графический интерфейс пользователя для создания плана тестирования и запуска тестов на веб-сервере.
JMeter — это настольное Java-приложение с открытым исходным кодом, предназначенное для загрузки тестов и измерения производительности. Его можно использовать для имитации загрузки различных сценариев и вывода данных о производительности несколькими способами, включая файлы CSV и XML и графики. Поскольку это 100% Java, он доступен в каждой ОС, поддерживающей Java 6 или более позднюю версию.
Предпосылки
Чтобы следовать этому руководству, вам понадобится компьютер, на котором вы можете запустить JMeter, и веб-сервер для загрузки теста. Не запускайте эти тесты на своих производственных серверах, если вы не знаете, что они могут справиться с нагрузкой, иначе вы можете негативно повлиять на производительность вашего сервера.
Вы можете адаптировать тесты из этого руководства к любому из ваших собственных веб-приложений. Веб-сервер, который мы тестируем в качестве примера, представляет собой VPS с 1 ЦП/512 МБ, работающий под управлением WordPress на стеке LEMP, в центре обработки данных NYC2 DigitalOcean. Компьютер JMeter работает в офисе DigitalOcean в Нью-Йорке (что связано с задержкой наших тестов).
Обратите внимание, что результаты теста JMeter могут быть искажены множеством факторов, в том числе системными ресурсами (ЦП и ОЗУ), доступными для JMeter, и сетью между JMeter и тестируемым веб-сервером. Размер нагрузки, которую JMeter может генерировать без искажения результатов, можно увеличить, запустив тесты в неграфическом режиме или распределив генерацию нагрузки на несколько серверов JMeter.
Установить JMeter
Поскольку мы используем Apache JMeter в качестве настольного приложения и используется большое количество операционных систем для настольных компьютеров, мы не будем рассматривать этапы установки JMeter для какой-либо конкретной ОС. При этом JMeter очень прост в установке. Самый простой способ установки — использовать менеджер пакетов (например, apt-get или Homebrew) или загрузить и разархивировать двоичные файлы JMeter с официального сайта и установить Java (версия 6 или более поздняя).
Вот список программного обеспечения со ссылками на архивы, необходимого для запуска JMeter:
- OpenJDK (6 или более поздняя версия)
- JMeter Apache
В зависимости от того, как вы устанавливаете Java, вам может потребоваться добавить каталог bin Java в переменную среды PATH
, чтобы JMeter мог найти двоичные файлы Java и keytool.
Кроме того, мы будем ссылаться на путь, по которому вы установили JMeter (каталог, в который вы его разархивировали), как $JMETER_HOME
. Поэтому, если вы работаете в ОС на основе Linux или Unix, двоичный файл JMeter находится в $JMETER_HOME/bin/jmeter
. Если вы используете Windows, вы можете запустить $JMETER_HOME/bin/jmeter.bat
.
Для справки: при написании этого руководства мы использовали следующие версии программного обеспечения:
- Обновление Oracle Java 7 60, 64-разрядная версия
- JMeter 2.11
После того, как вы установили и запустили JMeter, давайте перейдем к созданию плана тестирования!
Создание базового плана тестирования
После запуска JMeter вы должны увидеть графический интерфейс пользователя с пустым Планом тестирования:
План тестирования состоит из последовательности компонентов тестирования, которые определяют, как будет моделироваться нагрузочное тестирование. Мы объясним, как можно использовать некоторые из этих компонентов, когда мы добавим их в наш план тестирования.
Добавить группу потоков
Сначала добавьте Группу потоков в План тестирования:
- Нажмите правой кнопкой мыши на План тестирования
- Наведите указатель мыши на Добавить >
- Наведите указатель мыши на треды (пользователи) >
- Нажмите Группа тем
Группа потоков имеет три особенно важных свойства, влияющих на нагрузочный тест:
- Количество потоков (пользователей): количество пользователей, которых JMeter попытается смоделировать. Установите значение 50.
- Период разгона (в секундах): продолжительность времени, в течение которого JMeter распределяет запуск потоков. Установите значение 10.
- Счетчик циклов: количество раз выполнения теста. Оставьте это значение равным 1.
Добавить значения по умолчанию для HTTP-запроса
Элемент конфигурации HTTP Request Defaults используется для установки значений по умолчанию для HTTP-запросов в нашем плане тестирования. Это особенно полезно, если мы хотим отправить несколько HTTP-запросов на один и тот же сервер в рамках нашего теста. Теперь давайте добавим HTTP Request Defaults в Thread Group:
- Выберите Группа тем, затем щелкните ее правой кнопкой мыши.
- Наведите указатель мыши на Добавить >
- Наведите указатель мыши на элемент конфигурации >
- Нажмите Настройки HTTP-запроса по умолчанию
В разделе «Параметры HTTP-запроса по умолчанию» в разделе «Веб-сервер» введите в поле Имя или IP-адрес сервера имя или IP-адрес веб-сервера, который вы хотите протестировать. Установка сервера здесь делает его сервером по умолчанию для остальных элементов этой группы потоков.
Добавить диспетчер файлов cookie HTTP
Если ваш веб-сервер использует файлы cookie, вы можете добавить поддержку файлов cookie, добавив HTTP Cookie Manager в группу потоков:
- Выберите Группа тем, затем щелкните ее правой кнопкой мыши.
- Наведите указатель мыши на Добавить >
- Наведите указатель мыши на элемент конфигурации >
- Нажмите Диспетчер файлов cookie HTTP
Добавить сэмплер HTTP-запроса
Теперь вам нужно добавить сэмплер HTTP Request в Thread Group, который представляет запрос страницы, к которому будет обращаться каждый поток (пользователь):
- Выберите Группа тем, затем щелкните ее правой кнопкой мыши.
- Наведите указатель мыши на Добавить >
- Наведите указатель мыши на Сэмплер >
- Нажмите HTTP-запрос
В HTTP-запросе в разделе HTTP-запрос заполните Путь элементом, который вы хотите, чтобы каждый поток (пользователь) запрашивал. Мы установим это значение /
, поэтому каждый поток будет получать доступ к домашней странице нашего сервера. Обратите внимание, что вам не нужно указывать сервер в этом элементе, потому что он уже указан в элементе HTTP Request Defaults.
Примечание. Если вы хотите добавить дополнительные HTTP-запросы в рамках теста, повторите этот шаг. Каждый поток будет выполнять все запросы в этом плане тестирования.
Добавить результаты просмотра в Table Listener
В JMeter прослушиватели используются для вывода результатов нагрузочного теста. Доступно множество слушателей, а другие слушатели можно добавить, установив плагины. Мы будем использовать Таблицу, потому что она легко читается.
- Выберите Группа тем, затем щелкните ее правой кнопкой мыши.
- Наведите указатель мыши на Добавить >
- Наведите указатель мыши на Прослушиватель >
- Нажмите Просмотреть результаты в таблице
Вы также можете ввести значение для Имя файла, чтобы вывести результаты в файл CSV.
Запустите базовый план тестирования
Теперь, когда у нас настроен базовый план тестирования, давайте запустим его и посмотрим на результаты.
Сначала сохраните план тестирования, нажав Файл, затем Сохранить, затем укажите желаемое имя файла. Затем выберите Просмотреть результаты в таблице на левой панели, затем нажмите Выполнить в главном меню, затем нажмите Пуск (или просто нажмите зеленую кнопку Пуск стрелку под главным меню). Вы должны увидеть результаты теста в таблице, поскольку тест выполняется следующим образом:
Интерпретация результатов
Вы, вероятно, увидите, что Статус всех запросов — «Успех» (обозначается зеленым треугольником с галочкой). ) и Задержка (не отображается в примере).
- Задержка: количество миллисекунд, прошедшее между отправкой JMeter запроса и получением первоначального ответа.
- Время выборки: количество миллисекунд, которое потребовалось серверу для полного обслуживания запроса (ответ + задержка)
Согласно сгенерированной таблице диапазон времени выборки составлял 128-164 мс. Это разумное время отклика для базовой домашней страницы (около 55 КБ). Если ваш сервер веб-приложений не борется за ресурсы, как показано в примере, на время выборки будет влиять в первую очередь географическое расстояние (которое обычно увеличивает задержку) и размер запрошенного элемента (что увеличивает время передачи). Ваши личные результаты будут отличаться от примера.
Таким образом, наш сервер пережил нашу симуляцию 50 пользователей, обращающихся к нашей домашней странице WordPress размером 55 КБ в течение 10 секунд (5 каждую секунду), с приемлемым ответом. Давайте посмотрим, что произойдет, когда мы увеличим количество потоков.
Увеличение нагрузки
Давайте попробуем тот же тест с 80 потоками за 10 секунд. В элементе Группа потоков на левой панели измените Количество потоков (пользователей) на 80. Теперь нажмите Просмотреть результаты в таблице, затем нажмите Начать. На нашем примере сервера это приводит к следующей таблице:
Как видите, время выборки увеличилось почти до секунды, что указывает на то, что наш сервер веб-приложений начинает перегружаться запросами. Давайте войдем в наш VPS и быстро посмотрим на использование ресурсов во время нагрузочного теста.
Войдите на свой веб-сервер через SSH и запустите top
:
top
Если у вас нет пользователей, активно использующих ваш сервер, вы должны увидеть, что % использования ЦП пользователем (нас) должно быть очень низким или 0 %, а % простоя ЦП (id) должно быть 99%+, например:
Теперь в JMeter снова запустите тест, затем переключитесь обратно на сеанс SSH вашего веб-сервера. Вы должны увидеть увеличение использования ресурсов:
В нашем примере процент использования ЦП пользователем составляет 94%, а использование системы (sy) — 4,7% при 0% простоя. У нас не заканчивается память, как показано на изображении выше, поэтому снижение производительности связано с нехваткой мощности процессора! Мы также можем видеть, что процессы php5-fpm, которые обслуживают WordPress, используют большую часть ЦП (около 96% вместе взятых).
Чтобы удовлетворить требования этой симуляции 80 пользователей за 10 секунд, нам нужно либо увеличить наш ЦП, либо оптимизировать настройку нашего сервера, чтобы использовать меньше ЦП. В случае с WordPress мы могли бы переместить базу данных MySQL (которая использует часть ЦП) на другой сервер, а также реализовать кэширование (что уменьшило бы использование ЦП).
Если вам интересно, вы можете настроить количество потоков в тесте, чтобы увидеть, сколько может обрабатывать ваш сервер, прежде чем он начнет демонстрировать снижение производительности. В случае с нашим примером дроплета с 1 ЦП он работает нормально, пока мы не используем 72 потока в течение 10 секунд.
Заключение
JMeter может быть очень ценным инструментом для определения того, как следует улучшить настройку вашего сервера веб-приложений, чтобы уменьшить узкие места и повысить производительность. Теперь, когда вы знакомы с основами использования JMeter, не стесняйтесь создавать новые планы тестирования для измерения производительности ваших серверов в различных сценариях.
Тест, который мы использовали в качестве примера, не совсем точно отражает шаблон использования обычного пользователя, но JMeter имеет инструменты для выполнения различных тестов, которые могут быть полезны в вашей собственной среде. Например, JMeter можно настроить для имитации входа пользователя в ваше приложение, кэширования на стороне клиента и обработки пользовательских сеансов с перезаписью URL-адресов. Существует множество других встроенных семплеров, прослушивателей и инструментов настройки, которые помогут вам создать желаемый сценарий. Кроме того, существуют подключаемые модули JMeter для расширения его функциональности, которые можно загрузить по адресу http://jmeter-plugins.org/.