Учебники

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

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

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

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

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

Выход

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

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

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

Verbose -v

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

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

Выход

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

Конечно, если вы тестируете переменные ответы или возвращаете не-200 HTTP-коды в случае какой-либо ошибки, вы должны просто игнорировать проверку длины с опцией -l . Скоро мы увидим не 200 HTTP, когда запустим приложение 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 обычно имеет форму пары имя = значение . Это поле может быть повторено.

Использование Session Cookie с Apache Bench

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

Установка web2py

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

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 от web2py

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

Сайт в Терминале

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

Значение Cookie

Теперь давайте используем флаг -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 Файл не найден. 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 000 запросов. Однако, поскольку запросы обрабатывались очень быстро, 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.