Сервис нагрузочного тестирования. Сервис нагрузочного тестирование loadme

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

  • Если это сервис - для серьезной нагрузки цена слишком высока
  • Если это утилита - результат зависит от скорости канала компьютера/сервера с которого проводился тест
  • Повторяющиеся запросы не отражают реальной скорости, так как кэширование есть на самых разных уровнях начиная от 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 - можно завать методы, куки, хедеры, но нам не хватило рандомизации теста.

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

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

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

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

Jmeter

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

Поиск: jmeter, нагрузочное тестирование с jmeter

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

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

Поиск: thread, swap

Вариант интересной задачи для нагрузочного тестирования. Нужно проверить что web-приложение справится с 200 сотнями онлайн пользователей, которые будут заниматься перепиской во встроенном чате. Возможна масса вариантов таких заданий, которые можно решить написать самому. Поставьте себе задачу на каком-нибудь собственном проекте(чтобы не уронить чужой) и начинайте ее решать с помощью jmeter.

После изучения стандартных возможностей Jmeter я один раз сильно обжегся. Я совсем неправильно оценил собранные метрики и получил нагоняй от старшего коллеги. Из этого я сделал вывод — для тестирования нагрузки не достаточно знания только инструмента. Очень важно правильно оценивать собранные метрики после нагрузочных тестов и на их основании сделать правильный вывод.

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

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

Yandex Tank

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

Поиск: нагрузочные тесты yandex tank

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

Поиск: locust, нагрузочное тестирование locust

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

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

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

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

Часто повторяющиеся ситуации

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

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

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

Поиск: профайлеры кода

Еще здесь очень полезны системы мониторинга. К примеру Zabbix, Ansible и другие. С их помощью можно отслеживать потребляемые ресурсы тех или иных скриптов и строить долгосрочные отчеты. Эти системы используются в основном dev-ops командами, но также сильно помогут в тестировании.

На этом все. Надеюсь я показал в какую сторону копать и что практиковать. Буду рад вашим вопросам в комментариях.

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

Нагрузочное тестирование (англ. 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 .

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

Нагрузочное тестирование или тестирование производительности

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

Основные виды тестирования производительности

Рассмотрим основные виды нагрузочного тестирования, также задачи стоящие перед ними.

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

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

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

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

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

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

  • измерение времени выполнения выбранных операций при определенных интенсивностях выполнения этих операций
  • может производиться определение количества пользователей, одновременно работающих с приложением
Тестирование стабильности или надежности (Stability / Reliability Testing )

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

Load vs Performance Testing

В англоязычной терминологии вы можете так же найти еще один вид тестирования - Load Testing - тестирование реакции системы на изменение нагрузки (в пределе допустимого). Нам показалось, что Load и Performance преследуют все же одну и ту же цель: проверка производительности (времени отклика) на разных нагрузках. Собственно поэтому мы и не стали разделять их. В то же время кто то может разделить. Главное все таки понимать цели того или иного вида тестирования и постараться их достигнуть.

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

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

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

  • Нагрузочный (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-файл. Никаких возможностей по
статистической обработке не предусмотрено, то есть с его помощью можно только
оценить работу при определенных условиях.