Как использовать Apache JMeter для выполнения нагрузочного тестирования на веб-сервере

Вступление

В этом руководстве мы рассмотрим, как использовать 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:

В зависимости от того, как вы устанавливаете 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]

План тестирования состоит из последовательности компонентов тестирования, которые определяют, как будет симулироваться нагрузочный тест. Мы объясним, как некоторые из этих компонентов могут использоваться, когда мы добавим их в наш план тестирования.

Добавить группу тем

Сначала добавьте группу потоков в план тестирования:

  1. Щелкните правой кнопкой мыши на Test Plan

  2. Наведите курсор мыши на _Добавить> _

  3. Наведите курсор мыши на _Threads (Пользователи)> _

  4. Нажмите на 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-запрос по умолчанию в группу потоков:

  1. Выберите Thread Group, затем щелкните правой кнопкой мыши

  2. Наведите курсор мыши на _Добавить> _

  3. Наведите курсор мыши на элемент _Config> _

  4. Нажмите на HTTP-запрос по умолчанию

В разделе «Параметры HTTP-запроса по умолчанию» в разделе «Веб-сервер» заполните поле «Имя_сервера» или «IP_» именем или IP-адресом веб-сервера, который вы хотите проверить. Установка сервера здесь делает его сервером по умолчанию для остальных элементов в этой группе потоков.

изображение: https: //assets.digitalocean.com/articles/jmeter/http_request_defaults.png [HTTP-запрос по умолчанию]

Если ваш веб-сервер использует файлы cookie, вы можете добавить поддержку файлов cookie, добавив HTTP Cookie Manager в группу потоков:

  1. Выберите Thread Group, затем щелкните правой кнопкой мыши

  2. Наведите курсор мыши на _Добавить> _

  3. Наведите курсор мыши на элемент _Config> _

  4. Нажмите на HTTP Cookie Manager

Добавить сэмплер HTTP-запроса

Теперь вам нужно добавить сэмплер HTTP-запроса в Thread Group, который представляет запрос страницы, к которому каждый поток (пользователь) получит доступ:

  1. Выберите Thread Group, затем щелкните правой кнопкой мыши

  2. Наведите курсор мыши на _Добавить> _

  3. Наведите курсор мыши на _Sampler> _

  4. Нажмите на запрос HTTP

В HTTP-запросе в разделе HTTP-запроса заполните Path элементом, который должен запрашивать каждый поток (пользователь). Мы установим это в + / +, чтобы каждый поток получал доступ к домашней странице нашего сервера. Обратите внимание, что вам не нужно указывать сервер в этом элементе, так как он уже был указан в элементе HTTP-запроса по умолчанию.

  • Примечание: * Если вы хотите добавить больше HTTP-запросов как часть вашего теста, повторите этот шаг. Каждый поток выполнит все запросы в этом плане тестирования.

Добавить результаты просмотра в Table Listener

В JMeter слушатели используются для вывода результатов нагрузочного теста. Доступно множество разных слушателей, а других слушателей можно добавить, установив плагины. Мы будем использовать таблицу, потому что ее легко читать.

  1. Выберите Thread Group, затем щелкните правой кнопкой мыши

  2. Наведите курсор мыши на _Добавить> _

  3. Наведите курсор мыши на _Listener> _

  4. Нажмите на Просмотр результатов в таблице

Вы также можете ввести значение для 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/.

Related