Что такое нагрузочное тестирование. Под предельной нагрузкой: обзор программ нагрузочного тестирования веб-серверов. Определение максимальной скорости отклика

Новое программное обеспечение и другие высокотехнологические продукты регулярно появляются на современном IT-рынке. Определить степень сопоставимости для решения конкретных задач, в каком объеме и достаточно ли безопасны в использовании возможно только в режиме нагруженного тестирования – услуги, которая предоставляется Компанией «Getbug Engineering ».

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

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

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

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

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

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

  1. Оценка производительности и работоспособности приложения на этапе разработки и передачи в эксплуатацию;
  2. Оценка производительности и работоспособности приложения на этапе выпуска новых релизов;
  3. Оптимизация производительности приложения, настройка серверов и оптимизация кода
  4. Подбор соответствующей для данного приложения аппаратной (программной платформы) и конфигурации сервера

Оборудование тестового стенда должно как можно ближе соответствовать промышленной конфигурации. Особенно если на основе полученных в результате тестирования времени выполнения операций будут приниматься бизнес решения. Если речь идет об оптимизации приложения, то соответствие конфигураций тестового стенда и промышленного уже не так актуально. Для мониторинга тестовых серверов необходимо иметь доступ на сервера с правами для использования необходимых утилит, например, MS Windows Performance для MS Windows или sar, iostat, vmstat для unix-образных OS.

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

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

Тестирование производительности (Performance testing )

Задача тестирования производительности определить масштабируемость приложения под нагрузкой:

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

Тестирование стабильности (Stability / Reliability Testing )

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

Стрессовое тестирование (Stress Testing )

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

Объемное тестирование (Volume Testing )

Объемное тестирование позволяет оценить производительность при увеличении объемов данных в базе данных приложения:

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

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

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

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

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

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

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

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

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

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

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

Пример 1:

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

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

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

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

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

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

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

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

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

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

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

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

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

3. Зависимость времени отклика системы от степени распределённости этой системы.
ПО Наименование производителя Комментарии
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- или интеграционного тестирования .
LoadComplete SmartBear Проприетарный продукт, позволяющий проводить нагрузочное тестирование веб-приложений
SilkPerformer Micro Focus (Borland)
Siege Joe Dog Software Siege - это утилита для нагрузочного тестирования веб-серверов.
Visual Studio Team System Microsoft Visual Studio предоставляет инструмент для тестирования производительности включая load / unit testing
QTest Quotium
HTTPerf
QALoad Compuware Ltd.
(The) Grinder
WebLOAD RadView Software Нагрузочное тестирование инструмент для веб-и мобильных приложений, включая веб-панели для тестирования производительности анализа. Используется для крупномасштабных нагрузок, которые могут быть сгенерированы также из облака. лицензированный.
Яндекс.Танк Яндекс Модульный и расширяемый инструмент, позволяющий использовать внутри разные генераторы, в частности, знакомый многим JMeter. Это open-source проект, опубликованный Яндексом в 2012 году.

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

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

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

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

2. Потребление оперативной памяти, Мб

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

  • Virtual - объём виртуального адресного пространства, которое использует процесс. Этот объём подразумевает, как использование соответствующего дискового пространства так и оперативной памяти. Система виртуальной памяти гарантирует, что потоки одного процесса не получат доступа к памяти принадлежащей другому процессу.
  • Private - объём адресного пространства, занятого процессом и не разделяемого с другими процессами.
  • Working Set - набор страниц памяти, недавно использованных процессом. В случае, когда свободной памяти достаточно, страницы остаются в наборе, даже если они не используются. В случае, когда свободной памяти остаётся мало, использованные страницы перемещаются из ОЗУ на жёсткий диск (или другой накопитель, такой как Флеш-память), освобождая ОЗУ для загрузки других активных страниц памяти.
  • Shared - объём используемой процессом физической памяти, которая может использоваться совместно с другими процессами. Хотя память выделенная процессу должна быть изолированной, процессам, иногда, необходимо иметь возможность обмениваться информацией. Общая память является самым быстрым способом межпроцессного взаимодействия .

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

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

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

Пример 3:

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

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

4. Работа с дисковой подсистемой (время ожидания ввода-вывода, англ. I/O wait )

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

5. Время выполнения запроса, мс

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

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

  • Если это сервис - для серьезной нагрузки цена слишком высока
  • Если это утилита - результат зависит от скорости канала компьютера/сервера с которого проводился тест
  • Повторяющиеся запросы не отражают реальной скорости, так как кэширование есть на самых разных уровнях начиная от CPU и заканчивая базой данных
Надеюсь, «велосипед» будет интересен и другим - сначала я опишу что уже работает, потом можно будет обсудить дальнейшие фичи.

Что уже сделано?

  • Можно тестировать задания из списка url, до 20 штук
  • Каждая url может содержать один или несколько случайных параметров, задаваемых с помощью функции $RND
  • Тест запускается с множества серверов, на каждом из которых работает только 8 потоков
  • Тестирование можно проводить из 5 регионов AWS - Дублин, Франкфурт, Восток/Запад США, Токио
  • Тесты до 200 потоков мы готовы предоставлять бесплатно
Для теста открываем форму , где указываем email, заполняем URL, выбираем количество потоков тестирования, регион и начинаем тест.

*** UPDATE ***
Я вижу много смелых хабравчан ставит задание на 200 потоков. Если предположить, что 1 страница выдается за 1 секунду то это соответствует посещаемости >100К посетителей в час. Обычные проекты, в том числе наши, умирают от таких тестов.

Через минуту будет готов ваш результат (для примера посмотрите отличный результат - тестирование example.net). Как видим, 200 потоков позволяет генерировать более 1000 запросов в секунду - все зависит от скорости связи с тестируемым сервисом, и. собственно, скорости ответа.

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

Что тестировать?
Статические ресурсы, картинки, скрипты должны отдаваться с CDN. Тестировать их скорость отдачи имхо не имеет смысла, нужно тестировать только общую скорость загрузки страницы, к примеру с помощью старого доброго http://tools.pingdom.com/fpt/

Loadme сосредотачивается на тестировании кода страниц / методов api и т.п… Тестировать nginx отдающий 1x1.gif с помощью этого инструмента конечно можно, но практической пользы нет, и nginx от этого даже не согреется.

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

Как работают редиректы?
Редиректы выполняются; мы их активно используем это для тестирования одного из наших сайтов wikiart.org, реализовав на нем функцию «перейти на случайную картину».

Почему важно тестировать несколько url?
Для тестирования взаимного влияния популярных быстрых страниц и медленных (к примеру, поиска)

Зачем нужен $RND?
Синтаксис - $RND(from,to).
К примеру, http://someshop.com/search?from=$RND(0,1000)&to=$RND(1000,10000) будет генерировать произвольные запросы по поиску товаров по цене начиная от 0 до 1000 и заканчивая от 1000 до 10000. Это дает возможность оценить реальную мощность поиска.
К примеру, популярный украинский магазин Rozetka тратит в среднем 5 секунд на поиск смартфонов по случайной цене:
http://loadme.socialtalents.com/Result/ViewById/56108a645b5f1700481cc21d , что является весьма далеким от идеала результатом.
Амазон справляется с этой задачей принципиально лучше - значительное количество ошибок в результате, скорее всего, является защитой от ddos

Дальнейшие планы

Post, put, delete запросы
Нужная штука, однозначно, есть в планах.

Авторизация
Достаточно ли будет поддержки куки, с тем чтобы первый запрос логинил тест под случайным пользователем (для чего понадобится поддержка со стороны сервера), и дальнейшая работа пойдет от имени этого пользователя?

Ступенчатые тесты
Скажем, провести серию тестов: 25%, 50%, 75% и 100%, и увидеть разницу в скорости.


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

Регулярный тест по расписанию
Повторять тест каждый день / неделю и высылать отчет на email.
Также можно предоставиьт какой-нибудь webhook для иницирования существующего теста из кода (к примеру, после обновления)

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

Подтверждение собственности домена
Ограничение не более 200 агентов на 1 домен существует ровно для того чтобы никто не поверг в ddos чужой сайт. Для своего сайта вы можете создать еще один поддомен и протестировать его еще раз.
В будущем, однако, нужно будет сделать подтверждение доменов с помощью CNAME записи или файла с определённым именем.

Существующие конкуренты
Loadimpact.com - для нормального нагрузочного теста, хотя бы 100 запросов в секунду, потребуется 1500 так называемых «виртуальных юзеров» - каждый из них загружает страницу 1 раз в 15 секунд. Стоит такой пакет на данный момент $299 в месяц.

Loader.io - отличный сервис, платный пакет всего $99 в месяц. Очень гибкие настройки URL - можно завать методы, куки, хедеры, но нам не хватило рандомизации теста.

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

Apache Bench

Наверное, один из самых простых в использовании и популярных тестов для проверки нагрузки на сайт. Утилита подходит как для простого, так и продвинутого тестирования:

Ab -c 50 -n 10000 -f TLS1.2 -H "Accept-Encoding: gzip,deflate" https://somesite.com/

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

Команда выполнила 10 000 запросов в 50 потоков и, кроме всего прочего, показала скорость и обработанное количество запросов:

Total transferred: 59560000 bytes HTML transferred: 52160000 bytes Requests per second: 816.77 [#/sec] (mean) Time per request: 122.434 (mean) Time per request: 2.449 (mean, across all concurrent requests) Transfer rate: 2375.33 received

# Лог теста выдает намного больше информации

Из этого отчета самыми важными данными будут:

  • Requests per second - количество запросов в секунду. К примеру если страница состоит из 20 частей (CSS, картинки и HTML), то в нашем примере сервер способен обработать около 40 одновременных пользователей в секунду.
  • Time per request (mean) - среднее время на выполнение группы параллельных запросов (в нашем случае 50);
  • Time per request (mean, across all concurrent requests) - среднее время на выполнение одного запроса.

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

Httperf

Этот тест с открытым исходным кодом был разработан в HP для измерения производительности веб-сервера. Инструмент не обновлялся несколько лет, но все еще является весьма актуальным.

Утилита, как и ab, проста в использовании и обладает достаточно широким функционалом. Запускается она так же просто, как и ab:

Httperf --hog --server 192.168.122.10 --wsess=100000,5,2 --rate 1000 --timeout 5

# Создание 100 000 сессий (по 5 вызовов через каждые 2 с) со скоростью 1000

А лог будет выглядеть так:

Total: connections 117557 requests 219121 replies 116697 test-duration 111.423 s Connection rate: 1055.0 conn/s (0.9 ms/conn, <=1022 concurrent connections) Connection time : min 0.3 avg 865.9 max 7912.5 median 459.5 stddev 993.1 Connection time : connect 31.1 Connection length : 1.000 Request rate: 1966.6 req/s (0.5 ms/req) Request size [B]: 91.0 Reply rate : min 59.4 avg 1060.3 max 1639.7 stddev 475.2 (22 samples) Reply time : response 56.3 transfer 0.0 Reply size [B]: header 267.0 content 18.0 footer 0.0 (total 285.0) Reply status: 1xx=0 2xx=116697 3xx=0 4xx=0 5xx=0 CPU time [s]: user 9.68 system 101.72 (user 8.7% system 91.3% total 100.0%) Net I/O: 467.5 KB/s (3.8*10^6 bps)

# Кроме всего прочего, производительность показывает величина скорости запросов (Request rate)

В этом отчете стоит сфокусироваться на:

  • Connection rate - реальная скорость создания новых соединений. Она показывает способность сервера обрабатывать соединения, то есть в нашем случае до 1055 соед./с, но не более 1022 одновременных соединений.
  • Connection time - время “жизни” успешных соединений между инициализацией и закрытием. Опять же показывает производительность сервера при обработке большого количества соединений.
  • Request rate - скорость обработки запросов. То есть, количество запросов, которые сервер способен выполнять за секунду, показывает отзывчивость веб-приложения.

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

Tsung

Это мощная, продвинутая, мультизадачная и мультипоточная утилита. Инструмент может использоваться для нагрузки серверов HTTP, WebDAV, SOAP, PostgreSQL, MySQL, LDAP и Jabber/XMPP. Поддерживается SSL, мониторинг ресурсов системы и агенты SNMP, Munin или Erlang на удаленных серверах, симуляция поведения юзеров и расширенные отчеты.

Инструмент написан на Erlang, так что для начала необходимо установить нужные репозитории, а затем скачать и установить Tsung:

Wget http://tsung.erlang-projects.org/dist/tsung-1.6.0.tar.gz tar zxfv tsung-1.6.0.tar.gz cd tsung-1.6.0 ./configure && make && make install

# Распаковка и компиляция утилиты

Все настройки инструмента необходимо прописать в его файле конфигурации:

Cp /usr/share/doc/tsung/examples/http_simple.xml /root/.tsung/tsung.xml

# Копирование шаблона файла конфигурации в директорию Tsung

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

# Можно указывать дополнительные опции (к примеру браузеры юзеров), множества нодов для симуляции пользователей

Теперь можно запускать tsung:

Tsung -f tsung.xml start Starting Tsung "Log directory is: /root/.tsung/log/20160428-1117"

# Для запуска с множества нодов их нужно предварительно указать в настройках

Когда утилита закончила свою работу, можно просмотреть отчет:

Mkdir report_output cd report_output /usr/lib/tsung/bin/tsung_stats.pl --stats /root/.tsung/log/20160428-1117/tsung.log chromium graph.html

# Указывается предпочтительный браузер

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

  • Session - общее количество пользователей и количество одновременных сессий в секунду, которые веб-сервер обработал.
  • Request - время отклика веб-сервера, его способность и скорость обработки одновременных запросов. К примеру 200 запросов/с значит, что в среднем 10 пользователей сможет одновременно получить зайти на веб-страницу, состоящую в общем из 20 компонентов (CSS, картинки и HTML). А это более 400 000 посетителей за 12 часов.
  • Connect - время, требуемое на подключение, то есть отзывчивость веб-сервера .

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

Другие утилиты

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

Самое главное

Apache Bench, Httperf и Tsung отлично подходят для тестирования нагрузки на большие и маленькие сайты. Но только tsung сможет выжать все соки из веб-сервера и показать на что он способен в условиях, приближенных к реальности. Не забывайте, что сначала все тесты нужно провести для одного пользователя, чтобы проследить зависимость и иметь точку отсчета.

Может кому будет интересно как «по-быстрому» провести нагрузочное тестирование своего веб-приложения.
Подробности под катом

Вместо предисловия

На сегодняшнем стендапе Марек (программист из Польши принимающий участие в проекте EmForge) сказал, что общался с рядом друзей, у которых в прошлом был большой опыт работы с Liferay (который мы как раз активно используем) - и опыт оказался очень негативный, в первую очередь из-за проблем со скоростью. Некоторые проекты тупо накрылись из-за того что эти проблемы так и не получилось решить.

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

Не «по-быстренькому»

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

Вообщем задача не на один час

А по-быстренькому?

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

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

Совсем по-быстренькому?

Если совсем по-быстрому - то это Load Impact - не надо никаких регистраций - заходите - даете URL - и в течении 10-15 минут 50 виртуальных пользователей терроризируют вашу страницу. Тупо, просто - но по крайней мере позволит увидеть что при первом же наплыве ваше приложение не ляжет. Не легло? Идем дальше

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

Мне очень понравился LoadStorm . С ним работа строится следующим образом:
1. регистрируемся
2. Создаем тест - в котором указывает сайт который будем пытать
3. Прежде чем начать пытку- требуется верификация (а вдруг вы хотите положить сайт конкурента????). надо на главную страницу положить определенный текст с кодом - или файл с определенным именем в корень
4. Дальше создаем сценарий - при создании сценария описываем, как пользователь идет по вашему сайту, какие линки нажимает, можно засабмитить формы. Все достаточно интуитивно и понятно
5. потом говорим когда запустить
6. в назначенное время тест запускается, ждем 30 минут пока до 50-ти пользователей бродят по вашему сайту согласно вашим указаниям - и получаем отчет.

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

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

На этом графике показывается как терзалась система - в моем случае максимально было 47 пользователей - и чуть более 3-ех запросов в секунду
Ну и самый интересный


Из которого следует - что если исключить максимальный пик в 5 секунд (в этот момент решил включиться Garbage Collector) - в остальном приложение вело себя хорошо - и не зависимо от количества пользователей - то есть - нагрузка в 50 пользователей сайт не нагружает - есть еще и запас хороший.

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

Чуть подлинней и подороже

Если хочется чуть более серьезного - можно попробовать