Вступление
В этом руководстве мы рассмотрим, как использовать Apache JMeter для выполнения базовых нагрузочных и стресс-тестов в среде вашего веб-приложения. Мы покажем вам, как использовать графический интерфейс пользователя для создания плана тестирования и запуска тестов на веб-сервере.
JMeter - это настольное Java-приложение с открытым исходным кодом, предназначенное для загрузки и тестирования производительности. Его можно использовать для имитации загрузки различных сценариев и вывода данных о производительности несколькими способами, включая файлы CSV и XML, а также графики. Поскольку это 100% Java, он доступен на каждой ОС, которая поддерживает Java 6 или более позднюю версию.
Предпосылки
Чтобы следовать этому руководству, вам понадобится компьютер, на котором вы можете запустить JMeter, и веб-сервер для загрузки теста. Не запускайте эти тесты на своих производственных серверах, если вы не знаете, что они могут справиться с нагрузкой, иначе вы можете отрицательно повлиять на производительность вашего сервера.
Вы можете адаптировать тесты в этом руководстве к любому из ваших собственных веб-приложений. В качестве примера веб-сервера, который мы тестируем, является VPS на 1 ЦП / 512 МБ, на котором работает WordPress в стеке LEMP в центре обработки данных DigitalOcean в Нью-Йорке. Компьютер JMeter работает в офисе DigitalOcean в Нью-Йорке (что связано с задержкой наших тестов).
Обратите внимание, что результаты теста JMeter могут быть искажены различными факторами, включая системные ресурсы (ЦП и ОЗУ), доступные для JMeter, и сеть между JMeter и тестируемым веб-сервером. Размер нагрузки, которую JMeter может генерировать без искажения результатов, можно увеличить, запустив тесты в неграфическом режиме или распределив распределение нагрузки на несколько серверов JMeter.
Установить JMeter
Поскольку мы используем Apache JMeter в качестве настольного приложения, и существует большое разнообразие используемых настольных ОС, мы не будем рассматривать шаги установки JMeter для какой-либо конкретной ОС. При этом, JMeter очень прост в установке. Самый простой способ установить это использовать менеджер пакетов (например, apt-get или Homebrew), либо загрузите и разархивируйте двоичные файлы JMeter с официального сайта и установите Java (версия 6 или более поздняя).
Вот список программного обеспечения со ссылками на архивы, * необходимый * для запуска JMeter:
-
Oracle Java или OpenJDK (6 или более поздняя версия)
В зависимости от того, как вы устанавливаете Java, вам может потребоваться добавить каталог Java bin в переменную окружения + 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 вы должны увидеть графический интерфейс пользователя с пустым Test Plan:
изображение: https: //assets.digitalocean.com/articles/jmeter/jmeter_start.png [GUI JMeter]
План тестирования состоит из последовательности компонентов тестирования, которые определяют, как будет симулироваться нагрузочный тест. Мы объясним, как некоторые из этих компонентов могут использоваться, когда мы добавим их в наш план тестирования.
Добавить группу тем
Сначала добавьте группу потоков в план тестирования:
-
Щелкните правой кнопкой мыши на Test Plan
-
Наведите курсор мыши на _Добавить> _
-
Наведите курсор мыши на _Threads (Пользователи)> _
-
Нажмите на Thread Group
Thread Group имеет три особенно важных свойства, влияющих на нагрузочный тест:
-
* Количество потоков (пользователей) *: Количество пользователей, которые JMeter попытается смоделировать. Установите это на * 50 *
-
* Период разгона (в секундах) *: Продолжительность времени, в течение которого JMeter будет распределять начало потоков. Установите для этого * 10 *.
-
* Количество циклов *: количество раз, чтобы выполнить тест. Оставьте этот набор на * 1 *.
изображение: https: //assets.digitalocean.com/articles/jmeter/thread_group1.png [Свойства группы потоков]
Добавить HTTP-запрос по умолчанию
Элемент конфигурации HTTP Request Defaults используется для установки значений по умолчанию для HTTP-запросов в нашем плане тестирования. Это особенно полезно, если мы хотим отправить несколько HTTP-запросов на один и тот же сервер как часть нашего теста. Теперь давайте добавим HTTP-запрос по умолчанию в группу потоков:
-
Выберите Thread Group, затем щелкните правой кнопкой мыши
-
Наведите курсор мыши на _Добавить> _
-
Наведите курсор мыши на элемент _Config> _
-
Нажмите на HTTP-запрос по умолчанию
В разделе «Параметры HTTP-запроса по умолчанию» в разделе «Веб-сервер» заполните поле «Имя_сервера» или «IP_» именем или IP-адресом веб-сервера, который вы хотите проверить. Установка сервера здесь делает его сервером по умолчанию для остальных элементов в этой группе потоков.
изображение: https: //assets.digitalocean.com/articles/jmeter/http_request_defaults.png [HTTP-запрос по умолчанию]
Добавить HTTP Cookie Manager
Если ваш веб-сервер использует файлы cookie, вы можете добавить поддержку файлов cookie, добавив HTTP Cookie Manager в группу потоков:
-
Выберите Thread Group, затем щелкните правой кнопкой мыши
-
Наведите курсор мыши на _Добавить> _
-
Наведите курсор мыши на элемент _Config> _
-
Нажмите на HTTP Cookie Manager
Добавить сэмплер HTTP-запроса
Теперь вам нужно добавить сэмплер HTTP-запроса в Thread Group, который представляет запрос страницы, к которому каждый поток (пользователь) получит доступ:
-
Выберите Thread Group, затем щелкните правой кнопкой мыши
-
Наведите курсор мыши на _Добавить> _
-
Наведите курсор мыши на _Sampler> _
-
Нажмите на запрос HTTP
В HTTP-запросе в разделе HTTP-запроса заполните Path элементом, который должен запрашивать каждый поток (пользователь). Мы установим это в + / +
, чтобы каждый поток получал доступ к домашней странице нашего сервера. Обратите внимание, что вам не нужно указывать сервер в этом элементе, так как он уже был указан в элементе HTTP-запроса по умолчанию.
-
Примечание: * Если вы хотите добавить больше HTTP-запросов как часть вашего теста, повторите этот шаг. Каждый поток выполнит все запросы в этом плане тестирования.
Добавить результаты просмотра в Table Listener
В JMeter слушатели используются для вывода результатов нагрузочного теста. Доступно множество разных слушателей, а других слушателей можно добавить, установив плагины. Мы будем использовать таблицу, потому что ее легко читать.
-
Выберите Thread Group, затем щелкните правой кнопкой мыши
-
Наведите курсор мыши на _Добавить> _
-
Наведите курсор мыши на _Listener> _
-
Нажмите на Просмотр результатов в таблице
Вы также можете ввести значение для Filename, чтобы вывести результаты в файл CSV.
Запустите базовый план тестирования
Теперь, когда у нас есть базовый план тестирования, давайте запустим его и посмотрим результаты.
Сначала сохраните план тестирования, нажав File, затем Save, затем укажите желаемое имя файла. Затем выберите View Results in Table на левой панели, затем нажмите Run в главном меню, затем нажмите Start (или просто нажмите зеленую стрелку Start под главным меню). Вы должны увидеть результаты теста в таблице, поскольку тест выполняется следующим образом:
изображение: https: //assets.digitalocean.com/articles/jmeter/results_table1.png [таблица результатов теста]
Интерпретация результатов
Вы, вероятно, увидите, что статус всех запросов - «Успешно» (обозначен зеленым треугольником с галочкой в нем). После этого наиболее интересными столбцами являются столбцы Sample Time (ms) _ и _ Latency _ (не показанные в примере).
-
* Задержка *: количество миллисекунд, прошедших между отправкой запроса JMeter и получением первоначального ответа.
-
* Время выборки *: количество миллисекунд, затраченных сервером для полного обслуживания запроса (ответ + задержка)
Согласно сгенерированной таблице диапазон времени выборки составлял 128-164 мс. Это разумное время ответа для базовой домашней страницы (около 55 КБ). Если ваш сервер веб-приложений не борется за ресурсы, как показано в примере, на время выборки будут влиять, главным образом, географическое расстояние (которое обычно увеличивает задержку) и размер запрашиваемого элемента (который увеличивает время передачи). Ваши личные результаты будут отличаться от примера.
Таким образом, наш сервер пережил нашу симуляцию 50 пользователей, получивших доступ к нашей домашней странице WordPress 55 КБ в течение 10 секунд (5 каждую секунду), с приемлемым ответом. Давайте посмотрим, что произойдет, когда мы увеличим количество потоков.
Увеличение нагрузки
Давайте попробуем тот же тест с 80 потоками в течение 10 секунд. В элементе Thread Group на левой панели измените Число потоков (пользователей) _ на * 80 *. Теперь нажмите View Results in Table, затем нажмите _Start. На нашем примере сервера это приводит к следующей таблице:
изображение: https: //assets.digitalocean.com/articles/jmeter/results_table2.png [Таблица результатов 2]
Как видите, время выборки увеличилось почти до секунды, что указывает на то, что наш сервер веб-приложений начинает перегружаться запросами. Давайте войдем в наш VPS и посмотрим, как мы кратко рассмотрим использование ресурсов во время нагрузочного теста.
Войдите на свой веб-сервер через SSH и запустите + top +
:
top
Если у вас нет активных пользователей, обращающихся к вашему серверу, вы должны увидеть, что загрузка ЦП% пользователей (us) должна быть очень низкой или 0%, а простоя ЦП (%)% (id) должно быть 99% +, как так:
изображение: https: //assets.digitalocean.com/articles/jmeter/top_idle.png [вывод в режиме ожидания]
Теперь в * JMeter * снова запустите тест, а затем переключитесь обратно на сеанс SSH вашего веб-сервера. Вы должны увидеть увеличение использования ресурса:
изображение: https: //assets.digitalocean.com/articles/jmeter/top_max_cpu.png [Максимальный выход ЦП]
В нашем примере загрузка ЦП% пользователей составляет 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/.