Нагрузочное тестирование web-сервера при помощи siege

Одним из инструментов для нагрузочного тестирования web-серверов есть Siege.

Siege умеет выполнять многопоточное нагрузочное тестирование web-серверов по протоколу HTTP (S)/1.0/1.1 методами GET и POST. Утилита симулирует параллельные запросы к веб-серверу на протяжении заданного времени и в конце теста вычисляет следующие показатели:

Запросы к серверу утилита может выполнять как к одному и тому же URL, так к разным на основе списка. Паузы между запросами к серверу могут быть как произвольными в пределах заданного интервала, так и вовсе отсутствовать, позволяя таким образом выполнять тест производительности сервера.

Siege присутствует в репозиториях всех популярных дистрибутивов, так что вы должны без труда установить её в своей системе. Если же ваш дистрибутив не располагает утилитой в среди включённых в комплект пакетов, вы можете самостоятельно собрать siege из исходных кодов, полученных со страницы проекта на freshmeat.net.

Условия тестирования, приводимого в этой заметке, те же самые, что и в предыдущей. Следуя схеме тестирования, определённой в предыдущей статье, для начала выполним 1000 последовательных запросов статического HTML-файла:

$ siege -b -c 1 -r 1000 http://aserver.ashep:80/test.html

Здесь:

После выполнения тестирования утилита выведет результаты:

Transactions:		        1000 hits
Availability:		      100.00 %
Elapsed time:		       10.97 secs
Data transferred:	        8.95 MB
Response time:		        0.01 secs
Transaction rate:	       91.16 trans/sec
Throughput:		        0.82 MB/sec
Concurrency:		        1.00
Successful transactions:        1000
Failed transactions:	           0
Longest transaction:	        0.03
Shortest transaction:	        0.00

Из результатов теста видно, что:

Попробуем теперь выполнить запрос того же URL 1000 раз, только теперь одновременно будем отправлять по 200 запросов за раз:

$ siege -b -c 200 -r 5 http://aserver.ashep:80/test.html
Transactions:		        1000 hits
Availability:		      100.00 %
Elapsed time:		       12.69 secs
Data transferred:	        8.95 MB
Response time:		        1.70 secs
Transaction rate:	       78.80 trans/sec
Throughput:		        0.71 MB/sec
Concurrency:		      134.16
Successful transactions:        1000
Failed transactions:	           0
Longest transaction:	       10.26
Shortest transaction:	        0.01

В результатах этого теста видим значительно возросшее время, требуемое серверу для ответа — 1,7 секунды против 0,01 в предыдущем тесте. При этом на 12 снизилось количество транзакций обрабатываемых за одну секунду. Из генерируемых двухсот одновременных запросов сервер в среднем смог обрабатывать лишь 134,16. Но при всём этом доступность сервера составила 100%, т. е. сервер не был загружен настолько, что был не в состоянии принимать входящие сетевые соединения.

Попробуем выполнить тот же тест, только исключив опцию '-b', что приведёт к снижению нагрузки на сервер за счёт произвольных пауз между транзакциями, что больше приближено к реальному поведению клиентов вашего сервера:

$ siege -c 200 -r 5 http://aserver.ashep:80/test.html
Transactions:		        1000 hits
Availability:		      100.00 %
Elapsed time:		       12.29 secs
Data transferred:	        8.95 MB
Response time:		        1.52 secs
Transaction rate:	       81.37 trans/sec
Throughput:		        0.73 MB/sec
Concurrency:		      124.05
Successful transactions:        1000
Failed transactions:	           0
Longest transaction:	        9.32
Shortest transaction:	        0.01

Как видно, некоторые показатели несколько улучшились, за счёт ухудшения показателя Concurrency, что логично. При необходимости вы можете увеличить диапазон случайно временной задержки между отправкой запросов при помощи опции '-d'. Например, чтобы siege выдерживал случайную паузу между запросами в пределах между 0 и 5 секундами:

$ siege -d 5 -c 200 -r 5 http://aserver.ashep:80/test.html

Если вам необходимо, чтобы siege «побродил» по вашему серверу вместо того, чтобы тупо долбиться на один и тот-же URL, создайте текстовый файл со списком URL, которые необходимо посетить в процессе тестирования и укажите путь к нему при помощи опции '-f':

$ siege -d 5 -c 200 -r 5 -f ~/urls.txt

Чтобы заставить утилиту брать URL из файла не последовательно, а случайно, добавьте опцию '-i':

$ siege -d 5 -c 200 -r 5 -i -f ~/urls.txt

При необходимости вы можете ограничить время, которое будет отведено siege для выполнения теста, при помощи опции '-t'. Обратите внимание, что эта опция имеет приоритет перед опцией '-r'. При указании значения опции '-t' можно использовать суффиксы 's', 'm' и 'h' для определения времени в секундах, минутах и часах соответственно. Например:

$ siege -d 5 -c 200 -t 10s http://aserver.ashep:80/test.html
Источник статьи