Нагрузочное тестирование позволяет определить производительность системы и оценить, сможет ли она справится с планируемой нагрузкой. В процессе тестирования симулируются одновременные запросы пользователей к сайту или приложению. Рассмотрим в статье несколько консольных программ, с помощью которых можно провести нагрузочное тестирование ваших приложений.
Приложение Siege Benchmarking Tool
Siege — это консольное мультипотоковое приложение для нагрузочного тестирования сайтов и серверов. Является мультиплатформенным и доступно под всеми современными ОС. Автор Siege — Джеффри Фалмер.
Установка
CentOS
Добавляем сторонний репозиторий epel:
yum install epel-release
После устанавливаем Siege:
yum install siege
Debian/Ubuntu
Обновляем список доступных пакетов и репозиториев:
apt update
Устанавливаем Siege:
apt install siege
Параметры запуска
Формат запуска Siege такой:
siege <параметры>
Программа может принимать следующие параметры:
'-V'
— вывод на экран текущей версии.
'-h'
— вывод справочной информации.
'-С'
— показывает текущую конфигурацию. Вы можете их менять в файле ~/.siegerc
.
'-v '
— подробный вывод информации. Если этот ключ указан, то Siege будет выводить на экран детальную информацию обо всех обращениях к серверу, а именно: тип HTTP-протокола, код ответа и адрес обращения. Пример:
HTTP/1.1 200 OK: /cgi-bin/whoohoo.cgi?first=Homer&last=simpson
Эта опция особенно полезна в случае регрессионного тестирования или имитации Интернета, когда программа обращается в широкому кругу адресов.
'-g URL'
— совершает обращение к указанной ссылке. Получает заголовки с сервера и выводит их на экран. Отличный инструмент для точечного тестирования.
'-c NUM '
— количество имитируемых пользователей. Опция позволяет производить тестирование веб-сервера с количеством одновременных пользователей указанных в NUM. Фактически это число ограничивается лишь ресурсами компьютера, но на практике для хорошего результата требуется имитировать всего пару сотен пользовательских сессий.
'-i '
— эта опция используется с конфигурационным файлом, содержащим множество ссылок. При её включении Siege случайно выбирает адреса обращений и производит к ним запросы. В реальности вы не можете сказать пользователям, на какие страницы и в какой последовательности они должны заходить. Они будут делать это всегда по-разному. Режим имитации Интернета пытается эмулировать такое поведение. Обратите внимание на то, что в процессе тестирования к некоторым адресам из файла может не произойти обращений вообще, ведь они выбираются случайно.
'-t NUMm '
— время, за которое должно пройти тестирование. Указывается в формате «NUMm», где NUM — это количество единиц времени, а «m» — это модификатор S, M, или H для секунд, минут и часов соответственно. Например, для того чтоб запустить тестирование на час вы можете воспользоваться следующими комбинациями: -t3600S, -t60M, -t1H. Модификатор не чувствителен к регистру, но между ним и числом не должно быть пробелов.
'-f FILE '
— конфигурационный файл, содержащий ссылки (SIEGE_HOME/etc/urls.txt). Вы можете использовать эту опцию для того, чтобы указывать другой путь к нему. Например: siege –file=serverb.txt
'-l’
— эта опция указывает Siege, что она должна записывать всю информацию в лог-файл SIEGE_HOME/var/siege.log
. При каждом новом тестировании файл будет дописан.
'-m MESSAGE '
— эта опция позволяет указать выражение, которым будут разделяться записи о разных тестированиях в лог-файле. Вместе с ней не обязательно использовать опцию -l
, т.к. она будет включена автоматически. Если выражение в MESSAGE содержит пробелы, не забудьте поместить его в кавычки.
'-d NUM '
— эта опция указывает задержку между обращениями имитируемых пользователей к серверу. Время задержки вычисляется от единицы до введённого числа. При проведении тестирования на ресурсоёмких участках приложения желательно ставить задержку, равную секунде ( -d1 ). По умолчанию задержка происходит от 1 секунды до 3. Эта опция позволяет как бы накрывать сервер волнами запросов.
Конфигурационный файл
Если вы часто проводите тестирование с практически одинаковыми параметрами, можно использовать конфигурационный файл. Создается он командой siege.config
и располагается в корневой директории пользователя ~/.siegerc
. Сам конфигурационный файл хорошо прокомментирован.
Примеры запуска
siege -c10 -t60S -b http://domen.ru
Имитирует подключение 10 пользователей к сайту в течение одной минуты. Запросы будут идти даже в случае отсутствия ответов с сервера.
Статистика тестирования
Из всего вывода статистики следует обратить внимание эти пункты:
- Transactions – количество обращений к серверу от всех пользователей.
- Elapsed time – общая продолжительность тестирования с момента первого запроса к серверу и до последнего ответа на последний запрос.
- Data transferred – суммарное количество данных, переданное всеми имитируемыми пользователями. Оно включает в себя как тела запросов, так и их заголовки.
- Response time – среднее время, за которое сервер успел ответить клиенту.
- Transaction rate – среднее число обращений, которые сервер успел обработать за секунду. Оно получается путём деления общего числа запросов на затраченное время.
- Throughput – среднее количество данных, передаваемых ежесекундно от сервера к пользователям.
- Concurrency – количество одновременных подключений, при которых сервер отвечает без задержек.
- Successful transactions – количество запросов на которые сервер ответил.
Приложение для нагрузочного тестирования ApacheBench
Утилита ab входит в состав дистрибутива веб-сервера Apache. Если на сервере не установлен этот веб-сервер, то потребуется установить только один пакет, входящий в дистрибутив — httpd-tools.
Установка ApacheBench
CentOS
# yum install httpd-tools
Debian/Ubuntu
# apt update # apt install apache2-utils
Описание параметров командной строки
Запуск тестирования ApacheBench выполняется в формате:
ab <опции> <url>
В качестве опций и параметров команда ab
принимает следующие ключи:
-A auth-username:password
— простая авторизация, разделителем авторизационных данных является символ двоеточия. Отсылаться данные должны зашифрованные в base64. Строка будет отправлена независимо от того, требуется ли она серверу.
-b windowsize
— размер TCP-буфера отправки/получения, в байтах.
-c concurrency
— количество одновременных запросов. По умолчанию это один запрос.
-C cookie-name=value
— добавить строку Cookie к запросу. Обычно значение идет в форме пары имя=значение. Это поле может повторяться.
-s timeout
— количество секунд до максимального ожидания каждого ответа. По умолчанию 30 секунд.
-d
— не отображать таблицу с процентами отклика серверов в милисекундах.
-e csv-file
— разделенный запятыми файл значений (CSV), который содержит для каждого процента (от 1% до 100%) время (в миллисекундах), необходимое для обслуживания этого процента запросов. Обычно это более удобно, чем файл в формате «gnupilot», поскольку все результаты уже упорядочены.
-f protocol
— возможность указать SSL/TLS-протокол (SSL2, SSL3, TLS1 или ALL).
-g gnuplot-file
— запись данных в файл формата «gnupilot» (TSV, разделенных табуляцией). Этот файл удобно импортировать в такие программы как Gnupilot, IDL, Mathematica, Igor или даже Excel. Первой строкой в файле идут названия значений.
-h
— вывод справочной информации.
-H custom-header
— указать дополнительные заголовки к запросу. Обычно содержит разделенную двоеточием пару «поле»-«значение» (например, Accept-Encoding: zip/zop;8bit).
-i
— выполнять запросы HEAD вместо GET.
-k
— включить возможность HTTP KeepAlive, например, для вызова множества запросов в одной HTTP-сессии. По умолчанию отключено.
-n requests
— количество запросов, которые необходимо выполнить. По умолчанию выполняется только один запрос, который обычно приводит к нерепрезентативным результатам бенчмаркинга.
-t timelimit
— максимальное количество времени для проверки. По умолчанию ограничение отсутствует.
-T content-type
— заголовок содержимого для использования POST/PUT данных,например, application/x-www-form-urlencoded. По умолчанию: text/plain.
-u PUT-file
— файл, содержащий данные для PUT-запроса. Не забудьте также указать параметр -T
.
-v verbosity
— уровень подробности лог-файла. При 4 и выше выводится информация о заголовках, 3 и выше — коды ответов, 2 и выше — предупреждения и другая информация.
-V
— вывод номера версии и выход.
-w
— вывод результатов в HTML-таблице. По умолчанию таблица выводится в две колонки и с белым фоном.
-x-attributes
— строка для вставки в качестве атрибутов таблицы.
-X proxy[:port]
— использовать прокси-сервер для отправки запросов.
-y <tr>-attributes
— строка для использования в теге <tr> при построении HTML-отчета.
-z <td>-attributes
— строка для использования в теге <td> при построении HTML-отчета.
-Z ciphersuite
— установка SSL/TLS циферной пары.
Приложение для тестирования wrk2
Wrk2 — это многопоточный инструмент для тестирования HTTP, способный производить нагрузку с заданной частотой запросов и предоставлять подробную статистику задержек.
Установка wrk2
CentOS
yum -y groupinstall 'Development Tools' yum -y install openssl-devel git zlib-devel git clone https://github.com/giltene/wrk2.git cd wrk2 make cp wrk /usr/local/bin
Ubuntu/Debian
apt-get update apt-get install -y build-essential libssl-dev git zlib1g-dev git clone https://github.com/giltene/wrk2.git cd wrk2 make cp wrk /usr/local/bin
Параметры запуска
Формат использования команды:
wrk2 <опции> <url>
Опции
-c, —connections <N>
— количество соединений, которые нужно держать открытыми
-d, —duration <T>
— продолжительность теста.
-t, —threads <N>
— количество используемых потоков.
-s, —script <S>
— загрузить файл сценария Lua.
-H, —header <H>
— добавить заголовок к запросу.
-L —latency
— вывести статистику задержки.
-U, —u_latency
— вывести некорректную статистику задержки.
-timeout <T>
— время ожидания сокета/запроса.
-B, —batch_latency
— измерить задержку целых пакетов конвейерных операций (в отличие от каждой операции).
-v, —version
— показать сведения о версии.
-R, —rate <T>
— скорость работы (пропускная способность) в запросах/сек (всего). Обязательный параметр.
Пример запуска тестирования
wrk -t4 -c100 -d30s -R1000 -L http://127.0.0.1:8080/index.html
Данная команда запускает тест в течение 30 секунд, в 4 потока, сохраняя открытыми 100 HTTP-соединений с постоянной пропускной способностью 1000 запросов в секунду и выводя подробную информацию о процентах задержки.