Подготовка к тестированию динамических страниц

В этой главе мы поймем подготовку, необходимую для тестирования динамических страниц. Серверная динамическая веб-страница - это веб-страница, построение которой контролируется сервером приложений, обрабатывающим серверные сценарии. Стенд apache может тестировать только динамическую веб-страницу на стороне сервера.

Уровень параллелизма и общее количество запросов

Уровень параллелизма должен быть ниже общего количества запросов.

$ ab -l -r -n 30 -c 80 -k -H "Accept-Encoding: gzip, deflate"  http://127.0.0.1:8000/

Output

ab: Cannot use concurrency level greater than total number of requests
Usage: ab [options] [http[s]://]hostname[:port]/path

Использование флагов

В этом разделе мы опишем использование некоторых важных флагов с командой ab. Мы будем использовать термины, параметры и флаги как взаимозаменяемые.

Verbose -v

Опцию подробного вывода можно использовать для анализа и отладки, если существует несколько неудачных запросов. Обычным признаком сбоя нагрузочного теста является то, что тест завершается очень быстро и дает хорошее количество запросов в секунду. Но это будет неправильный тест. Чтобы определить успех или неудачу, вы можете использовать-v 2опция, которая будет выгружать тело и заголовок каждого ответа в вывод терминала. Следующая команда описывает вариант использования -

$ ab -n 1 -v 2 http://www.generic-example-URL.com/

Output

LOG: header received:
HTTP/1.0 200 OK
…
Content-Length: 2548687

Конечно, если вы тестируете ответы с переменными или возвращаете HTTP-коды, отличные от 200, в случае какой-либо ошибки, вам следует просто игнорировать проверку длины с помощью -lвариант. Мы скоро увидим HTTP, отличный от 200, когда мы запустим приложение web2py в следующих главах.

Keep-alive -k

Когда клиент отправляет HTTP-запрос, устанавливается соединение с сервером, сервер отправляет ответ, и соединение закрывается после того, как он отправил запрос. Этот цикл продолжается с каждым запросом. Однако с настройкой keep-alive (также известной как постоянные соединения) клиент поддерживает открытое базовое TCP-соединение для облегчения множественных запросов и ответов; это исключает медленное и дорогостоящее время инициализации соединения, которое в противном случае имело бы место.

Переменная длина документа -l

Если веб-страница имеет переменную длину, вам следует воспользоваться опцией -l. Apache Bench не сообщает об ошибках, если длина ответов непостоянна. Это может быть полезно для динамических страниц.

Использование опции -r

Как заставить ab не выходить при получении ошибок? Вам следует использовать опцию-r. Без этой опции ваш тест может прерваться, как только любой запрос попадет в ошибку сокета. Однако с этой опцией ошибки будут сообщаться в заголовке неудачных ошибок, но тест будет продолжаться до конца.

Использование опции -H

Эта опция используется для добавления произвольной строки заголовка. Аргумент обычно имеет форму допустимой строки заголовка, содержащей пару значений поля, разделенных двоеточиями (например, «Accept-Encoding: zip / zop; 8bit»).

Использование опции -C

В следующем разделе мы подробно узнаем, как использовать указанные выше параметры в сочетании с возможностью использования значения cookie, т. Е. -Cвариант. Параметр -C обычно имеет формуname = valueпара. Это поле можно повторять.

Использование файла cookie сеанса с Apache Bench

Чтобы понять, как использовать куки с Apache Bench, нам нужна веб-страница, которая пытается установить куки. Очень хороший пример - приложение web2py, представляющее собой веб-фреймворк на Python.

Установка web2py

Мы собираемся быстро установить еще одно приложение на Python web2py. Вы можете узнать больше о том, как его использовать, в обзоре Web2py Framework .

Python обычно устанавливается по умолчанию на сервер Ubuntu и Debian. Следовательно, одно требование для успешного запуска web2py уже выполнено.

Однако нам нужно установить пакет unzip, чтобы извлечь исходные файлы web2py из zip-файла, который мы будем загружать -

$ sudo apt-get update
$ sudo apt-get install unzip

Давайте возьмем фреймворк web2py с сайта проекта. Мы загрузим это в нашу домашнюю папку -

$cd ~
$ wget http://www.web2py.com/examples/static/web2py_src.zip

Теперь мы можем распаковать только что скачанный файл и переместиться внутрь -

$ unzip web2py_src.zip
$ cd web2py

Чтобы запустить web2py, вам не нужно его устанавливать. Как только вы окажетесь внутри каталога web2py, вы можете запустить его, набрав следующую команду -

$python web2py.py

Если все прошло успешно, вы увидите следующий вывод, в котором вам будет предложено выбрать пароль для административного интерфейса:

web2py Web Framework
Created by Massimo Di Pierro, Copyright 2007-2017
Version 2.14.6-stable+timestamp.2016.05.10.00.21.47
Database drivers available: sqlite3, imaplib, pymysql, pg8000
WARNING:web2py:GUI not available because Tk library is not installed
choose a password:

please visit:
        http://127.0.0.1:8000/
use "kill -SIGTERM 23904" to shutdown the web2py server

Однако вы должны знать, что запущенный веб-интерфейс доступен только на локальном компьютере.

Из выходных данных вы можете понять, что для остановки веб-сервера вам нужно будет набрать «CTRL-C» в мгновенном терминале. С другой стороны, чтобы остановить сервер web2py на другом терминале, относящемся к тому же VPS, вы можете вставить команду kill -SIGTERM <PID>, где <PID> - это идентификатор процесса для сервера web2py, который в данном случае 23904.

Сессионный файл cookie от web2py

Если страница доступна только зарегистрированному пользователю, а не доступна напрямую со страницы входа, в этом случае вы можете использовать -Cфлаг. Этот флаг определяет cookie для команды ab. Но вы должны получить значение cookie идентификатора сеанса из действительного сеанса. Как это получить? Различные онлайн-руководства познакомят вас с инструментами разработчика браузера Chrome (или Mozilla). Но в нашем тестовом примере, поскольку приложение доступно только в командной строке, мы будем использовать браузер lynx для получения значения.

Давайте сначала получим значение cookie сеанса. Откройте другой терминал и введите следующую команду -

$ lynx http://127.0.0.1:8000/

В ответ на указанную выше команду lynx запросит у вас разрешение принять cookie с сервера web2py, как показано на изображении ниже.

Запишите значение cookie перед вводом yпринять cookie. Теперь терминал будет выглядеть как на следующем изображении - сайт на терминале!

Получив значение cookie, мы запустим тест ab. Для этого нам нужно будет открыть третий терминал (см. Изображение ниже) -

Теперь давайте используем флаг -C в третьем терминале -

$ ab -n 100 -c 10 -C session_name = 127.0.0.1-643dad04-3c34  http://127.0.0.1:8000/

Выход

This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient).....done


Server Software:        Rocket
Server Hostname:        127.0.0.1
Server Port:            8000

Document Path:          /
Document Length:        66 bytes

Concurrency Level:      10
Time taken for tests:   0.051 seconds
Complete requests:      100
Failed requests:        0
Non-2xx responses:      100
Total transferred:      27700 bytes
HTML transferred:       6600 bytes
Requests per second:    1968.12 [#/sec] (mean)
Time per request:       5.081 [ms] (mean)
Time per request:       0.508 [ms] (mean, across all concurrent requests)
Transfer rate:          532.39 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        1    2   0.9      2       4
Processing:     0    3   0.9      3       5
Waiting:        0    2   1.1      2       4
Total:          4    5   0.7      5       7

Percentage of the requests served within a certain time (ms)
  50%      5
  66%      5
  75%      5
  80%      6
  90%      6
  95%      6
  98%      7
  99%      7
 100%      7 (longest request)

Из вывода выше отметим несколько моментов. Во-первых, web2py использует веб-сервер Rocket . Мы также отмечаем, что мы получаем ответы «не 2xx» в дополнение к ранее обсужденным заголовкам в выходных данных. Как правило, протокол Http отвечает на запрос, используя код ответа, и все, что находится в диапазоне 200 секунд, означает «хорошо», а остальное соответствует некоторой проблеме. Например, 400 - это ошибки, связанные с ресурсами, такие как 404 File Not Found. 500 соответствуют ошибкам сервера. В нашем случае нигде нет ошибок, кроме случаев, когда мы используем параметр -C. Его можно подавить с помощью опции -l, как уже было описано.

Проверка страницы администратора

В этом разделе мы поймем, как проверить страницу администратора. Для сравнения давайте протестируем другой URL-адрес приложения web2py -

$ ab -n 100 -c 10 session_name = 127.0.0.1-643dad04-3c34  http://127.0.0.1:8000/admin

Выход

This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient).....done


Server Software:        Rocket
Server Hostname:        127.0.0.1
Server Port:            8000

Document Path:          /admin
Document Length:        8840 bytes

Concurrency Level:      10
Time taken for tests:   2.077 seconds
Complete requests:      100
Failed requests:        0
Total transferred:      926700 bytes
HTML transferred:       884000 bytes
Requests per second:    48.14 [#/sec] (mean)
Time per request:       207.749 [ms] (mean)
Time per request:       20.775 [ms] (mean, across all concurrent requests)
Transfer rate:          435.61 [Kbytes/sec] received

Connection Times (ms)
          min  mean[+/-sd] median   max
Connect:        0    1   3.2      0      12
Processing:    62  204  52.2    199     400
Waiting:       61  203  52.0    199     400
Total:         62  205  54.3    199     411

Percentage of the requests served within a certain time (ms)
  50%    199
  66%    211
  75%    220
  80%    226
  90%    264
  95%    349
  98%    381
  99%    411
 100%    411 (longest request)

В частности, следует обратить внимание на соответствующую статистику в разделах «Время подключения» и «Процент обслуженных запросов…» http://127.0.0.1:8000/ а также http://127.0.0.1:8000/admin. Это огромная разница.

Использование опции Timelimit

Как правило, опция Timelimit - непростая задача. Позвольте нам понять это из руководства ab , которое довольно объяснительно -

-t timelimit
Maximum number of seconds to spend for benchmarking. This implies a -n 50000 internally.
Use this to benchmark the server within a fixed total amount of time.
Per default there is no timelimit.

Давайте запустим тест с этой опцией. Мы отметим наши наблюдения после прохождения вывода -

$ ab -n 100 -c 10 -t 60   http://127.0.0.1:8000/

Выход

This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 127.0.0.1 (be patient)
Completed 5000 requests
Completed 10000 requests
Completed 15000 requests
Completed 20000 requests
Completed 25000 requests
Completed 30000 requests
Completed 35000 requests
Completed 40000 requests
Completed 45000 requests
Completed 50000 requests
Finished 50000 requests


Server Software:        Rocket
Server Hostname:        127.0.0.1
Server Port:            8000

Document Path:          /
Document Length:        66 bytes

Concurrency Level:      10
Time taken for tests:   22.547 seconds
Complete requests:      50000
Failed requests:        0
Non-2xx responses:      50000
Total transferred:      13850000 bytes
HTML transferred:       3300000 bytes
Requests per second:    2217.61 [#/sec] (mean)
Time per request:       4.509 [ms] (mean)
Time per request:       0.451 [ms] (mean, across all concurrent requests)
Transfer rate:          599.88 [Kbytes/sec] received

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    2   0.8      2       8
Processing:     0    2   3.2      2     218
Waiting:        0    2   3.2      2     218
Total:          2    4   3.1      4     220

Percentage of the requests served within a certain time (ms)
  50%      4
  66%      4
  75%      4
  80%      5
  90%      5
  95%      5
  98%      7
  99%      8
 100%    220 (longest request)

Обратите внимание, что в выходных данных эта опция переопределяет количество запросов, заданных параметром -nвариант и продолжается до 50 тыс. запросов. Однако, поскольку запросы обрабатывались очень быстро, ab завершает работу, как только будет достигнута отметка 50 тыс. - в течение 22 секунд (см. Заголовок Время, затраченное на тесты) в данном случае.

Вы можете протестировать ту же команду, заменив http://127.0.0.1:8000/ с участием http://127.0.0.1:8000/admin (при условии, что это наше приложение web2py) или сторонний веб-сайт, например https://www.apache.org/, обратите внимание на разницу в статистике.

Контрольный список перед выполнением нагрузочного теста

Есть несколько проверок, которые помогут вам успешно запустить тест и точно измерить производительность. Перед выполнением нагрузочного теста примите во внимание следующие условия:

  • Убедитесь, что не загружен дополнительный модуль python.

  • Чтобы избежать исчерпания портов TCP / IP, обычно следует подождать 2–3 минуты, прежде чем переходить к другому тесту ab.

  • Убедитесь, что количество одновременных подключений меньше, чем количество рабочих потоков Apache.

  • Вы должны перезагрузить сервер перед выполнением другого теста, если Apache или python выйдет из строя.