Тестирование производительности веб-серверов при помощи Apache Benchmark (ab)
Если решите как-то реализовать написанное, то все действия вы производите на свой страх и риск!
При разработке веб приложений, будь то личные блоги, интернет магазины или многофункциональные порталы, полезно знать, какую нагрузку они смогут выдерживать. Основной задачей любого тестирования производительности сайта является понимание его устойчивости к нагрузкам, которые могут появляться не только из-за большого количества посетителей онлайн, но и являться следствием некорректной настройки сервера, неправильной работы скриптов или действиями злоумышленников (DOS, DDOS).
Ab — небольшая утилита, входящая в пакет apache2-utils, но предустановленная во многих современных дистрибутивах. Она не требует привилегированного доступа к системе и на фоне более гибких конкурентов крайне неприхотлива.
Если в вашей системе ab еще не установлен:
sudo apt-get install apache2-utils
Синтаксис команды следующий:
ab [options] [http[s]://]hostname[:port]/path
Самыми важными ключами для любого тестирования являются ключ n — количество запросов страницы и ключ c — количество конкурентных запросов. Запустим утилиту с этими ключами:
ab -c 10 -n 100 https://example.org/
После завершения работы утилиты мы увидим подобный вывод:
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/Benchmarking google.com (be patient)…..done
Server Software: nginx/1.4.2
Server Hostname: example.org
Server Port: 80Document Path: /
Document Length: 57606 bytesConcurrency Level: 10
Time taken for tests: 0.190 seconds
Complete requests: 100
Failed requests: 0
Write errors: 0
Keep-Alive requests: 100
Total transferred: 5784600 bytes
HTML transferred: 5760600 bytes
Requests per second: 526.32 [#/sec] (mean)
Time per request: 19.000 [ms] (mean)
Time per request: 1.900 [ms] (mean, across all concurrent requests)
Transfer rate: 29732.17 [Kbytes/sec] receivedConnection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 1.1 0 4
Processing: 12 18 2.7 19 23
Waiting: 3 6 1.3 6 8
Total: 12 18 3.3 19 27Percentage of the requests served within a certain time (ms)
50% 19
66% 20
75% 20
80% 20
90% 24
95% 25
98% 26
99% 27
100% 27 (longest request)
Рассмотрим вывод построчно:
Server Software — информация о frontend сервере, переданая в http head.
Server Hostname — имя тестируемого хоста.
Server Port — порт подключения.Document Path — относительный путь без названия хоста.
Document Length — длина возвращенного документа.Concurrency Level — количество конкурентных запросов из ключа c.
Time taken for tests — время, затраченное на тест.
Complete requests — количество выполненных запросов. Если тест прошел без обрывов, значение совпадает с ключом n.
Failed requests — количество запросов с ошибками. В рамках теста ошибки разделяются на четыре типа — ошибки соединения, ошибки передачи, ошибки длины возвращенных данных, исключения). Про ошибки длины стоит добавить, что если тестируемая страница меняет свое содержимое при обновлении, т.е. является динамической, добавляйте ключ -l.
Write errors — ошибки записи. Сюда также часто сыпятся ошибки Broken pipe.
Non-2xx responses — ответы с не 2хх кодами. Т.е. ошибочные либо умышленно, либо в результате проблем на сервере.
Total transferred — общий объем переданных данных
HTML transferred — объем переданных HTML данных
Requests per second— среднее количество обработанных в секунду запросов.
Time per request — среднее время обработки запроса.
Time per request — среднее время обработки запроса учитывая конекурентность.
Transfer rate — скорость передачи данных.Connection Times (ms) — время соединения в миллисекундах
Столбцы: min — минимальное время, mean[+/-sd] — среднеквадратическое отклонение, median — среднее время, max — максимальное время.
Строки: connect — время соединения с сервером, processing — время обработки запроса, waiting — полное время ожидания, включая processing и время ожидания в очереди, total — общее время выполнения запроса.
Percentage of the requests served within a certain time (ms) — доля запросов, выполненных в определенное время. В нашем случае 50% всех запросов было обработано за 19 миллисекунд, а интервал до 27 миллисекунд выолнились все 100% запросов.
50% 19
66% 20
75% 20
80% 20
90% 24
95% 25
98% 26
99% 27
100% 27 (longest request)
Основными показателями эффективности работы сайта можно выделить Requests per second, Time per request и не сильный разрыв в графике долгих запросов. Важно помнить, что географическая удаленность до сервера играет важную роль при анализе показаний, так что если ваш сервер располагается в дальних и не очень странах, не стоит расстраиваться из-за времени выполнения до 200 мс, главное — отсутствие странных перекосов последней секции.
Ниже представлен список поддерживаемых опций ab. Их использование во многом способствует конкретизации тестов, так что не стоит ими пренебрегать
-n requests количество запросов страницы.
-c concurrency количество конкурентных запросов.
-t timelimit максимальное время теста
-s timeout максимальное время на один запрос. По умолчанию 30 секунд.
-b windowsize размер TCP буфера в байтах
-B address адрес для исходящих подключений
-p postfile Файл, содержащий данные для POST. Не забудьте также установить -T
-u putfile Файл, содержащий данные для PUT. Не забудьте также установить -T
-T content-type HTTP заголовок для методов POST/PUT. По умолчанию text/plain
-w Вывести результат в виде HTML.
-C attribute Добавить cookie, например 'Apache=1234'
-H attribute добавить произвольную строку заголовка, например 'Accept-Encoding: gzip'
-A attribute Использовать Basic WWW Authentication, например -A user pass
-P attribute Использовать аутентификацию на Proxy, например -P proxyuser proxypass
-X proxy:port Указать Proxy сервер
-V Отобразить версию ab
-k Использовать KeepAlive
-l Разрешить изменяемую длину документа. Используйте для динамических страниц.
-g filename Сохранить результат в формате gnuplot.
-e filename Сохранить результат в CSV.
-r Не прекращать тест при ошибках передачи.
-h Отобразить справку
-f protocol Указать протокол. (SSL3, TLS1, TLS1.1, TLS1.2 или ALL)
Стандартный сценарий тестирования — последовательный запуск теста ab с увеличением конкурентных запросов и мониторинг зависимости полученных значений. Если вы хотите просто протестировать работу вашего PHP, достаточно создать файл с содержанием phpinfo(). Если при наращивании конкурентных запросов вы получаете ошибку:
socket: Too many open files (24)
достаточно выполнить:
ulimit -n 8192
и лимит подключений увеличится до 8192.
—
Источник — admins.su
Категории: Работа с сайтами