В этой главе мы поймем подготовку, необходимую для тестирования динамических страниц. Динамическая веб-страница на стороне сервера — это веб-страница, построение которой контролируется сервером приложений, обрабатывающим сценарии на стороне сервера. Стенд 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, прежде чем вводить 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 Файл не найден. 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.