Сдавая веб-сервер в повседневную эксплуатацию, нужно быть уверенным, что он выдержит планируемую нагрузку. Только создав условия, приближенные к боевым, можно оценить, достаточна ли мощность системы, правильно ли настроены приложения, участвующие в создании веб-контента, и прочие факторы, влияющие на работу веб-сервера. В этой ситуации на помощь придут
специальные инструменты, которые помогут дать качественную и количественную оценку работы как веб-узла в целом, так и отдельных его компонентов.
Все идет по плану
Прежде чем бросаться в бой, вначале следует разобраться, что мы хотим получить в результате тестирования. Ведь проверка, как и любая другая работа, требует предварительной подготовки. При неправильно сформулированной задаче могут получиться результаты, которые будут не полностью отражать реальное положение дел. Исходя из предполагаемой нагрузки веб-сервера, необходимо определиться с критериями испытания. Установить, что будет считаться как успех, а что как неприемлемая работа сервиса (например, время ответа, загрузка сервера). Различают три варианта теста:
- Нагрузочный (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);
- Соответствия (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-файл. Никаких возможностей по статистической обработке не предусмотрено, то есть с его помощью можно только оценить работу при определенных условиях