|
Для проверки «выживания» веб-приложений при повышенной нагрузке существуют различные инструменты. В данной статье рассматривается несколько бесплатных решений для нагрузочного тестирования.
Если отбросить инструменты для нагрузочного тестирования, которые уже не поддерживаются, имеют проблемы с установкой или являются платными, то для рассмотрения остаются пять кандидатов: curl-loader, httperf, Siege, Tsung и Apache JMeter. curl-loader ставит своей задачей «предоставить мощное и гибкое решение с открытым кодом, которое будет равноценно таким решениям, как Spirent Avalanche и IXIA IxLoad». Он использует надежную и гибкую библиотеку cURL для аутентификации и обработки запросов. Сборка инструмента несложна: скачиваем, распаковываем из tar-архива, и компилируем полученный код. Для успешной компиляции необходимо установить библиотеку OpenSSL и ее заголовочные файлы. Возможно, понадобится добавить #include в файл ip_secondary.c, в связи с недавними изменениями в заголовочных файлах библиотеки glibc. Для начала тестирования надо еще поработать над настройками; у curl-loader-а они разделены на две части. Первая часть – это конфигурационный файл, содержащий параметры для конечных сценариев; он имеет простейший формат – присвоение переменных вида «число = значение», разделенное переводами строки. В папке conf-examples находится несколько самоочевидных примеров таких настроек. curl-loader умеет использовать несколько IP адресов для реалистичной симуляции запросов с различных машин, так что вам понадобится изменить значения таких переменных, как INTERFACE, CLIENTS_NUM_MAX, NETMASK, IP_ADDR_MIN и IP_ADDR_MAX, для соответствия вашему сетевому окружению. Максимальное количество одновременных подключений должно соответствовать заданному вами интервалу IP. Вторая часть – это параметры командной строки для исполняемого файла curl-loader. Один из параметров, -f <путь к файлу сценария>, является ключевым; остальные параметры предназначены для настройки отработки сценария. Так, например, по умолчанию все запросы инициируются curl-loader-ом из одного потока; хотя это и позволяет сэкономить системные ресурсы и повысить производительность, разумнее увеличить число потоков до числа ядер вашего процессора с помощью опции –t. В процессе выполнения сценария на экране регулярно обновляется краткий обзор результатов; подробные результаты сохраняются в файлы отчета - .log для сообщений об ошибке, .ctx для статистики по соединениям, и .txt для статистики по времени выполнения. Аналогом curl-loader-а, написанным на языке Python, является Pylot. Этот инструмент имеет графический интерфейс и использует конфигурационные файлы в формате XML. httperf – это простая утилита для нагрузочного тестирования, разработанная компанией Hewlett-Packard; она запускается из командной строки и работает в одном потоке. Основная настройка httperf выполняется параметрами командной строки; файлы настроек являются вспомогательными и используются для настройки сценария сессий. Например, строка для создания 5000 соединений, каждое из которых попытается выполнить 50 запросов, выглядит так: httperf --server=localhost --uri=/ --num-conns=5000 --num-calls=50 Первая строка результатов будет содержать параметры, которые не были заданы и поэтому получили значения по умолчанию: httperf --client=0/1 --server=localhost --port=80 --uri=/ \ --send-buffer=4096 --recv-buffer=16384 \ --num-conns=5000 --num-calls=50 В отличие от curl-loader-а, httperf не выдает обновляющуюся информацию в процессе выполнения сценария и не сохраняет подробных отчетов – только обзор результатов по окончании выполнения. Обновляющиеся обзоры можно включить специальным отладочным параметром, но этот параметр нужно включать при компиляции. К достоинствам httperf можно отнести то, что все параметры задаются в командной строке – это позволяет быстро создать нагрузочный сценарий и вызывать его из сценариев пользовательского интерфейса; выполнение нескольких тестов последовательно или параллельно также не представляет сложности. Хотя с анализом аргументов командной строки у httperf-а не все гладко. Например, разделение идентификатора тестируемого ресурса на сервер (--server) и путь (--uri) излишне, к тому же название опции для последнего неточно, поскольку идентификатор может включать имя сервера. Из аналогов httperf-а стоит отметить http_load - менее сложный инструмент с таким же интерфейсом. Siege, как и httperf, настраивается преимущественно через командную строку. Но Siege отправляет запросы несколькими потоками, имеет меньше низкоуровневых опций, и поддерживает работу со списком адресов страниц. В его плюсы можно записать и более понятные названия опций. Запуск Siege с параметрами по умолчанию имеет очень простой вид: siege localhost Однако такой пример не позволит вам оценить главное достоинство Siege – способность обращения к группе ссылок в хаотичном порядке, как это делают настоящие пользователи. Для сбора ссылок автор Siege предоставляет дополнительную утилиту Sproxy. Установите ее; в настройках браузера, укажите localhost:9001 в качестве HTTP proxy, и запустите со следующими опциями: sproxy –v –o urls.txt Sproxy сохранит адреса всех страниц, которые вы откроете в текущей сессии, в файл urls.txt. После того, как вы набрали достаточно ссылок для тестирования, запустите следующий тест: Siege –v --internet --file=urls.txt При наличии опции --internet, Siege будет выбирать ссылки из списка случайным образом, имитируя множество независимых посетителей. Tsung, как и Siege, работает со списком ссылок, но имеет более сложный функционал, например моделирование пользователей, имитацию сессий, и динамически обновляемую информацию о результатах, и более высокую производительность, благодаря использованию так называемых «зеленых потоков» языка Эрланг. Но все имеет свою цену. Tsung не позволяет сразу же запустить тест из командной строки, как мы делали с Siege, curl-loader и httperf – нужно либо создавать сценарий вручную в файле ~/.tsung/tsung.xml, либо использовать режим записи, который похож на Sproxy: - Запустить запись командой tsung recorder, указать localhost:8090 в качестве HTTP proxy, и посетить страницы для тестирования.
- Открыть запись сессии в файле ~/.tsung и исправить сценарий в соответствии с вашими задачами – подробности о формате файла и ключевых параметрах можно посмотреть в инструкции пользователя.
- Сохранить измененный файл под именем ~/.tsung/tsung.xml.
- Запустить тест командой tsung start.
Самым сложным, очевидно, является второй шаг, редактирование файла сценария – но если вы хотите в полной мере использовать уникальные возможности Tsung, разобраться в его формате нужно обязательно. Еще один плюс Tsung – он умеет создавать нагрузку на сервера PostgreSQL и Jabber. Поскольку JMeter – это Java-приложение, для его работы необходимо иметь Java JDK – его можно скачать на http://java.sun.com/j2se/. Для установки JMeter его достаточно распаковать; запускаемый файл, jmeter, находится в папке bin. Этот инструмент имеет графический интерфейс, который предоставляет возможность настроить все параметры нагрузочного тестирования посредством сценариев тестирования (Test Plan). Планы тестирования добавляются соответствующей кнопкой. Они имеют древовидную структуру, и включают несколько функциональных групп. Например, группа Thread Group описывает группу пользователей, которых вы хотите имитировать в текущем сценарии. Группа включает следующие поля: - Name – название группы
- Number of threads – число пользователей, входящих в группу
- Ramp-up period – период ожидания между группами пользователей, в секундах
- Loop count – количество циклов обращений группы к страницам. При включении опции Forever, все пользователи группы выполнят свои запросы, потом подождут в течение ramp-up секунд, потом снова выполнят свои запросы, и так далее. Опцию Forever надо использовать осторожно, чтобы не перегружать сервер без необходимости.
- Scheduler – позволяет задать начальное и конечное время работы группы.
Группа HTTP Request указывает, что и как тестировать: - Server name or IP – имя или IP-адрес сайта
- Port Number – номер порта для подключения; для веб-серверов это обычно 80
- Protocol – HTTP или HTTPS
- Path – ссылка (URL) для тестирования
Третья обязательная группа, Listener, сохраняет все результаты тестирования и отображает их в графической форме. Различные типы Listener-ов предоставляют результаты в разной форме: например, Graph Results строит график успешности обработки запросов, а View Results in Table сводит эти данные в таблицу. Один сценарий может содержать несколько Listener-ов. Некоторые сайты требуют входа в систему для полноценной навигации по ним. В JMeter вход реализуется с помощью дополнительной группы HTTP Request, которая указывает на страницу и поля для входа и использует метод POST (в отличие от значения по умолчанию GET). Список имен и паролей пользователей хранится в файле /bin/users.xml, имеющий несложный формат: <?xml version="1.0"?> <!DOCTYPE allthreads SYSTEM "users.dtd"> <allthreads> <thread> <parameter> <paramname>username</paramname> <paramvalue>name1</paramvalue> </parameter> <parameter> <paramname>password</paramname> <paramvalue>password1</paramvalue> </parameter> <parameter> <paramname>passwordconfirm</paramname> <paramvalue>password1</paramvalue> </parameter> </thread> <thread> <parameter> <paramname>username</paramname> <paramvalue>name2</paramvalue> </parameter> <parameter> <paramname>password</paramname> <paramvalue>password2</paramvalue> </parameter> <parameter> <paramname>passwordconfirm</paramname> <paramvalue>password2</paramvalue> </parameter> </thread> <!—еще пользователи, при необходимости --> </allthreads>
paramname – это поля, использующиеся при входе в систему, а paramvalue – значения, которые в них нужно вносить. Для использования этого файла необходимо добавить подгруппу Pre Processors -- HTTP User Parameter Modifier в группу HTTP Request, а также привести параметр Number of threads в группе Thread Group в соответствие с числом пользователей в файле users.xml. Из возможностей JMeter также стоит отметить возможность моделировать запросы к базам данных и LDAP-серверам. Это интересный многофункциональный инструмент с множеством опций, подробно описанных в руководстве пользователя. Заключение У каждого рассмотренного инструмента есть свои достоинства и недостатки. Все они хорошо документированы, легко устанавливаются и стабильны в работе. Для выбора инструмента, наиболее подходящего к вашей конкретной задаче, можно рассматривать их от простого к сложному, в следующей последовательности. Начните с Siege и посмотрите, чего вы можете добиться с его ограниченными возможностями; потом попробуйте httperf, который имеет больше возможностей и работает быстрее; если вам нужны более сложные сценарии, переходите на curl-loader или Tsung – у них наибольшие наборы возможностей, но Tsung надо долго осваивать. Единственный инструмент с графическим интерфейсом - Apache JMeter – имеет ряд впечатляющих возможностей, в том числе пре- и постобработка содержимого страниц. На него стоит обратить внимание, если вы предпочитаете работать с графическим интерфейсом. (по материалам Linux.com) |