Важной частью разработки web-приложения является тестирование производительности. Часто при постановке задачи заказчик требует чтобы сервис выдерживал определенную нагрузку. В процессе профилирования и оптимизации полезно отслеживать, как изменилась скорость работы приложения при новых условиях. Для этой цели можно использовать Apache HTTP server benchmarking tool.
Использование ab
Установка
Для того чтобы установить ab в debian необходимо установить пакет apache2-utils:
apt-get install apache2-utils
Параметры
Утилита запускается с помощью команды ab. Далее рассмотрим основные параметры.
- -c - очень важный параметр. Определяет количество параллельных запросов отправляемых одновременно
- -n - количество отправляемых запросов
- -t - максимальное количество секунд отведенное на тест. Подходит для тестирования приложения в течении определенного временного промежутка. При этому необходимо задать большое значение параметру -n
- -C cookie-name=value - добавляем cookie в каждый запрос к серверу
- -H - задаем заголовок запроса
- -T - Content-type заголовок запроса
- -p - файл содержащий тело POST запроса
Выполнение теста
Давайте выполним тестирование какого-либо сайта и рассмотрим содержание отчета, который генерирует ab.
ab -c 10 -n 100 http://google.com/
Benchmarking google.com (be patient).....done
Server Software: gws
Server Hostname: google.com
Server Port: 80
Document Path: /
Document Length: 219 bytes
Concurrency Level: 10
Time taken for tests: 1.290 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Non-2xx responses: 100
Total transferred: 54000 bytes
HTML transferred: 21900 bytes
Requests per second: 77.51 [#/sec] (mean)
Time per request: 129.018 [ms] (mean)
Time per request: 12.902 [ms] (mean, across all concurrent requests)
Transfer rate: 40.87 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 54 56 2.0 55 63
Processing: 70 72 2.4 72 82
Waiting: 70 72 2.3 72 82
Total: 124 128 3.4 127 140
Percentage of the requests served within a certain time (ms)
50% 127
66% 128
75% 129
80% 130
90% 133
95% 134
98% 138
99% 140
100% 140 (longest request)
Сначала выводится различная информация о проводимом тесте, такая как типа серверного ПО, хост, порт, путь и тд. Дальше идут более интересные характеристики. Рассмотрим наиболее важные из них:
- Time taken for tests - суммарное время потраченное на весь тест
- Complete requests - количество выполненных запросов
- Failed requests - количество запросов завершенных отказом
- Total transferred и HTML transferred - суммарный объем и объем html переданные во время теста
- Requests per second или rps - количество обрабатываемых запросов в секунду
- Time per request - среднее время затраченное на запрос с и без учета распараллеливания
- Transfer rate - скорость передачи данных при прохождении теста
Далее идет таблица с временем затраченным на подключение, обработку запроса и ожидание. И после этого таблица которая показывает процент от количества запросов, которые успели выполнится за определенный промежуток времени.
Практическое применение
В зависимости от поставленных перед вами задач необходимо задавать различные параметры при запуске теста. Рассмотрим несколько примеров.
- Нагрузочное тестирование. Тестирование системы при заданной нагрузке. Здесь все просто - указываем заданные значения для параметров -n и -c и запускаем тест. В результате необходимо выяснить загруженность аппаратной части приложения, надёжность работы (количество отказов за заданное время).
- Стресс-тестирование. Определение максимальной нагрузки при которой сервер остается работоспособным, а также выявление последствий нагрузки превышающей ожидаемую. В данном случае вам необходимо выполнить несколько итераций запуска тестов, постепенно наращивая количество параллельных запросов и количество пакетов. Данный цикл необходимо продолжать пока вы не начнете получать значительный для вас процент отказов (или не положите сервер ;)). Наиболее важными, на мой взгляд, в данном случае являются такие показатели, как количество запросов в секунду и время потраченное на 1 запрос, а также процент отказов.
- Тестирование стабильности. При данном виде тестирования мы производим длительный тест (время задаем при помощи параметра -t, а количество запросов -n очень большое) и смотрим количество отказов системы. Также полезным будет ознакомится с "разбросом" времени обработки запроса, для того чтобы выяснить не ухудшается ли производительность со временем. Данное значение можно получить из таблицы Connection Times.
Дополнительно. Пример выполнения POST-запроса в ab
Для выполнения POST-запроса необходимо составить тело запроса и сохранить его в файл. Для этого напишем небольшой скрипт:
<?php
$params = array('test1' => 1, 'test2' => 'Second test');
$body = http_build_query($params);
file_put_contents('/tmp/body', $body);
После этого в файле /tmp/body появится следующее содержимое:
test1=1&test2=Second+test
Теперь можно запускать тестирование:
ab -T application/x-www-form-urlencoded -p /tmp/body -n 10 http://localhost/test/ab/post-handler.php
Вывод
Apache HTTP server benchmarking tool - полезный инструмент web-разработчика, который позволяет максимально быстро произвести тестирование производительности той или иной части приложения. Он отлично подходит для тестирования критических участков и является незаменимым при профилировании и оптимизации web-приложения. Однако для тестирования нескольких функций с учетом различных сценариев и моделирования действий пользователя, необходимо использовать более сложные системы тестирования.
UPDATE #1
Полезное дополнение от товарища:
ApacheBenchmark выдает много Failed. Сначала было стремно, но все оказалось не так страшно :) [#apache][] stackoverflow.com/questions/5794…
— Pugach Vitaliy (@lionasp) March 16, 2012