Цифровой элемент
15 минут на чтение
549
Отправь статью на почту?

Нагрузочное тестирование Java веб-приложений: подходы и инструменты

Подписаться

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

Содержание

Понимание нагрузочного тестирования

Нагрузочное тестирование — это процесс моделирования различных уровней пользовательской активности на веб-приложение для оценки его производительности. Основная задача этого тестирования заключается в том, чтобы понять, насколько эффективно система справляется с увеличивающимся трафиком и где находятся ее пределы. В результате нагрузочного тестирования выявляются точки отказа и определяется максимальная пропускная способность приложения.

В прошлом мы уже рассматривали тему нагрузочного тестирования в статье, где детально обсудили основные инструменты и подходы к проверке производительности приложений. Если вам интересна более широкая картина, рекомендуем ознакомиться с той статьей. А в этом материале мы сосредоточимся на специфике нагрузочного тестирования Java веб-приложений, рассмотрим основные методики, инструменты и лучшие практики для достижения оптимальных результатов.

Ключевые методики нагрузочного тестирования

  • Пиковая нагрузка (Spike Testing): Данный метод тестирования направлен на оценку реакции системы на резкое увеличение нагрузки. Он помогает выявить, как приложение справляется с внезапными всплесками пользовательской активности.
  • Длительное тестирование (Soak Testing): Метод заключается в проверке системы на ее способность функционировать под стабильной нагрузкой в течение длительного времени. Это позволяет обнаружить долгосрочные проблемы, такие как утечки памяти или сбои в подключении к базе данных.
  • Стресс-тестирование (Stress Testing): Этот вид тестирования позволяет оценить работу приложения при нагрузке, которая превышает ожидаемую. Цель состоит в том, чтобы определить, на каком этапе система начинает сбоить и как быстро она восстанавливается после перегрузки.
  • Постепенное увеличение нагрузки (Ramp-Up Testing): Здесь нагрузка на систему увеличивается плавно, пока не достигает заданного уровня. Такой подход помогает определить порог, при котором начинаются проблемы с производительностью.

Инструменты для нагрузочного тестирования Java веб-приложений

  • Apache JMeter: Популярный инструмент для проведения нагрузочного тестирования, который поддерживает множество протоколов, включая HTTP, HTTPS, SOAP и JDBC. JMeter предлагает широкий спектр возможностей для создания сложных тестовых сценариев и анализа результатов, что делает его универсальным решением для нагрузочного тестирования.
  •  	shell
    # Запуск теста в JMeter
     jmeter -n -t test_plan.jmx -l results.jtl -e -o /path/to/output/folder
  • Gatling: Этот инструмент, разработанный на языке Scala, отличается высокой производительностью и возможностью масштабирования. Gatling предоставляет удобный DSL для создания тестовых сценариев и мощные средства анализа, что делает его идеальным для сложных нагрузочных тестов.
  •  	scala
       class BasicSimulation extends Simulation {
         val httpProtocol = http.baseUrl("http://localhost:8080")
         val scn = scenario("Basic Scenario")
           .exec(http("request_1").get("/"))
         setUp(scn.inject(atOnceUsers(1000)).protocols(httpProtocol))
       }	
  • Locust: Написанный на Python, этот инструмент позволяет разрабатывать тестовые сценарии, используя знакомый разработчикам язык. Locust легко интегрируется с другими системами и дает возможность гибко управлять нагрузкой, что делает его удобным для использования в различных проектах.
  •  	python
       from locust import HttpUser, TaskSet, task
    
       class UserBehavior(TaskSet):
           @task
           def index(self):
               self.client.get("/")
    
       class WebsiteUser(HttpUser):
           tasks = [UserBehavior]
           min_wait = 5000
           max_wait = 9000
    
  • Apache Benchmark (ab): Этот легковесный инструмент предназначен для быстрого выполнения базовых тестов производительности веб-серверов. Он прост в использовании и подходит для быстрой оценки производительности приложений в условиях базовой нагрузки.
  •  	shell
       # Запуск теста с 1000 запросами и 100 параллельными пользователями
       ab -n 1000 -c 100 http://localhost:8080/

Пример нагрузочного тестирования с использованием Apache JMeter

Рассмотрим более подробно пример проведения нагрузочного тестирования Java веб-приложения с использованием Apache JMeter.

  1. Установка Apache JMeter:
    • Скачайте и установите Apache JMeter с официального сайта.
    • Запустите JMeter, используя команду jmeter в командной строке.
  2. Создание тестового плана:
    • Откройте JMeter и создайте новый тестовый план.
    • Добавьте Thread Group (Группу потоков), которая определяет количество пользователей (потоков), период разгона и количество циклов.
    
    	// Пример настройки Thread Group
    ThreadGroup threadGroup = new ThreadGroup();
    threadGroup.setName("Example Thread Group");
    threadGroup.setNumThreads(100);  // Количество пользователей
    threadGroup.setRampUp(10);       // Время разгона (в секундах)
    threadGroup.setLoopCount(1);     // Количество циклов
    
  3. Добавление элементов к тестовому плану:
    • Добавьте HTTP Request Sampler, чтобы определить запросы к вашему веб-приложению.
    • Укажите сервер, путь и другие параметры запроса.
    
    	// Пример настройки HTTP Request Sampler
    HTTPSampler httpSampler = new HTTPSampler();
    httpSampler.setDomain("example.com");
    httpSampler.setPort(80);
    httpSampler.setPath("/api/test");
    httpSampler.setMethod("GET");
    
  4. Добавление слушателей для анализа результатов:
    • Добавьте View Results Tree и Summary Report для визуализации результатов тестирования.
    
    
    	 // Пример настройки View Results Tree
    ViewResultsTree resultsTree = new ViewResultsTree();
    testPlan.add(resultsTree);
    
    // Пример настройки Summary Report SummaryReport summaryReport = new SummaryReport(); testPlan.add(summaryReport);
  5. Запуск теста и анализ результатов:
    • Запустите тестовый план и проанализируйте результаты, чтобы определить узкие места и потенциальные точки отказа.
// Запуск теста
JMeterEngine jmeterEngine = new StandardJMeterEngine();
jmeterEngine.configure(testPlan);
jmeterEngine.run();

// Анализ результатов for (SampleResult result : resultsTree.getResults()) { System.out.println("Response time: " + result.getTime()); System.out.println("Response code: " + result.getResponseCode()); }

Преобразование нагрузки в RPS вместо количества пользователей

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

Порядок действий:

  1. В Apache Jmeter кликнуть на корневой элемент с тестовым планом.
  2. Добавить новую переменную load_msg_sec (наименование переменной может быть любым).
  3. В качестве значения переменной можно установить как константное значение, так и параметризованное. Рассмотрим параметризованное.
  4. Для того чтобы добавить параметризованное значение нужно в столбце value добавить следующее:
  5. ${__P(load, 50)} , где load - наименование параметра. 50 - значение по умолчанию.
  6. Далее в группу потока (Thread group) нужно добавить Constant Throughput Timer (RBM - Add - Timer - Constant Throughput Timer)
  7. В поле Target throughput (in samples per minute) указывается следующая формула:
  8. ${__jexl3(${load_msg_sec} *60 * #percent#)}, где ${load_msg_sec} - количество запросов в секунду из переменной load_msg_sec, 60 - перевод из запросов в секунду в запросы в минуту (поскольку таймер принимает количество запросов в минуту), #percent# - процент от общего количества запросов (при проведении теста параллельно по всем адресам) указывается на основе методики нагрузочного тестирования.

Указание basic auth в Apache JMeter

Если нужно выполнить нагрузку на тестовых стендах, которые обычно закрыты Basic Auth, обычный запуск теста приведет к перманентным ответам с http кодом 403. Чтобы это исправить, нужно выполнить следующие действия.

  1. К группе потоков (Thread Group) добавляется BeanShell PreProcessor (RBM - add - Pre Processors - BeanShell PreProcessor) со следующим кодом:
  2. 
    import org.apache.commons.codec.binary.Base64;
    byte[] encodedUsernamePassword = Base64.encodeBase64("login:password".getBytes());
    vars.put("base64HeaderValue",new String(encodedUsernamePassword));
    
  3. К этой же группе потоков добавить HTTP Header Manager c заголовком
Name: Authorization
Value: Basic ${base64HeaderValue}, где  ${base64HeaderValue} - переменная назначенная в препроцессоре

Лучшие практики нагрузочного тестирования

  1. Реалистичные сценарии: Тестовые сценарии должны максимально точно отражать реальные условия использования приложения. Это позволяет более точно прогнозировать его поведение при эксплуатации и заранее выявлять потенциальные проблемы.
  2. Мониторинг и анализ: Во время проведения тестов важно использовать инструменты мониторинга, которые помогут отслеживать состояние системы и своевременно реагировать на возможные проблемы. Анализ данных позволяет выявить узкие места и оптимизировать систему для улучшения производительности.
  3. Регулярность тестирования: Нагрузочные тесты должны проводиться на постоянной основе, особенно после внесения значительных изменений в код или инфраструктуру. Это позволяет своевременно обнаруживать проблемы и поддерживать стабильную работу приложения.
  4. Интеграция с CI/CD: Включение нагрузочного тестирования в процессы непрерывной интеграции и доставки (CI/CD) обеспечивает автоматическую проверку производительности после каждого изменения в коде, что позволяет избегать введения проблем с производительностью в рабочую среду.
  5. Комбинирование инструментов: Использование нескольких инструментов для нагрузочного тестирования позволяет получить более полное представление о производительности приложения. Это помогает выявить различные аспекты поведения системы под нагрузкой и предложить более комплексные решения.
  6. Многоуровневое тестирование: Проведение тестов при различных уровнях нагрузки — от минимального до предельного — позволяет лучше понять, как приложение ведет себя в разных условиях, и выявить его пределы.
  7. Документирование и отчеты: Ведение детальной документации результатов тестирования и создание отчетов позволяют анализировать проделанную работу, выявлять тенденции и планировать дальнейшие улучшения.
  8. Оптимизация и настройка: После проведения тестов необходимо проводить оптимизацию системы, основываясь на полученных результатах. Это может включать в себя настройку серверов, оптимизацию запросов к базе данных и улучшение самого кода приложения.
  9. Сотрудничество с командой: Постоянное взаимодействие с командой разработки и другими заинтересованными сторонами способствует оперативному решению выявленных проблем и повышению качества продукта.

Вывод

Нагрузочное тестирование — важный этап в разработке и поддержке Java веб-приложений, который позволяет обеспечить их надежную и эффективную работу при различных уровнях нагрузки. Использование инструментов, таких как Apache JMeter, Gatling, Locust и Apache Benchmark, в сочетании с лучшими практиками тестирования, помогает выявить и устранить узкие места в системе, что позволяет поддерживать высокую производительность и стабильность работы приложений.

В компании «Цифровой элемент» мы регулярно проводим нагрузочное тестирование для крупных и сложных проектов, гарантируя их стабильность и высокую производительность даже в условиях значительных нагрузок. Наша команда включает в себя опытных специалистов, которые глубоко понимают все аспекты процесса тестирования — от разработки реалистичных сценариев до анализа результатов и оптимизации системы.

Для удобства мы разработали четкие процессы, позволяющие нам интегрировать нагрузочное тестирование в общую цепочку разработки и доставки программного обеспечения.

Если вам необходимо провести нагрузочное тестирование вашего веб-приложения, мы готовы предложить вам полный спектр услуг — от анализа текущей производительности до разработки и реализации рекомендаций по её улучшению. Обращайтесь к нам, и мы поможем вам достичь наилучших результатов, обеспечив надежную работу вашего приложения при любых нагрузках.



Пример протокола нагрузочного тестирования веб-приложения или сайта

Документ описывает результаты проведения нагрузочного тестирования системы.

Объект испытаний

Объектом испытаний нагрузочного тестирования является система.

Цели испытаний

  • Проверка соответствия разработанной системы предъявляемым требованиям.
  • Определение максимальной и пиковой производительности системы.
  • Проверка стабильности работы разработанной системы в течение длительного промежутка времени под нагрузкой.

Базовый профиль

Базовый профиль тестирования подразумевает собой набор исследуемых объектов.

Количество запросов рассчитано на основе требований к производительности системы и предполагаемого базового пользовательского пути.

Код

Требование

Значение

1

Общее количество запросов к системе в месяц

30 000 000

2

Пиковое количество запросов в месяц не менее

3 300 000

3

Пиковое количество запросов в неделю не менее

900 000

4

Пиковое количество запросов в день не менее

110 000

5

Количество пользователей в месяц

300 000

6

Количество пользователей в неделю

60 000

7

Количество пользователей в день

10 000

Расчетное количество запросов в час берется равным, исходя из расчета максимального количества запросов:

N запросов/ч = 30 000 000 / 30 / 24 = 41666.(6) ~= 42 000 запросов в час

На основе CJM (Customer journey map) выделяются объекты образующие основную нагрузку:

Объект

URI

Процент запросов в час

Количество запросов в час

Название объекта

/

27%

11 340

Название объекта

/…/

15%

6 300

Название объекта


/…/

11%

4 620

Название объекта

/…/

5%

2 100

Название объекта

/…/

16%

6 720

Название объекта

/…/

5%

2 100

Название объекта

/…/

6%

2 520

Название объекта

/…/

15%

6 300

Нагрузку на объекты распределили пропорционально целевой аудитории.

Запросы распределяются равномерно в течении часа, что дает общее количество запросов в секунду

N запросов/cек = 42 000 / 60 / 60 = 11,(6) ~= 12 запросов в секунду

План тестирования

План тестирования представляет из себя следующие пункты:

  • Разработка профиля нагрузочного тестирования;
  • Настройка систем мониторинга;
  • Разработка скриптов генерации нагрузки;
  • Подготовка тестовых данных (например, вариации значения поисковой строки) + скрипт наполнения базы тестовыми данными для теста и их удаления по завершению;
  • Проведение нагрузочных тестов;
  • Анализ результатов нагрузочных тестов.

Типы проводимых тестов

Методикой предусматривается проведение следующих тестов:

Поиск пиковой производительности

  • Нагрузка: ступенчатая
  • Начальная нагрузка: 40%
  • Шаг: + 30% от базового профиля
  • Продолжительность ступени: 30 минут или отказ Системы
  • Критерий завершения теста: отказ Системы
  • Критерий успешности теста: максимальная производительность системы выше значений базового профиля.

Проверка стабильности работы системы

  • Нагрузка: равномерная с плавным разгоном
  • Максимальная нагрузка: Базовый профиль
  • Время разгона: 15 мин.
  • Длительность основного этапа - 4 часа
  • Критерий завершения теста: истечение времени или Отказ Системы
  • Критерий успешности: окончание по истечении времени

Требования к производительности системы

Требования к утилизации ресурсов во время тестов

Утилизация ресурсов севера должна соответствовать следующим показателям:

  • Утилизация CPU не более 80%;
  • Утилизация RAM не более 80%.
  • Требование сформировано на основании экспертной оценки, требований к Системе не предъявлено.

Требования к количеству неуспешных запросов

Количество Неуспешных запросов не должно превышать следующие показатели от интенсивности входящей нагрузки:

  • Тест поиска максимальной производительности (последняя ступень) – 0,1%;
  • Тест подтверждения максимальной производительности (в ходе всего теста)– 0,1%;
  • Тест стабильности (в ходе всего теста)– 0,1%
  • Период агрегации соответствует периоду постоянной нагрузки в каждом из тестов.

Требования ко времени отклика и интенсивности типовых шагов бизнес операций

  • 90% — 50 мс,
  • 99% — 1000 мс,
  • 99,9% — 2500 мс,

Конфигурация стенда для НТ


Компонент

Значение

CPU Cores (количество ядер)

XX

RAM (Размер ОЗУ в Гб)

XXX

Поиск максимальной производительности

Максимальная производительность - нагрузка, выраженная в количестве обращений в секунду, превышающие границы утилизации ресурсов, описанных в разделе “Требования по утилизации ресурсов” настоящего документа..

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

Шаг рассчитывается как:

Шаг = Значение базового профиля * 0,4 = 4.8 => 5 - значение шага для увеличения нагрузки

Продолжительность шага составляет 30 минут

Первый шаг

RPS

CPU

RAM

Average (response, ms)

Min (response, ms)

Max (response, ms)

Error %

Результат

12 q/s

31,5%

6%

853

342

2332

0,01%

Соответствует


График результатов теста из jMeter.png
График результатов теста из jMeter
График использования ЦПУ (Grafana).png
График использования ЦПУ (Grafana)
График использования ОЗУ.png
График использования ОЗУ

Второй шаг

RPS

CPU

RAM

Average (response, ms)

Min (response, ms)

Max (response, ms)

Error %

Результат

17 q/s

44,8%

6%

823

339

3132

0,00%

Соответствует


График результатов теста из jMeter.png
График результатов теста из jMeter
График использования ЦПУ (Grafana).png
График использования ЦПУ (Grafana)
График использования ОЗУ.png
График использования ОЗУ

Третий шаг

RPS

CPU

RAM

Average (response, ms)

Min (response, ms)

Max (response, ms)

Error %

Результат

22 q/s

58,6%

6%

851

353

2041

0,00%

Соответствует


График результатов теста из jMeter.png
График результатов теста из jMeter
График использования ЦПУ (Grafana).png
График использования ЦПУ (Grafana)
График использования ОЗУ.jpg
График использования ОЗУ

Четвертый шаг

RPS

CPU

RAM

Average (response, ms)

Min (response, ms)

Max (response, ms)

Error %

Результат

27 q/s

73,6%

7%

841

337

2652

0,00%

Соответствует


График результатов теста из jMeter.png
График результатов теста из jMeter
График использования ЦПУ (Grafana).png
График использования ЦПУ (Grafana)
График использования ОЗУ.png
График использования ОЗУ

Пятый шаг

RPS

CPU

RAM

Average (response, ms)

Min (response, ms)

Max (response, ms)

Error %

Результат

32 q/s

88,0%

7%

764

342

2332

0,00%

Значение CPU превышает допустимый порог, при этом процент отказа равен 0. Определяем производительность как максимальную


График результатов теста из jMeter.png
График результатов теста из jMeter
График использования ЦПУ (Grafana).png
График использования ЦПУ (Grafana)
График использования ОЗУ.png
График использования ОЗУ

Вывод

Максимальная производительность системы после проведенного теста на поиск составляет XXX запросов в секунду, что больше чем ожидаемая нагрузка на XXXX%.

Система удовлетворяет описанным показателям производительности.

Тест на стабильность системы

Тест на стабильность выполняется с нагрузкой базового профиля продолжительное время. Время теста составляет 4 часа.

RPS

CPU

RAM

Average (response, ms)

Min (response, ms)

Max (response, ms)

Error %

Результат

12 q/s

33,6%

7%

503

343

4116

0,00%

Соответствует

График результатов теста из jMeter.png
График результатов теста из jMeter
График использования ЦПУ (Grafana).png
График использования ЦПУ (Grafana)
График использования ОЗУ.jpg
График использования ОЗУ

Вывод

На протяжении 4 часов тестирования стабильности системы процент отказа составил 0%, нагрузка равномерно распределена.

Система удовлетворяет описанным показателям производительности.


Мне не нравится
Россия, Челябинская область, Челябинск, ул. Энтузиастов, 2, оф. 200 Телефон: +7 (351) 220-45-35

Читайте в нашем блоге

Все статьи
Битрикс24 vs Microsoft SharePoint: Как выбрать оптимальную платформу для вашего бизнеса?

Битрикс24 vs Microsoft SharePoint: Как выбрать оптимальную платформу для вашего бизнеса?

Эффективность бизнеса во многом зависит от правильного выбора цифровых инструментов, обеспечивающих работу команды и управление документами. Дв...

10.09.2024
124
Внедрение системы управления персоналом и автоматизация: обзор HRM-систем

Внедрение системы управления персоналом и автоматизация: обзор HRM-систем

В современных условиях успешное управление персоналом невозможно без эффективных цифровых инструментов. HRM-системы играют ключевую роль в орга...

06.09.2024
123
ELMA365 CRM – система автоматизации и управления бизнес процессами

ELMA365 CRM – система автоматизации и управления бизнес процессами

ELMA365 CRM – это мощная и гибкая CRM-BPM система, разработанная российской компанией ELMA, специально для удовлетворения потре...

02.09.2024
130
Что делать, если Google Документы перестанут работать? Топ-9 альтернатив для России

Что делать, если Google Документы перестанут работать? Топ-9 альтернатив для России

Периодически в интернете появляются слухи о возможной блокировке Google Docs в России. Хотя пока нет серьезных причин для паники, лучше заранее...

27.08.2024
174
13 Альтернатив Miro: лучшие сервисы виртуальных досок для совместной работы

13 Альтернатив Miro: лучшие сервисы виртуальных досок для совместной работы

Miro – это онлайн-платформа для коллективной работы, которая эффективно заменяет традиционные маркерные доски. На Miro пользователи могут созда...

22.08.2024
181
Интеграция Битрикс24 с мессенджерами: преимущества и способы реализации

Интеграция Битрикс24 с мессенджерами: преимущества и способы реализации

В современном бизнесе коммуникация с клиентами становится ключевым фактором успеха. Чтобы эффективно взаимодействовать с клиентами и улучшать п...

21.08.2024
105
Directum RX: Интеллектуальная Платформа для Управления Бизнес-Процессами и Документами

Directum RX: Интеллектуальная Платформа для Управления Бизнес-Процессами и Документами

В современном мире эффективное управление бизнес-процессами и документооборотом играет ключевую роль в достижении конкурентных преимуществ. Ком...

19.08.2024
257
ERP-система для вашего бизнеса: подготовка и успешное внедрение 1С:ERP

ERP-система для вашего бизнеса: подготовка и успешное внедрение 1С:ERP

В современной экономической среде эффективное управление перестало быть просто конкурентным преимуществом, превратившись в необходимое условие ...

15.08.2024
197