Нагрузочное тестирование с JMeter
Apache JMeter — это инструмент для проведения нагрузочного тестирования, представляющий собой десктопное приложение с открытым исходным кодом на базе Java. JMeter позволяет определить, может ли тестируемое веб-приложение удовлетворять требованиям высокой нагрузки или нет. Он также помогает проанализировать работу всего сервера под высокой нагрузкой.
Тестирование производительности приложения с JMeter
JMeter помогает тестировать как статические, так и динамические ресурсы, помогает обнаружить пользователей, одновременно присутствующих на сайте, и включает визуальные инструменты для предоставления аналитики. Тестирование производительности веб-приложений с JMeter включает в себя нагрузочные тесты и стресс-тесты.
Этот инструмент предлагает следующие преимущества при тестировании производительности:
JMeter можно использовать для тестирования производительности как статических ресурсов, таких как JavaScript и HTML, так и динамических ресурсов, таких как JSP, сервлеты и AJAX.
С помощью JMeter можно определить максимальное количество пользователей в единицу времени, которое может выдержать тестируемый сайт.
JMeter предоставляет разнообразные визуальные отчеты проводимого анализа производительности.
Тестирование производительности с JMeter включает в себя:
Нагрузочное тестирование: моделирование ожидаемого использования веб-приложения путем имитации одновременного доступа множества пользователей.
Стресс-тестирование: каждый веб-сервер имеет предел максимальной нагрузки. Когда нагрузка превышает предел, веб-сервер начинает отвечать медленно и выдавать ошибки. Цель стресс-тестирования — определить максимальную нагрузку, которую может выдержать веб-сервер.
На рисунке ниже показано, как JMeter во время нагрузочного тестирования имитирует высокую нагрузку:
Создание плана тестирования производительности в JMeter
В этом руководстве мы проводим анализ производительности Google.com для 1000 пользователей с использованием различных инструментов тестирования производительности. Наша цель — убедиться, что сайт может справиться с нагрузкой и обеспечить непрерывный и беспроблемный пользовательский опыт.
Перед тестированием производительности веб-приложения мы должны определить:
Нормальную нагрузку: среднее количество пользователей, посещающих сайт.
Большую нагрузку: максимальное количество пользователей, посещающих сайт.
Цель проводимого тестирования.
Вот дорожная карта этого практического примера
Шаг 1) Добавить Thread Group (группа потоков)
Запустите JMeter
Выберите Test Plan (План теста)
Добавить Thread Group
Щелкните правой кнопкой мыши на "Test Plan" и добавьте новую группу потоков: Add -> Threads (Users) (Потоки (Пользователи)) -> Thread Group
На панели управления Thread Group введите Thread Properties (Свойства потока) следующим образом:
Number of Threads (Количество потоков): 100 (Количество пользователей, подключенных к веб-сайту: 100)
Loop Count (Количество итераций): 10 (Количество раз выполнения тестирования)
Ramp-Up Period: 100
Thread Count (Счетчик потоков) и Loop Counts (Счетчик итераций) отличаются.
Ramp-Up Period указывает JMeter, какую задержку перед запуском следующего пользователя нужно сделать. Например, если у нас 100 пользователей и период Ramp-Up 100 секунд, то задержка между запуском пользователей составит 1 секунду (100 секунд /100 пользователей).
Шаг 2) Добавление элементов JMeter
Теперь мы определяем, какие элементы JMeter будут в этом тесте. Этими элементами являются
HTTP request Default
Этот элемент можно добавить, щелкнув правой кнопкой мыши по Thread Group и выбрав: Add -> Config Element (Конфигурационные элементы) -> HTTP Request Defaults.
В панели управления HTTP Request Defaults введите адрес тестируемого веб-сайта (http://www.google.com).
HTTP Request (HTTP-запрос)
Щелкните правой кнопкой мыши на Thread Group и выберите: Add -> Sampler (Сэмплер) -> HTTP Request.
В панели управления HTTP-запросами (HTTP Request) поле Path указывает, какой URL-запрос (URL request) вы хотите отправить на сервер Google.
Например, если вы введете "calendar" в поле Path, JMeter создаст URL-запрос http://www.google.com/calendar к серверу Google.
Если оставить поле Path пустым, JMeter создаст URL-запрос http://www.google.com на сервер Google.
В этом тесте оставляем поле Path пустым, чтобы JMeter создал URL-запрос http://www.google.com на сервер Google.
Шаг 3) Добавление Graph Result (Графические результаты)
JMeter может показать результат теста в формате графика. Щелкните правой кнопкой мыши на Test Plan (План тестирования), Add (Добавить) -> Listener (Слушатель) -> Graph Results
Шаг 4) Запустите тест и получите результат тестирования
Нажмите кнопку Run (Ctrl + R) на панели инструментов, чтобы запустить процесс тестирования. Результат тестирования будет показан на графике в режиме реального времени. На рисунке ниже представлен график плана тестирования, в котором мы смоделировали 100 пользователей, зашедших на сайт www.google.com.
В нижней части рисунка приведена следующая статистика, представленная в цветах:
Черный: Общее текущее количество отправленных сэмплов.
Синий: Текущее среднее значение всех отправленных сэмплов.
Красный: Текущее стандартное отклонение (Deviation).
Зеленый: Пропускная способность (Throughput), которая представляет собой количество запросов в минуту, обработанных сервером.
Проанализируем производительность сервера Google на рисунке ниже.
Чтобы проанализировать производительность тестируемого веб-сервера, необходимо сосредоточиться на 2 параметрах:
Пропускная способность (Throughput)
Отклонение/погрешность (Deviation)
Пропускная способность является наиболее важным параметром. Она отражает способность сервера справляться с большой нагрузкой. Чем выше пропускная способность, тем выше производительность сервера.
В данном тесте пропускная способность сервера Google составляет 1 491,193 в минуту. Это означает, что сервер Google может обрабатывать 1 491,193 запросов в минуту. Это довольно высокое значение, поэтому можно сделать вывод, что у сервера Google хорошая производительность.
Отклонение показано красным цветом — оно указывает на отклонение от среднего значения. Чем меньше, тем лучше.
Давайте сравним производительность сервера Google с другими веб-серверами. Вот результат тестирования производительности сайта http://www.yahoo.com/ (вы можете выбрать другие сайты)
Пропускная способность тестируемого сайта http://www.yahoo.com составляет 867,326 в минуту. Это означает, что данный сервер обрабатывает 867,326 запросов в минуту, что ниже, чем у Google.
Отклонение составляет 2689, что намного больше, чем у Google (577). Таким образом, мы можем определить, что производительность этого сайта меньше, чем у сервера Google.
Примечание: Приведенные выше значения зависят от нескольких факторов, таких как текущая загрузка сервера Google, скорость интернета, мощность процессора и т.д. Следовательно, очень маловероятно, что вы получите те же результаты, что и выше. Поэтому не паникуйте! Если вы хотите понять, как нагрузка на сервер влияет на производительность и как ее проверить, вам может быть полезно это руководство по нагрузочному тестированию.
Устранение ошибок:
Если вы столкнулись с проблемой при выполнении вышеописанного сценария, сделайте следующее:
Проверьте, подключены ли вы к интернету через прокси-сервер. Если да, удалите прокси.
Откройте новый экземпляр Jmeter.
Откройте PerformanceTestPlan.jmx в Jmeter
Дважды щелкните на Thread Group -> Graph Result
Запустите тест
Материал подготовлен в рамках курса «Нагрузочное тестирование».
Комментарии (2)
vahmurka
07.07.2023 11:14с вашими цифрами на моём сайт получился вот такой график ))
что означает "No of samples"?
я правильно понимаю, что Deviation (красное), должно быть (в идеале) близко к Average (синему)?
Throughput 72 запроса в минуту - это значит, что если будет больше, то серверу будет всё хуже? это можно в юзеров перевести? ну например: если каждый юзер просматривает 3-5 страниц, то 72 запроса это примерно 10-20 юзеров в минуту, так?
как узнать, какая нагрузка уже является критической для сервера?
vahmurka
подскажите пожалуйста (для примера) циферки для сайта?
Нормальная нагрузка (среднее количество пользователей, посещающих сайт) - 1000 в сутки
Большая нагрузка (максимальное количество пользователей, посещающих сайт) - 10000 в сутки
что мне написать в Number of Threads, Loop Count, Ramp-Up Period, чтобы покрыть эти цифры?
я правильно понимаю, что в jmeter каждый url (страницу) надо тестировать отдельно? он сам не ходит по ссылкам? или можно как-то список ссылок ему скормить (как?)?
вот получил какие-то графики… а как мне понять выдерживает мой сервер нагрузки или нет? и в чём именно не выдерживает (что подкрутить память, проц, back)?
как заранее оценить время на тест (исходя из настроек Number of Threads, Loop Count, Ramp-Up Period)?