Контакты

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

Нагрузочное тестирование

Нагрузочное тестирование (англ. Load Testing ) - определение или сбор показателей производительности и времени отклика программно-технической системы или устройства в ответ на внешний запрос с целью установления соответствия требованиям, предъявляемым к данной системе (устройству).

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

Нагрузочное тестирование программного обеспечения

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

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

Пример 1:

Веб-сервис с функциональностью корзины покупателя рассчитан на 100 одновременно работающих пользователей, которые следуют некоторому определённому сценарию (заданные действия в указанных пропорциях):

  • 25 пользователей просматривают товар и выходят из системы.
  • 25 пользователей добавляют товар в корзину, оформляют его и выходят из системы.
  • 25 пользователей используют функцию возврата товара и выходят из системы.
  • 25 пользователей входят в систему и не проявляют никакой активности.

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

В идеальном случае в качестве критериев успешности нагрузочного тестирования выступают требования к производительности системы, которые формулируются и документируются на стадии разработки функциональных требований к системе до начала программирования основных архитектурных решений. Однако часто бывает так, что такие требования не были четко сформулированы или не были сформулированы вовсе. В этом случае первое нагрузочное тестирование будет являться пробным (exploratory load testing ) и основываться на разумных предположениях об ожидаемой нагрузке и потреблении аппаратной части ресурсов.

Одним из оптимальных подходов в использовании нагрузочного тестирования для измерений производительности системы является тестирование на стадии ранней разработки. Нагрузочное тестирование на первых стадиях готовности архитектурного решения с целью определить его состоятельность называется "Proof-of-Concept" тестированием.

Основные принципы нагрузочного тестирования

Ниже рассмотрены некоторые экспериментальные факты, обобщённые в принципы, используемые при тестировании производительности в целом и применимые к любому типу тестирования производительности (в частности и к нагрузочному тестированию).

1. Уникальность запросов

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

Иллюстрация различной дисперсии распределений для времени выполнения запросов X и Y.

В случае Примера 1 это может быть пользователь, обращающийся к отличным от всех остальных, уникальным страницам веб-сервиса.

2. Время отклика системы

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

В частности это означает, что имея достаточное количество измерений, можно определить вероятность с которой отклик системы на запрос попадёт в тот или иной интервал времени.

3. Зависимость времени отклика системы от степени распределённости этой системы.

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

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

4. Разброс времени отклика системы

Из утверждений 1, 2 и 3 можно также заключить, что при достаточно большом количестве измерений величины времени обработки запроса в любой системе всегда найдутся запросы, время обработки которых превышает определённые в требованиях максимумы; причем, чем больше суммарное время проведения эксперимента тем выше окажутся новые максимумы.

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

5. Точность воспроизведения профилей нагрузки

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

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

Инструментарий для тестирования производительности

Следует отметить, что для большинства видов тестирования производительности используется один и тот же инструментарий, умеющий выполнять типовые задачи.

Существует распространённое ошибочное понимание того, что инструменты для нагрузочного тестирования системы - это инструменты такие же по принципу записи и воспроизведения как и инструменты для автоматизации регрессионного тестирования . Инструменты для нагрузочного тестирования работают на уровне протокола, тогда как инструменты для автоматизации регрессионного тестирования работают на уровне объектов графического пользовательского интерфейса.

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

  • Приложение,
  • База данных,
  • Сеть,
  • Обработка на клиентской стороне,
  • Балансировка нагрузки.

Также следует отметить появление сетевых Business-to-business (B2B) приложений, использующих соглашение об уровне услуг (или SLA, Service Level Agreement). Нарастающая популярность B2B-приложений привела к тому, что всё больше приложений переходят на сервис-ориентированную архитектуру , в случае которой обмен информацией происходит без участия веб-браузеров. Примером такого взаимодействия может служить бюро туристических услуг, запрашивающее информацию об определённом авиарейсе между Санкт-Петербургом и Омском, в то время как авиакомпания обязана предоставить ответ в течение 5 секунд. Часто нарушение договора об SLA грозит крупным штрафом.

Наиболее популярные инструменты для нагрузочного тестирования представлены ниже.

ПО Наименование производителя Комментарии
OpenSTA "Open System Testing Architecture" Свободно распространяемое программное обеспечение для нагрузочного/стресс тестирования, лицензированное GNU GPL. Использует распределённую архитектуру приложений, основанную на CORBA . Доступна версия под Windows, хотя имеются проблемы с совместимостью с Windows Vista. Поддержка прекращена в 2007 году.
IBM Rational Performance Tester IBM Основанное на среде разработки Eclipse ПО, позволяющее создавать нагрузку больших объёмов и измерять время отклика для приложений с клиент-серверной архитектурой. Требует лицензирования.
JMeter Открытый проект Apache Jakarta Project Основанный на Java кроссплатформенный инструментарий, позволяющий производить нагрузочные тесты с использованием JDBC / FTP / LDAP / SOAP / JMS / POP3 / HTTP / TCP соединений. Даёт возможность создавать большое количество запросов с разных компьютеров и контролировать процесс с одного из них.
HP LoadRunner HP Инструмент для нагрузочного тестирования, изначально разработанный для эмуляции работы большого количества параллельно работающих пользователей. Также может быть использован для unit- или интеграционного тестирования .
SilkPerformer Micro Focus
Visual Studio Load Test Microsoft Visual Studio предоставляет инструмент для тестирования производительности включая load / unit testing
LoadComplete SmartBear

Основные показатели (метрики) производительности

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

1. Потребление ресурсов центрального процессора (CPU, %)

Метрика, показывающая сколько времени из заданного определённого интервала было потрачено процессором на вычисления для выбранного процесса. В современных системах важным фактором является способность процесса работать в нескольких потоках, для того, чтобы процессор мог производить вычисления параллельно. Анализ истории потребления ресурсов процессора может объяснять влияние на общую производительность системы потоков обрабатываемых данных, конфигурации приложения и операционной системы, мультипоточности вычислений, и других факторов.

2. Потребление оперативной памяти (Memory usage, Mb)

Метрика, показывающая количество памяти, использованной приложением. Использованная память может делиться на три категории:

  • Virtual - объём виртуального адресного пространства, которое использует процессор. Этот объём не обязательно подразумевает, использование соответствующего дискового пространства или оперативной памяти. Виртуальное пространство конечно и процесс может быть ограничен в возможности загружать необходимые библиотеки.
  • Private - объём адресного пространства, занятого процессором и не разделяемого с другими процессами.
  • Working Set - набор страниц памяти, недавно использованных процессом. В случае, когда свободной памяти достаточно, страницы остаются в наборе, даже если они не используются. В случае, когда свободной памяти остаётся мало, использованные страницы удаляются.

При работе приложения память заполняется ссылками на объекты, которые, в случае неиспользования, могут быть очищены специальным автоматическим процессом, называемым «сборщиком мусора» (англ. Garbage Collector ). Время затрачиваемое процессором на очистку памяти таким способом может быть значительным, в случае, когда процесс занял всю доступную память (в Java - так называемый «постоянный Full GC») или когда процессу выделены большие объёмы памяти, нуждающиеся в очистке. На время, требующееся для очистки памяти, доступ процесса к страницам выделенной памяти может быть заблокирован, что может повлиять на конечное время обработки этим процессом данных.

3. Потребление сетевых ресурсов

Эта метрика не связана непосредственно с производительностью приложения, однако её показатели могут указывать на пределы производительности системы в целом.

Пример 3:

Серверное приложение обрабатывая запрос пользователя, возвращает ему видео-поток, используя сетевой канал в 2 мегабит. Требование гласит, что сервер должен обрабатывать 5 запросов пользователей одновременно.

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

4. Работа с дисковой подсистемой (I/O Wait)

Работа с дисковой подсистемой может значительно влиять на производительность системы, поэтому сбор статистики по работе с диском может помогать выявлять узкие места в этой области. Большое количество чтений или записей может приводить к простаиванию процессора в ожидании обработки данных с диска и в итоге увеличению потребления CPU и увеличению времени отклика.

5. Время выполнения запроса (request response time, ms)

Время выполнения запроса приложением остаётся одним из самых главных показателей производительности системы или приложения. Это время может быть измерено на серверной стороне, как показатель времени, которое требуется серверной части для обработки запроса; так и на клиентской, как показатель полного времени, которое требуется на сериализацию / десериализацию , пересылку и обработку запроса. Надо заметить, что не каждое приложение для тестирования производительности может измерить оба этих времени.

См. также

Ссылки

  • Площадка услуг по тестированию сайтов и программного обеспечения (рус.)
  • Портал специалистов по тестированию и обеспечению качества ПО (рус.) - Проект посвящён вопросам тестирования и повышения качества программного обеспечения.
  • База знаний тестировщика (рус.) - Багтрекеры, автоматизированное тестирование, нагрузочное тестирование, юзабилити тестирование, сообщества, печатные издания, книги
  • Автоматизация нагрузочного тестирования (рус.)
  • Заметки по нагрузочному тестированию (рус.)

Литература

  • Лайза Криспин, Джанет Грегори Гибкое тестирование: практическое руководство для тестировщиков ПО и гибких команд = Agile Testing: A Practical Guide for Testers and Agile Teams. - М .: «Вильямс», 2010. - 464 с. - (Addison-Wesley Signature Series). - 1000 экз. - ISBN 978-5-8459-1625-9

Wikimedia Foundation . 2010 .

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

Все идет по плану

Прежде чем бросаться в бой, вначале следует разобраться, что мы хотим
получить в результате тестирования. Ведь проверка, как и любая другая работа,
требует предварительной подготовки. При неправильно сформулированной задаче
могут получиться результаты, которые будут не полностью отражать реальное
положение дел. Исходя из предполагаемой нагрузки веб-сервера, необходимо
определиться с критериями испытания. Установить, что будет считаться как успех,
а что как неприемлемая работа сервиса (например, время ответа, загрузка
сервера). Различают три варианта теста:

  • Нагрузочный (Load-testing) – определяется работоспособность системы
    при некоторой строго заданной заранее (планируемой, рабочей) нагрузке.
  • Устойчивости (Stress) – применяется для проверки параметров системы
    в анормальных и экстремальных условиях, основная задача во время этого теста -
    попытаться нарушить работу системы. Позволяет определить минимально
    необходимые величины системных ресурсов для работы приложения, оценить
    предельные возможности системы и факторы, ограничивающие эти возможности.
    Также определяется способность системы к сохранению целостности данных при
    возникновении внештатных аварийных ситуаций.
  • Производительности (Performance) – комплексная проверка, включающая
    предыдущие два теста, предназначена для оценки всех показателей системы.

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

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

  • сколько посетителей планируется принимать в среднем, в пиковой нагрузке,
    время пиковой нагрузки;
  • могут ли несколько пользователей иметь один и тот же IP-адрес и/или
    логин/пароль;
  • среднее количество страниц, просматриваемых одним пользователем, есть ли
    различия в поведении между зарегистрированными и анонимными пользователями,
    количественное соотношение между такими пользователями, посещаемые страницы и
    время нахождения пользователя на узле;
  • наличие динамических страниц и страниц, изменяемых в течение определенного
    периода, и как часто это происходит;
  • задействуется ли электронная почта, например, для подтверждения полномочий
    пользователя;
  • какая еще дополнительная информация используется для проверки статуса
    пользователя (cookies);
  • требуется ли подтверждение полномочий пользователя сторонней организацией
    или удаленным сервером (например, номер кредитной карточки), и будет ли
    представлена информация для тестирования;
  • доступная пропускная способность канала, средняя его ширина для одного
    пользователя;
  • может ли работа нескольких пользователей вызывать коллизию;
  • используется ли защищенное HTTPS-соединение;
  • используется ли Java-апплеты, потоковое медиа, специальные плагины, что
    требуется с клиентской стороны для их поддержки;
  • используется ли кэширование страниц;
  • плановые технические мероприятия, которые могут повлиять на работу
    сервера, и время их проведения (синхронизация, архивирование и пр.).

Любой из этих параметров может повлиять на конечный результат. Необязательно
все проверки включать в один тест, можно разбить сначала задачу на подзадачи.
Например, проверка базовой системы (серверы: веб, приложений, базы данных) и
проверка отдельных модулей (сервлеты, скрипты и пр., например, проверка
аутентификации при большом количестве пользователей). В результате при
тестировании выдаются графики трех видов: линейный, нелинейный и насыщение. В
первом случае при возрастании нагрузки время отклика (т.е. обработки) остается
постоянным. При дальнейшем увеличении нагрузки время отклика также увеличивается
(почти линейно), и, наконец, наступает ситуация, подобная DOS-атаке, когда время
отклика бесконечно увеличивается. Теперь, когда план действий готов, переходим к
краткому обзору утилит, которые помогут его воплотить. Начнем с бесплатных.

Open Systems Testing Architecture

OpenSTA (www.opensta.org)
- больше чем приложение для тестов, это открытая архитектура, проектируемая
вокруг открытых стандартов. Проект создан в 2001 году группой компаний CYRANO ,
которая поддерживала коммерческую версию продукта, но CYRANO распался, и сейчас
OpenSTA распространяется как приложение с открытым кодом под лицензией
GNU GPL, работает в Windows NT 4.0SP5/2000/XP. Для работы требует Microsoft Data
Access Components (MDAC), который можно скачать сайта корпорации.

Текущий инструментарий позволяет провести нагрузочное испытание HTTP/HTTPS
сервисов, хотя его архитектура способна на большее. OpenSTA позволяет
создавать тестовые сценарии на специализированном языке SCL (Script Control
Language). Для упрощения создания и редактирования сценариев используется
специальный инструмент Script Modeler. Выбираем Tools – Canonicalize URL,
запустится веб-браузер. Просто ходим по сайту, собирая ссылки, которые будут
сохранены в скрипт. Все параметры запроса поддаются редактированию, возможна
подстановка переменных. Структура теста и заголовки будут выводиться во вкладках
в панели слева. Тесты удобно объединять в наборы. Настройки прокси задаются в
самом скрипте, поэтому можно указать несколько серверов. Реализована возможность
организации распределенного тестирования, что повышает реалистичность, или когда
с одного компьютера не получается нагрузить мощный сервер. Каждая из машин такой
системы может выполнять свою группу заданий, а repository host осуществляет сбор
и хранение результатов. После установки на каждой тестирующей системе
запускается сервер имен, работа которого обязательна. Поддерживается
аутентификация пользователей на веб-ресурсе и установление соединений по
протоколу SSL. Параметры работы нагружаемой системы можно контролировать с
помощью SNMP и средств Windows NT. Результаты тестирования, включающие время
откликов, количество переданных байт в секунду, коды ответа для каждого запроса
и количество ошибок выводятся в виде таблиц и графиков. Использование большого
числа фильтров позволяет отобрать необходимые результаты. Результат можно
экспортировать в CSV-файл. Возможности по выводу отчетов несколько ограничены,
но по ссылкам на сайте можно найти скрипты и плагины, упрощающие, в том числе,
анализ полученной информации.

Apache JMeter

Apache JMeter (jakarta.apache.org/jmeter)
является Java-приложением с открытым кодом, предназначен для нагрузочного
тестирования не только веб-приложений и их отдельных компонентов (скрипты,
сервлеты, Java объекты и др.), но также FTP-серверов, баз данных (с
использованием JDBC) и сети. Функциональность расширяется с помощью плагинов.
Поддерживается SSL (через Java Secure Sockets Extension). Возможно проведение
тестов как с использованием графического интерфейса, так и из командной строки.
Использование Java подразумевает кроссплатформенность, поэтому JMeter
уверенно работает в различных *nix-системах, в Windows от 98 и некоторых других
ОС. Распространяется под Apache License.

В JMeter предусмотрены механизмы авторизации виртуальных
пользователей, поддерживаются пользовательские сеансы, шаблоны, кэширование и
последующий offline анализ результатов теста, функции позволяют сформировать
следующий запрос, основываясь на ответе сервера на предыдущий. Есть возможность
проводить распределенные тесты. В этом случае один из компьютеров является
сервером (bin/jmeter-server.bat), который управляет клиентами и собирает
итоговую информацию.

Для работы достаточно запустить ApacheJMeter.jar или в консоли jmeter.bat
(Windows) или jmeter.sh (*nix).

JMeter имеет встроенный прокси-сервер, который предназначен для записи
сессий, но можно использовать и внешний. Перед началом тестирования необходимо
составить тестовый план, описывающий серию заданий, которые необходимо выполнить
JMeter . Он должен содержать одну или несколько групп потоков (Thread
Groups) и другие элементы:

  • Логические контроллеры (Logic controllers);
  • Типовые контроллеры (Sample generating controllers);
  • Слушатели (Listeners);
  • Таймеры (Timers);
  • Соответствия (Assertions);
  • Конфигурационные элементы (Configuration elements).

Первым делом добавляем группу потоков (Edit - Add - Thread Group). В ее
настройках указываем название, количество запускаемых потоков, то есть
виртуальных пользователей (Number of threads), время задержки между запуском
потоков (Ramp-Up Period), количество циклов выполнения задания (Loop Count),
здесь же можно определить выполнение задания по расписанию (Sheduler). Далее,
щелкая в созданную группу, необходимо добавить образец запроса (Sampler), выбрав
его из списка. Для нагрузочного тестирования или проверки работоспособности
сервера достаточно выбрать HTTP Request (Add -Sampler - HTTP Request). Здесь
указываем название, IP-адрес и порт веб-сервера, протокол, метод передачи данных
(GET, POST), параметры переадресации, передачу файлов на сервер. Настраиваем и
жмем на Run. Вывод результата осуществляется с помощью Listeners, каждый
по-своему выводит результат. Например, Aggregate Graph выводит суммарные
результаты теста в виде таблицы и графика.

Бесплатные продукты, увы, закончились, теперь парочка коммерческих решений.

WAPT – Web Application Testing

WAPT (www.loadtestingtool.com)
позволяет испытать устойчивость веб-сайта и других приложений, использующих
веб-интерфейс, к реальным нагрузкам. Разрабатывается новосибирской компанией
SoftLogica LLC. Это одна из самых простых в использовании программ обзора. Для
проведения простого теста даже не нужно заглядывать в документацию, интерфейс
прост, но не локализован. Работает под управлением Windows от 98, поддерживается
и Vista. Для проверки WAPT может создавать множество виртуальных
пользователей, каждый с индивидуальными параметрами. Поддерживается несколько
видов аутентификации и куки. Сценарий позволяет изменять задержки между
запросами и динамически генерировать некоторые испытательные параметры,
максимально имитируя таким образом поведение реальных пользователей. В запрос
могут быть подставлены различные варианты HTTP-заголовка, в настройках можно
указать кодировку страниц. Параметры User-Agent, X-Forwarded-For, IP указываются
в настройках сценария. Значения параметров запроса могут быть рассчитаны
несколькими способами, в том числе, определены ответом сервера на предыдущий
запрос, используя переменные и функции. Поддерживается работа по защищенному
протоколу HTTPS (и все типы прокси-серверов). Созданные сценарии, сохраняемые в
файле XML-формата, можно использовать повторно. Кроме стандартных Performance и
Stress, в списке присутствуют несколько других тестов, позволяющих определить
максимальное количество пользователей и тестировать сервер под нагрузкой в
течение долгого периода.

Для проведения теста необходимо выбрать New – Scenario, в результате
запустится мастер создания теста. На первом шаге указывается тип теста и далее в
каждом окне заполняются параметры будущего теста. Здесь можно указать
фиксированное количество виртуальных пользователей, либо ступенчатое увеличение
с указанием минимального и максимального числа и временного интервала, выставить
таймер проведения теста. На следующем шаге задается время между кликами (think
time), скорость соединения, указывается диапазон IP-адресов, который будет
использован виртуальными пользователями. Нажатие на IP Adress List позволит
составить список таких адресов. Также выставляется HTTP-параметр User-Agent и
включается эмуляция прокси. Если требуется, чтобы виртуальные пользователи имели
индивидуальные настройки, на следующем шаге мастера для каждого из них
необходимо создать свой профиль, нажав New или загрузив сохраненный. В следующем
окне программы необходимо выставить параметры профилей.

После нажатия на кнопку Готово сценарий сохраняется. Теперь, чтобы указать на
объект тестирования, создаем профиль New – Profile и заполняем все параметры на
вкладках. Здесь же доступны для редактирования некоторые параметры, задаваемые
раннее с помощью мастера. Также указывается загрузка рисунков виртуальным
пользователем, параметры аутентификации, использование Cookies и другие.
На вкладке Recorder указываем адрес сайта, доступность которого можно тут же
проверить, нажав Go. Одновременно последует запрос на запуск Recorder, который
будет отслеживать посещенные страницы и записывать URI (они будут выводиться в
панели слева). Когда вся информация собрана, нажимаем Run Test. Подробные отчеты
в форме графика выводятся по ходу проведения теста, по окончании будет
сформирована HTML-страница. В результате можно получить информацию о времени
ответа сервера с возрастанием нагрузки, по количеству ошибок, переданных и
принятых байт и т.д.

NeoLoad

NeoLoad (www.neotys.com)
- еще одна система, позволяющая провести нагрузочное тестирование
веб-приложений. Написана на Java, работает на компьютерах, работающих под
управлением Windows NT/2000/XP, Linux и Solaris. В отчете можно получить
подробную информацию по каждому загруженному файлу. NeoLoad весьма удобен для
оценки работы отдельных компонентов (AJAX, PHP, ASP, CGI, Flash, апплетов и
пр.). Возможна установка времени задержки между запросами (thinktime) глобально
и индивидуально для каждой страницы. Тестирование проводится как с
использованием весьма удобной графической оболочки, так и с помощью командной
строки (используя заранее подготовленный XML-файл). Поддерживает работу с
протоколом HTTPS, с HTTP и HTTPS прокси, basic веб-аутентификацию и cookies,
автоматически определяя данные во время записи сценария, и затем проигрывает во
время теста. Для работы с различными профилями для регистрации пользователей
могут быть использованы переменные. При проведении теста можно задействовать
дополнительные мониторы (SNMP, WebLogic, WebSphere, RSTAT и Windows, Linux,
Solaris), позволяющие контролировать и параметры системы, на которой работает
веб-сервер.

При помощи NeoLoad можно проводить и распределенные тесты. Один из
компьютеров является контролером, на остальные устанавливаются генераторы
нагрузки (loadGenerator). Контролер распределяет нагрузку между loadGenerator и
собирает статистику.

Очень удобно реализована работа с виртуальными пользователями. Пользователи
имеют индивидуальные настройки, затем они объединяются в Populations (должна
быть создана как минимум одна Populations), в Populations можно задать общее
поведение (например, 40% пользователей популяции посещают динамические ресурсы,
20% читают новости). Виртуальные пользователи могут иметь индивидуальный
IP-адрес, полосу пропускания и свой сценарий теста.

Сценарий будущего теста создать очень просто. Запускаем приложение (при
первом запуске потребуется ввести регистрационный ключ, 30-дневная версия после
регистрации будет отправлена по почте), выбираем New Project, вводим название
проекта. После этого будет показана небольшая подсказка по поводу дальнейших
действий, нажатие Start Recording запустит веб-браузер, все перемещения будут
записаны. По окончании нажимаем Stop Recording или закрываем браузер.
Запускается мастер, который поможет создать виртуальных пользователей и
произведет автоматический поиск динамических параметров в записанных страницах,
выставит среднее значение thinktime. Компоненты страницы (HTML, images, CSS)
сохраняются отдельно. Для получения результата требуется пройти три шага:

  • Design - настройка проекта, здесь три вкладки. В Repository указываются
    веб-страницы и параметры запросов, в Virtual User создаются виртуальные
    пользователи, указываются URL, которые они должны "посетить", и дополнительные
    условия из левой вкладки поля Actions. В Populations – задания каждой из групп
    пользователей. В Actions могут быть выбраны следующие действия: Delay
    (установка задержки), Loop (повтор запроса), While (цикл), If...Then...Else
    (условие), Container и Random Container (групповые действия), Try...Catch
    (обработка ошибок), Stop virtual user (останов работы виртуального
    пользователя).
  • Runtime – указываются параметры теста, проводится тест. Здесь же в
    отдельных вкладках по ходу проведения теста выводится статистика.
  • Results – отвечает за вывод различной статистики в виде таблиц и графиков.

Причем кроме общих значений, с помощью системы фильтров можно отобрать
информацию по любому параметру. При желании проект сохраняется для повторного
использования. Среди представленных продуктов возможность сравнения результатов
теста есть только у NeoLoad .

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

Продукты от Microsoft

Корпорация Microsoft предлагает целых два продукта, позволяющих
протестировать веб-сервер под нагрузкой. Это Microsoft Application Stress
Tool
и Web Capacity Analysis Tool . Первый распространяется как
отдельный продукт и имеет графический интерфейс. Второй входит в состав
комплекта инструментов Internet Information Services 6.0 Resource Kit Tools ,
работает из командной строки. MAST более наглядный, в создании теста
поможет простой мастер создания тестов, возможна работа с cookies, регулировка
нагрузки по разным URL. Сценарий тестирования может быть создан вручную или
записан с помощью веб-браузера и при необходимости отредактирован. В WAST
уровень нагрузки (stress level) регулируется путем задания количества нитей,
осуществляющих запросы к серверу, а число виртуальных пользователей
рассчитывается как произведение числа нитей на число сокетов, открытых каждой из
нитей. По окончании теста получаем простой отчет в текстовой форме, в котором
дана информация по числу обрабатываемых запросов в единицу времени, среднему
времени задержки, скорости передачи данных на сервер и с сервера, количеству
ошибок и т.д. Отчет можно экспортировать в CSV-файл. Никаких возможностей по
статистической обработке не предусмотрено, то есть с его помощью можно только
оценить работу при определенных условиях.

Нагрузочное тестирование – определение или сбор показателей производительности и времени отклика программно-технической системы или устройства в ответ на внешний запрос с целью установления соответствия требованиям, предъявляемым к данной системе (устройству). (Википедия)

Зачем производится нагрузочное тестирование:

  • Проверка и оптимизация конфигурации оборудования, виртуальных машин, серверного программного обеспечения;
  • Оценка максимальной производительности, которую способен выдерживать проект с типовыми сценариями нагрузки на доступных ресурсах;
  • Влияние модулей проекта на производительность, сценарии обработки пиковой нагрузки;
  • Оценка стабильности при максимальных нагрузках при проведении 24-часовых тестов с учетом внешних факторов (импорты, резервное копирование и т.п.);
  • Выявление ограничений конфигурации, определение методов дальнейшего масштабирования и оптимизации.

Вообще, существует огромное количество инструментов для нагрузочного тестирования, как opensource, так и коммерческих. Остановимся на наиболее часто используемых и расскажем об их основных возможностях.

Apache HTTP server benchmarking tool

Бесплатный

Официальный сайт

Самый часто используемый, т.к входит в состав Apache.

Ab ://]hostname[:port]/path

где основные необходимые options:

C concurrency - количество одновременных запросов к серверу (по умолчанию 1);
-n requests - общее количество запросов (по умолчанию 1).

В результате команды получаем такой отчет:

Concurrency Level: 10 Time taken for tests: 0.984 seconds Complete requests: 100 Failed requests: 0 Write errors: 0 Total transferred: 3725507 bytes HTML transferred: 3664100 bytes Requests per second: 101.60 [#/sec] (mean) Time per request: 98.424 (mean) Time per request: 9.842 (mean, across all concurrent requests) Transfer rate: 3696.43 received Connection Times (ms) min mean[+/-sd] median max Connect: 1 2 3.6 1 23 Processing: 63 94 21.5 90 173 Waiting: 57 89 21.6 84 166 Total: 64 96 21.5 92 174

Плюсы :

  • Есть везде, где есть Apache;
  • Не требует никакой дополнительной настройки;
  • Очень простой инструмент.

Минусы :

  • Очень простой инструмент;
  • Тестирует только производительность веб-сервера: опрашивает только один URL, не поддерживает сценарии нагрузки, невозможно имитировать пользовательскую нагрузку и оценить работоспособность проекта со всех сторон - как с точки зрения инфраструктуры, так и с точки зрения разработки.

Joe Dog Siege

Бесплатный

Официальный сайт .

Немного сложнее ab и необходимые задачи выполняет гораздо лучше.

В файле-сценарии задаются URL-ы и запросы тестирования. Если сценарий большой по объему, то можно вынести все запросы в отдельный файл и в команде указать этот файл при тестировании:

# cat urls.txt # URLS file for siege # -- http://www.bitrix24.ru/ http://www.bitrix24.ru/support/forum/forum1/topic3469/?PAGEN_1=2 http://www.bitrix24.ru/register/reg.php POST domain=test&login=login http://www.bitrix24.ru/search/ POST

В команде указывается количество пользователей -с, количество повторений -r и задержку между хитами -d .

Результат можно выводить в log-файл или сразу в консоль в режиме реального времени:

HTTP/1.1 200 0.44 secs: 12090 bytes ==> GET / HTTP/1.1 200 0.85 secs: 29316 bytes ==> GET /support/forum/forum1/ HTTP/1.1 200 0.85 secs: 29635 bytes ==> GET /support/forum/forum1/ HTTP/1.1 200 0.34 secs: 12087 bytes ==> GET / [...] done. Transactions: 100 hits Availability: 100.00 % Elapsed time: 12.66 secs Data transferred: 1.99 MB Response time: 0.64 secs Transaction rate: 7.90 trans/sec Throughput: 0.16 MB/sec Concurrency: 5.02 Successful transactions: 100 Failed transactions: 0 Longest transaction: 1.06 Shortest transaction: 0.31

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

Плюсы :

  • Многопоточный;
  • Можно задавать как количество запросов, так и продолжительность (время) тестирования - т.е можно эмулировать пользовательскую нагрузку;
  • Поддерживает простейшие сценарии

Минусы :

  • Ресурсоемкий;
  • Мало статистических данных и не очень хорошо эмулирует такие пользовательские сценарии, как ограничение скорости запросов пользователя;
  • Не подходит для серьезного и масштабного тестирования в сотни и тысячи потоков, т.к он сам по себе ресурсоемкий, а на большом количестве запросов и потоков очень сильно нагружает систему.

Apache JMeter

Бесплатный

Официальный сайт

Основные возможности:

  • Написан на Java;
  • HTTP, HTTPS, SOAP, Database via JDBC, LDAP, SMTP(S), POP3(S), IMAP(S);
  • Консоль и GUI;
  • Распределенное тестирование;
  • План тестирования – XML-файл;
  • Может обрабатывать лог веб-сервера как план тестирования;
  • Визуализация результатов в GUI.

Результаты выводятся в графическом виде:

Плюсы :

  • Кроссплатформенный, т.к написан на Java;
  • Очень гибкий, используется много протоколов, не только веб-сервер, но и базы;
  • Управляется через консоль и gui интерфейс;
  • Использование напрямую логов веб-сервера Apache и Nginx в качестве сценария c возможностью варьирования нагрузки по этим профилям;
  • Достаточно удобный и мощный инструмент.

Минусы :

  • Ресурсоемкий;
  • На длительных и тяжелых тестах часто падает по разным причинам;
  • Стабильная работа зависит от окружения и конфигурации сервера.

Tsung

Бесплатный

Официальный сайт

Основные возможности:

  • Написан на Erlang;
  • HTTP, WebDAV, SOAP, PostgreSQL, MySQL, LDAP, Jabber/XMPP;
  • Консоль (GUI через сторонний плагин);
  • Распределенное тестирование (миллионы пользователей);
  • Фазы тестирования;
  • План тестирования – XML;
  • Запись плана с помощью Tsung recorder’а;
  • Мониторинг тестируемых серверов (Erlang, munin, SNMP);
  • Инструменты для генерации статистики и графиков из логов работы.

С помощью собственных скриптов, которые обрабатывают логи работы, можно выводить различные отчеты по тестированию:


Плюсы :

  • Т.к на писан на Erlang, то хорошо масштабируется, зависит от выделяемых ресурсов;
  • Может выполнять роль распределенной системы, на большом количестве машин;
  • Большое количество тестируемых систем - не только веб-серверы и БД, но и, к примеру, XMPP-сервер: может отправлять сообщения, тесты с авторизацией;
  • Управление через консоль, но, благодаря поддержке плагинов, можно управлять и с помощью стороннего плагина с gui-интерфейсом;
  • Наличие в комплекте инструмента Tsung Recorder - своего рода, proxy-сервер, через который можно ходить по тестируемому сайту и записывать сразу как профиль нагрузки;
  • Генерация различных графиков тестирования с помощью скриптов.

Минусы :

  • Нет gui-интерфейса;
  • Только *nix системы.

WAPT

Платный

Официальный сайт

Основные возможности:

  • Windows
  • Платный (есть триал на 30 дней / 20 виртуальных пользователей);
  • Запись плана тестирования из десктопных и мобильных браузеров;
  • Зависимости в планах тестирования (последующий URL в зависимости от ответа сервера);
  • Имитации реальных пользователей (задержки между соединениями, ограничение скорости соединений).

Отчет можно вывести как таблицей, так и графиком.

Далеко не каждый пользователь современной компьютерной системы в повседневной работе сталкивается с понятием «нагрузочное тестирование». В основном оно знакомо веб-разработчикам и всем тем, кто использует ресурсоемкие программы. Тем не менее иногда знания в этом вопросе могут пригодиться и рядовым юзерам. Попробуем разобраться, зачем все это нужно.

Нагрузочное и цели

Прежде всего, стоит четко разграничить виды таких тестов. Условно их можно подразделить на два класса: проверка компьютерного «железа» при максимально возможной или чрезмерной нагрузке на каждый компонент и (веб-сайтов с элементами прогнозирования, отдельно взятых программ и т. д.).

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

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

Как видим, взаимосвязь здесь очень сильная. И если говорить о «железе», система нагрузочного тестирования с использованием специальных утилит позволяет достаточно точно выявить потенциальные неполадки при работе, так сказать, в самый простой. Современные компьютерные игры с их требованиями могут запросто нагрузить систему до такого состояния, что она вообще перестанет работать. Поэтому, прежде чем устанавливать такое ПО на компьютер, можно провести серию тестов, чтобы определить, сможет ли начинка «тянуть» игру. По результатам и принимается решение об установке программы. В принципе, то же самое касается и приложений, предполагающих проведение сложных математических расчетов, и проектных работ, поскольку нагрузка на тот же процессор или оперативную память по сравнению с обычным состоянием системы может быть превышена в разы.

Что же касается второго класса, тестирование сайта и сервера может выступать как некое универсальное средство прогнозирования их поведения в условиях реального функционирования. К примеру, это может быть эмуляция одновременного запроса доступа большого числа пользователей. Как известно, по такому принципу действуют DDoS-атаки, когда сервер или сайт не успевает обрабатывать слишком большое количество обращений. Нагрузочное тестирование сервера или сайта будет рассмотрено подробнее несколько позже. А пока займемся компьютерным «железом». Это касается не только домашних или рабочих терминалов, но и реальных физических серверных систем.

Тест процессора

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

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

При использовании утилиты для начала рекомендуется закрыть все активные приложения и отключить автоматический (сна), чтобы компьютер ненароком не отключился в процессе проверки. Теперь нужно смоделировать процессору самые жесткие условия (а программа может это сделать, как никакая другая, действительно ставя чипы в самые тяжелые условия). Сам тест активируется из меню опций, где выбирается раздел Torture Test. Там будут указаны виды проводимых операций. Наиболее интересными здесь представляются тесты Blend (одновременная нагрузка и на процессор, и на «оперативку»), а также Small FFT и Large FFT (увеличение нагрузки на процессор за счет выгрузки оперативной памяти).

Как определить, что нагрузочное тестирование прошло успешно? Единого мнения здесь нет, но считается, что если в течение хотя бы 4 часов ошибок или сбоев в работе чипа не наблюдалось, этот компонент достаточно устойчив к чрезмерным нагрузкам. Но бывает и такое, что сбои могут появиться намного позже, поэтому, если у вас имеется изрядный запас времени, лучше увеличить период тестирования до 24 часов (ошибки могут появиться и через полдня работы).

Проверка работы оперативной памяти

Не менее важным является и нагрузочное тестирование «оперативки», которая выполняет функции так называемой второй скрипки. Для этого лучше всего подойдет приложение Memtest86+, которое на сегодняшний день является наилучшим.

Для корректной работы с его помощью нужно создать загрузочный диск или флэшку и загрузить компьютерный терминал именно с такого носителя. После активации теста на его полное выполнение потребуется достаточно много времени. Можно просто оставить компьютер на ночь. Этого должно хватить.

Определение поведения графического адаптера

С графикой тоже стоит провести тест, поскольку видеоадаптеры при чрезмерной нагрузке часто являются причиной компьютерных сбоев. Идеальным инструментом тут станет программа FurMark.

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

Кроме того, можно использовать и специальные утилиты, разработанные под конкретные игры. Например, очень хорошо подойдут тестовые приложения типа Alien vs Predator, S.T.A.L.K.E.R. или еще что-то в этом роде. Как правило, распространяются они совершенно бесплатно, а с их помощью можно точно установить, как будет вести себя система после установки оригинального игрового пакета.

Для чего нужно тестирование серверов и сайтов

Теперь несколько слов о том, что представляет собой тестирование сайта и веб-сервера. Об одном аспекте (DDoS-атаки) уже было сказано. Сейчас посмотрим на этот вопрос с другой стороны.

Сами тесты такого типа в некоторой степени можно отнести даже к маркетинговым инструментам по прогнозированию поведения пользователей. Так, например, можно смоделировать ситуацию поведения определенного количества (максимального/пикового) людей при входе на сайт, узнать, сколько страниц может просматриваться, будет ли задействована электронная почта, например, в процессе заказа товара, как информация может использоваться для идентификации посетителей, позволит ли предоставить одновременный доступ к сайту пользователям в определенный момент времени, будет ли востребовано подтверждение пользовательских полномочий третьим лицом (например, при вводе номера банковской карты), насколько эффективным окажется внедрение Java-апплетов или использование защищенного соединения https и т. д.

Вопросы теста веб-серверов (программного обеспечения) и создаваемых Интернет-ресурсов

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

В данном случае (и для сайта, и для веб-сервера) многие советуют использовать мощнейший пакет под названием OpenSTA (System Architecture Test), который позволяет не только провести проверку, но и разбить задачи на составляющие для каждого отдельно взятого элемента структуры с использованием инструмента создания и моделирования скриптов Script Modeler. Примечательно, что после создания такой модели можно проверить даже соединение по протоколу SSL (обязательно должен быть запущен так называемый сервер имен). Кроме того, результаты можно сохранять в разделе Repository Host, а тесты объединять в соответствующие группы.

Что в итоге?

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

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

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

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

Основные понятия

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

  • Задержка – это показатель того, насколько быстро сервер реагирует на запросы клиента. Обычно измеряется в миллисекундах (мс). Задержка также часто называется временем отклика. Чем ниже этот показатель, тем быстрее сервер обрабатывает запрос. Задержка измеряется на стороне клиента с момента отправки запроса до получения ответа. В этот показатель включены затраты сетевых ресурсов.
  • Пропускная способность – это количество запросов, которые сервер может обрабатывать в течение определенного промежутка времени. Обычно этот показатель измеряется в запросах в секунду.
  • Процентиль – это способ группировки результатов по проценту от всего набора данных.

Основы нагрузочного тестирования

Нагрузочное тестирование – это технология измерения производительности сервера, которая заключается в отправке имитируемого HTTP-трафика на сервер. Это позволяет найти ответы на такие вопросы:

  • Достаточно ли у сервера ресурсов (памяти, CPU и т. п.), чтобы обработать ожидаемый трафик?
  • Достаточно ли быстро реагирует сервер, чтобы обеспечить хороший пользовательский опыт?
  • Эффективно ли работает приложение?
  • Нужно ли серверу вертикальное или горизонтальное масштабирование?
  • Есть ли особо ресурсозатратные страницы или вызовы API?

Нагрузочное тестирование выполняется путем запуска специального программного обеспечения на одном компьютере (или в кластере машин). Это ПО генерирует большое количество запросов и отправляет их на веб-сервер на втором компьютере (или в другой инфраструктуре). Существует много таких инструментов, позже мы рассмотрим некоторые их них. На данный момент сосредоточимся на общих терминах, которые будут актуальны независимо от того, какое средство для нагрузочного тестирования вы выберете. Обычное программное обеспечение для нагрузочного тестирования используется для определения максимального количества запросов в секунду, которое может обрабатывать сервер. Для этого на сервер отправляется как можно большее количество запросов; затем нужно проверить, сколько из них сервер смог обработать успешно.

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

Общая тенденция такова: чем выше нагрузка (чем больше запросов в секунду), тем выше задержка. Чтобы получить более реальную картину о задержке сервера при заданной нагрузке, нужно будет протестировать его несколько раз с разным количеством запросов. Не все приложения для тестирования нагрузки способны на это, но немного позже мы ознакомимся с wrk2 (это средство командной строки для тестирования нагрузки, которое может выполнить эту функцию).

Как определить разумный показатель задержки?

Время загрузки веб-сайта в диапазоне 2-5 секунд – обычное дело, но часть времени, связанная с задержкой веб-сервера, обычно составляет около 50-200 миллисекунд. Идеальный показатель задержки индивидуален для каждого сайта. Он зависит от большого количества факторов (аудитории, рынка, целей сайта, наличия пользовательского интерфейса или API и т. д.). Имейте в виду: большинство исследований показывают, что в производительности учитывается каждый маленький бит скорости, и даже совсем незаметные улучшения приводят к улучшению результатов в целом.

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

Чтобы понять, как работает сервер и веб-приложение и как они реагируют на нагрузку, можно предпринять несколько общих действий. Во-первых, во время тестирования нужно отслеживать правильные системные ресурсы. Затем нужно определить максимальное количество запросов в секунду, которое может обработать данный сервер. Также следует определить пропускную способность, при которой задержка сервера приведет к низкой производительности и плохому пользовательскому опыту.

1: Мониторинг ресурсов

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

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

Если у вас уже есть система мониторинга типа Prometheus, Graphite или CollectD, вы сможете собрать все необходимые данные.

Читайте также :

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

Для мониторинга доступной памяти используйте команду free. В комбинации с командой watch данные будут обновляться каждые 2 секунды.

Флаг -h выводит числа в удобочитаемом формате.

total used free shared buffers cached
Mem: 489M 261M 228M 352K 7.5M 213M
-/+ buffers/cache: 39M 450M
Swap: 0B 0B 0B

Выделенное число в выводе представляет свободную память после вычитания буфера и кэша. Новые версии free выводят другие результаты:

Total used free shared buff/cache available
Mem: 488M 182M 34M 14M 271M 260M
Swap: 0B 0B 0B

Новый столбец available вычисляется по-разному, но обычно представляет одну и ту же метрику: текущий объем доступной памяти для приложений.

Для мониторинга использования CPU в командной строке есть утилита mpstat, которая выводит количество свободных ресурсов CPU. По умолчанию утилита mpstat не установлена в Ubuntu. Вы можете установить ее с помощью следующей команды:

sudo apt-get install sysstat

При запуске mpstat нужно задать интервал обновления данных в секундах:

Она выведет строку заголовков, а затем строку статистики, и будет обновляться каждые две секунды:

Linux 4.4.0-66-generic (example-server) 08/21/2017 _x86_64_ (4 CPU)
08:06:26 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle
08:06:28 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00
08:06:30 PM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00

Столбец %idle показывает, какой процент ресурсов ЦП не используется. Загрузка процессора часто разделяется на разные категории (user CPU и system CPU).

2: Определение максимальной скорости отклика

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

Конкурентность – это показатель, который отображает количество параллельных подключений, которое может обрабатывать сервер. Значение по умолчанию 100 подходит в большинстве случаев, но вы можете выбрать индивидуальное значение. Для этого нужно проверить MaxClients, MaxThreads сервера и другие подобные параметры.

Также вам нужно будет выбрать URL-адрес для тестирования. Если ваше программное обеспечение может обрабатывать только один URL за один раз, стоит выполнить несколько тестов для разных URL-адресов, так как требования к обработке могут сильно различаться в зависимости от страницы. Например, требования к загрузке домашней страницы сайта и страницы продукта разные.

Некоторое программное обеспечение для нагрузочного тестирования позволяет сразу указать несколько URL-адресов, которые нужно проверить. Это позволяет более точно имитировать реальный трафик. Если у вас есть данные об использовании сайта (из аналитического программного обеспечения или логов сервера), вы можете применить эти данные в тестировании.

Отобрав URL-адреса, запустите тестирование. Убедитесь, что программное обеспечение очень быстро отправляет запросы. Если программное обеспечение разрешает выбрать скорость запроса, выберите значение, которое почти наверняка будет слишком высоким для вашего сервера. Если программное позволяет установить задержку между запросами, уменьшите это значение до нуля.

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

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

Затем нужно повторить тестирование, чтобы получить дополнительную информацию о том, как работает сервер на пределе ресурсов.

3: Определение максимальной пропускной способности

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

Здесь можно обратиться к инструменту wrk2, который позволяет указывать точное количество запросов в секунду.

Возьмите максимальную скорость запросов, которую вы определили на предыдущем этапе, и разделите ее на 2. Запустите еще один тест с новыми данными и обратите внимание на время ответа. Находится ли показатель в приемлемом диапазоне?

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

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

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

Тем не менее, некоторые из открытых инструментов также могут работать в режиме кластера. Рассмотрим несколько наиболее популярных инструментов с открытым исходным кодом.

Инструмент ab

(или ApacheBench) – это простой однопоточный инструмент командной строки для тестирования HTTP-серверов. Изначально он разрабатывался как часть HTTP-сервера Apache, но его можно использовать для тестирования любого HTTP- или HTTPS-сервера.

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

Базовый вызов команды ab выглядит следующим образом:

ab -n 1000 -c 100 http://example.com/

Флаг –n задает количество запросов. Флаг –с задает конкурентность. Затем нужно указать URL, который нужно протестировать. Вывод (выдержка из которого приведена ниже) указывает количество запросов в секунду, время запроса и список процентилей времени ответа:

. . .
Requests per second: 734.76 [#/sec] (mean)

Time per request: 136.098 (mean)

Time per request: 1.361 (mean, across all concurrent requests)
Transfer rate: 60645.11 received
Percentage of the requests served within a certain time (ms)
50% 133

66% 135

75% 137

80% 139

90% 145

95% 149

98% 150

99% 151

100% 189 (longest request)

JMeter

JMeter – это мощное и многофункциональное приложение для нагрузочного и функционального тестирования от Apache Software Foundation. Функциональное тестирование – это проверка вывода приложения.

JMeter предлагает графический интерфейс Java для настройки тестовых планов.

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

JMeter может выводить информацию о процентилях в отчетах HTML и других форматах.

Siege

Siege – еще один инструмент командной строки для нагрузочного тестирования. Он похож на ab, но имеет несколько дополнительных функций. Siege – многопоточный инструмент, что обеспечивает относительно высокую пропускную способность. Он также позволяет указать сразу несколько URL-адресов для нагрузочного тестирования. Базовый вызов выглядит так:

siege -c 100 -t 30s http://example.com/

Флаг –с указывает конкурентность. Флаг -t определяет продолжительность тестирования (в данном случае – 30 секунд). Siege выводит среднее время отклика и скорость запроса:

. . .
Transactions: 5810 hits
Availability: 100.00 %
Elapsed time: 29.47 secs
Data transferred: 135.13 MB
Response time: 0.01 secs

Transaction rate: 197.15 trans/sec

Throughput: 4.59 MB/sec
Concurrency: 2.23
. . .

Siege не предоставляет процентилей для статистики задержек.

Locust

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

Сценарии тестирования Locust пишутся с помощью кода Python, что предоставляет дополнительные преимущества тем, кто хорошо знаком с этим языком программирования.

Locust также можно запускать в распределенном режиме: вы можете запустить кластер из серверов Locust, который будет создавать высокую нагрузку вашего сервера. Это позволяет выполнить качественное нагрузочное тестирование целой инфраструктуры веб-серверов.

Locust может предоставить подробную статистику в CSV-файлах, которые можно загрузить.

Инструмент wrk2

wrk2 – это многопоточный инструмент командной строки для нагрузочного тестирования, способный производить нагрузку с заданной частотой запросов. Он может предоставлять подробную статистику задержек и поддерживает сценарии на языке программирования Lua.

wrk2 вызывается командой wrk:

wrk -t4 -c100 -d30s -R100 --latency http://example.com/

Параметр -t определяет количество потоков (в данном случае их 4, здесь нужно использовать количество процессорных ядер вашего сервера). Параметр -c указывает количество одновременных запросов (здесь 100). Флаг –d определяет продолжительность тестирования (30 секунд). Флаг –R указывает частоту запросов в секунду (100). Подробный вывод задержки предоставит флаг —latency.

. . .
Latency Distribution (HdrHistogram - Recorded Latency)
50.000% 5.79ms
75.000% 7.58ms
90.000% 10.19ms
99.000% 29.30ms
99.900% 30.69ms
99.990% 31.36ms
99.999% 31.36ms
100.000% 31.36ms
. . .

Заключение

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

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



Понравилась статья? Поделитесь ей