null

Введение в использование httperf для нагрузочного тестирования WEB-сервера

Обычно httperf запускается с опцией –hog, которая означает, что будут использоваться столько TCP портов, сколько нужно, а не только в интервале от 1024 до 50000.

Пример:

httperf –hog –server=192.168.1.1 –wsess=100,10,0.1 –rate=50 –timeout=5

В этом примере httperf создаёт 100 соединений, по 10 GET запросов корневой страницы. Запросы создаются с интервалом 0.1 секунда. Сессии создаются с частотой 50 в секунду. Опция timeout говорит нагрузчику, что максимальное время на установление соединения, отправление запроса, ожидание ответа и получение ответа не должно превышать 5 секунд. Если хотя одно из этого превышает 5 секунд, то соединение закрывается.

Пример:

httperf –hog –server=192.168.1.1 –wsesslog=100,0.1,http_scenario –rate=50 

В этом примере создаются 100 соединений. В файле http_scenario записан сценарий, по которому заросы отправляются серверу. Если в файле для запроса не указан интервал времени между запросами, он принимается равным 0.1с, как указано в опции wsesslog.

Сценарий можно создать следуюшим образом. Через браузер заходим на сервер, и имитируем действия реального пользователя. Из логов WEB-сервера копируем только URL'ы в файл сценария. Содержимое файла может иметь примерно такой вид:

/common/sysnet/support.jsf?bare=true method=GET
/resource/common/images/squares/square-15.gif method=GET
/resource/common/images/squares/square-0.gif method=GET
/resource/common/images/squares/square-14.gif method=GET
/resource/common/images/squares/square-5.gif method=GET
/faces/resources/jmaki-min.js method=GET
/common/index.jsf method=POST
/common/index.jsf method=POST
/common/index.jsf method=POST
/resources/config.json method=GET
/xhp?key=coretechtips&count=20 method=GET
/xhp?key=sdnevents method=GET
/xhp?key=events method=GET 

Опция method – необязательна.

Пример отчёта httperf о нагрузочном тестировании:

Total: connections 100 requests 1000 replies 1000 test-duration 10.868 s
Connection rate: 9.2 conn/s (108.7 ms/conn, <=37 concurrent connections)
Connection time [ms]: min 962.6 avg 2133.7 max 3717.5 median 2080.5 stddev 847.8
Connection time [ms]: connect 0.8
Connection length [replies/conn]: 10.000
Request rate: 92.0 req/s (10.9 ms/req)
Request size [B]: 64.0
Reply rate [replies/s]: min 63.4 avg 95.3 max 127.2 stddev 45.1 (2 samples)
Reply time [ms]: response 120.5 transfer 2.4
Reply size [B]: header 261.0 content 22375.0 footer 0.0 (total 22636.0)
Reply status: 1xx=0 2xx=1000 3xx=0 4xx=0 5xx=0
CPU time [s]: user 0.93 system 9.87 (user 8.6% system 90.8% total 99.4%)
Net I/O: 2039.7 KB/s (16.7*10^6 bps)
Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0
Session rate [sess/s]: min 5.60 avg 9.20 max 12.60 stddev 4.95 (100/100)
Session: avg 1.00 connections/session
Session lifetime [s]: 2.1
Session failtime [s]: 0.0
Session length histogram: 0 0 0 0 0 0 0 0 0 0 100 

Для того, чтобы сделать отчёт более наглядным и выделить наиболее важную информацию, был написан скрипт на языке Ruby. Скачать его можно отсюда: http://github.com/igrigorik/autoperf. В конфиге задаётся опция httperf_wsesslog=10,5,httperf_scenario. Частота генерации сеансов задаётся с помощью опций low_rate, high_rate и rate_step. Как несложно догадаться, тестирование будет проводиться с разными частотами, начиная от low_rate до high_rate с шагом rate_step. Autoperf выводит таблицу такого вида:

+---------------------------------------------------------------------------------+
|  rate |  conn/s | req/s | replies/s avg | errors |  5xx status |  net io (KB/s) |
+---------------------------------------------------------------------------------+
|   100 |     2.9 |  37.3 |           0.0 |      0 |           0 |          179.2 |
|   150 |     2.9 |  36.0 |           0.0 |      1 |           0 |          174.5 |
|   200 |     2.7 |  32.7 |           0.0 |      1 |           0 |          158.8 |
|   250 |     2.7 |  29.4 |           0.0 |      3 |           0 |          145.8 |
|   300 |     7.2 |  18.1 |           0.0 |     10 |           0 |          43.4 |
|   350 |     2.8 |  26.5 |           0.0 |      5 |           0 |          135.3 |
|   400 |     2.8 |  36.0 |           0.0 |      0 |           0 |          173.2 |
|   450 |     2.6 |  27.9 |           0.0 |      3 |           0 |          138.4 |
|   500 |     2.5 |  28.7 |           0.0 |      2 |           0 |          140.6 |
+---------------------------------------------------------------------------------+ 

1. Для FreeBSD cтавим httperf из портов:

#cd /usr/ports/benchmarks/httperf
#make install

2. Скачиваем autoperf: http://github.com/igrigorik/autoperf

3. Выставляем опции в конфиге:

host = 192.168.1.1
high_rate = 500
rate_step = 50
httperf_wsesslog=10,0.1,httperf_scenario

4. Формируем файл httperf_scenario путём копирования логов WEB сервера.

5. Запускаем autoperf:

low_rate = 100
port = 4848 

Остальные опции не нужны.

#ruby autoperf.rb -c auperf.conf

 

О себе

В компании TUNE IT я занимаю должность инженера. В сферу моих профессиональных интересов входят следующие направления:

  • Администрирование UNIX систем (Solaris, Freebsd);
  • Обслуживание серверов и систем хранения данных фирмы Sun Microsystems;
  • Обеспечение безопасности вычислительных систем и сетей;
  • Виртуализация вычислительных инфраструктур.