Apache Bench (ab) в основном используется для проведения стресс-тестирования производительности HTTP-сервисов. Ниже приведены методы стресс-тестирования, используемые ab в повседневном использовании.
ab ближе к прагматизму и не включает в себя большое количество параметров с небольшим количеством сценариев использования, как другие инструменты. Увидев плотные параметры, отображаемые в справочных документах man или --help, некоторые люди неизбежно будут разочарованы.
Эта статья ориентирована на производство и повседневное использование, и в ней не будут подробно описаны все параметры. Когда вы читаете эту статью, вы, должно быть, пришли к выводу о необходимости решать проблемы и стараться использовать как можно меньше времени и затрат и улучшить бизнес. производительности, есть примерно полная оценка грузоподъемности.
Рекомендуется устанавливать непосредственно из исходного кода программного обеспечения. Зависимости, необходимые для каждого компонента, будут установлены по умолчанию. Компиляция и установка требуют ручной установки зависимостей. Имена зависимых компонентов могут быть разными для каждого дистрибутива, и вы можете столкнуться с различными ошибками. по ходу, как и в рекурсию, в нее надо вникать, поэтому я предпочитаю практичность и минимализм, если только версия ПО, идущая в комплекте, не слишком старая и не соответствует потребностям, или вы обязательно укажете. определенный, просмотрев журнал изменений каждой версии. Установите версию, затем вы можете скомпилировать и установить. Установка не является темой этой статьи, поэтому я постараюсь кратко упомянуть о ней.
Дистрибутив | Команда установки |
---|---|
Arch | pacman -Sy apache |
CentOS | yum install -y httpd-tools |
Debian/Ubuntu | apt install -y apache2-utils |
WindowsклиентСм. эту ссылку,Загрузите сжатый файл и разархивируйте его.,Установите каталог bin в качестве переменной среды или cmd в каталог bin.,Затем используйте команду ab.
При использовании инструмента стресс-тестирования для стресс-тестирования он будет ограничен производительностью инструмента или производительностью самой машины. Если он ограничен аппаратной производительностью самой машины, рекомендуется использовать несколько клиентов для стресс-тестирования. В то же время сама отдельная машина также имеет некоторые параметры ядра, связанные с сетью.
MSL — это максимальное время жизни сегмента, которое определяет максимальное время жизни любого пакета. Если оно превышается, он будет отброшен.
Такtcp_fin_timeout
Просто для настройкиMSLиз,По умолчанию — 60 с.
cat /proc/sys/net/ipv4/tcp_fin_timeout
Количество дескрипторов файлов, выделенных каждому пользователю в Linux, ограничено.,После отключения,Порты и связанные с ними ресурсы не будут выпущены немедленно.,но войдиtime_wait
состояние,ждать2MSLВведено позжеCLOSE
состояние,Затем соединение освобождается,Можно обратиться кRFC793изопределение:
очевидно,В сценарии стресс-теста,Нам нужно разрешить стресс-тестеру устанавливать как можно больше TCP-соединений за короткий период времени.,иtime_wait
состояние Если оно останется2MSL(Прямо сейчас2минута),Такэтот2MSLсоответствующийизtime_wait
заниматьиз Как только ручка достигнет верхнего предела,Невозможно создать новое TCP-соединение.
мы должныtcp_tw_reuse
параметр Открыть,Пусть система запуститсяtime_wait
состояниеповторное использование,Позволяет повторно использовать ресурсы в этом состоянии для новых TCP-соединений.
Просто откройте его временно:
sysctl -w sysctl net.ipv4.tcp_tw_reuse = 1
или:
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
Если вам нужно открыть его навсегда,тогда вам нужно написать/etc/sysctl.conf
,и выполнитьsysctl -p
Вступить в силу。
Как следует из названия,этотпараметрдля переработкиtime_wait
состояниеизресурс,Вообще говоряtcp_tw_reuse
используются вместе。
Временно открыто:
sysctl -w sysctl net.ipv4.tcp_tw_recycle = 1
или:
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
Если вам нужно открыть его навсегда,тогда вам нужно написать/etc/sysctl.conf
,и выполнитьsysctl -p
Вступить в силу。
Этот параметр представляет диапазон портов, который может использоваться локальными и внешними соединениями.,параметр Значение по умолчанию:32768 60999
,То есть одна машина может одновременно установить 28231 соединение:
Отрегулируйте этот параметр соответствующим образом в соответствии со сценарием стресс-теста.
Например, чтобы добавить еще 1000 портов, это может быть:
echo '32768 61999' > /proc/sys/net/ipv4/ip_local_port_range
Наконец, подсчитайте количество соединений в каждом состоянии, которое может быть:
netstat -an|awk '/tcp/{print $6}'|sort |uniq -c
netstat -an|awk '/tcp/{s[$6]++}END{for(i in s)print i,s[i]}'
использовать--help
можно увидетьпараметр Список поддержки:
Формат измерения давления::ab [options] [http[s]]://]hostname[:port]/path/
Примечание. Не указывайте параметры после имени хоста. Такое использование не поддерживается.
При использовании запроса HTTP GET максимальный параллелизм составляет 1000 каждый раз, а количество стресс-тестов — 10 000 раз:
ab -m GET -c 1000 -n 10000 http://hostname/
Примечание. За целью должен следовать путь. Если это корневой путь, добавьте «/», например имя хоста/, указанное выше, иначе будет сообщено об ошибке.
Определение:
параметр | Определение |
---|---|
-m | Укажите метод HTTP-запроса,Например, GET/POST/HEAD/PUT и т. д.,Если этот параметр не указан, GET будет отправлен по умолчанию. |
-c | Максимальное количество запросов одновременно, то есть количество одновременных запросов. |
-n | Общее количество запросов. |
Выходная информация:
Server Software: nginx
Server Hostname: xxx
Server Port: 80
Document Path: /
Document Length: 231 bytes #Возвращаемый размер страницы
Concurrency Level: 1000 #Количество одновременных подключений 1000
Time taken for tests: 0.457 seconds #Общее затраченное время
Complete requests: 10000 #Всего выполненных запросов
Failed requests: 0 #Неудачный запрос
Total transferred: 4560000 bytes #Общее количество переданных байт
HTML transferred: 2310000 bytes #htmlКоличество переданных байтов
Requests per second: 21896.07 [#/sec] (mean) #Среднее количество запросов в секунду
Time per request: 45.670 [ms] (mean #Время для каждого одновременного запроса
Time per request: 0.046 [ms] (mean, across all concurrent requests) #Среднее фактическое время выполнения каждого запроса.
Transfer rate: 9750.59 [Kbytes/sec] received #Скорость передачи
Connection Times (ms) Время обработки соединения при #стресс-тест
min mean[+/-sd] median max
Connect: 1 20 2.7 20 28
Processing: 7 24 5.0 23 43
Waiting: 1 17 4.8 16 33
Total: 22 43 4.1 43 57
Percentage of the requests served within a certain time (ms) #Доля времени ответа на запрос в течение определенного периода времени
50% 43 #После выполнения половины количества запросов рассчитывается среднее время ответа и так далее.
66% 44
75% 46
80% 47
90% 48
95% 50
98% 52
99% 55
100% 57 (longest request)
Соответствующий захват пакетов:
Нетрудно заметить, что ab будет пожимать руку получателю каждый раз, когда получит GET, и не будет повторно использовать одно и то же TCP-соединение. Он отправляет 10 000 запросов GET за очень короткий период времени и устанавливает 10 000 раз, создавая 10 000 сеансов. .
Если необходима более высокая доза, например:
ab -m GET -c 10000 -n 1000000 http://hostname/
-c 10000
,Каждый раз можно инициировать максимум 10 000 запросов.,Поскольку объем параллелизма велик,Максимальное количество открытых файлов для одного пользователя может быть превышено.,В это время необходимо установить ulimit:
ulimit -n 65535
ulimit это своего рода Linux Внутренняя ключевая функция системы, имеющая набор параметров для Установите ограничения на использование ресурсов процессом оболочки и его дочерними процессами. Установить пользователя открытым файлы (максимальное количество файлов, которые может открыть пользователь).
Чтобы просмотреть количество файлов, открытых текущим пользователем, вы можете использовать следующую команду:
lsof -u `whoami` |wc -l
ab -m GET -k -c 1000 -n 100000 http://hostname/
параметр | Определение |
---|---|
-m | Укажите метод HTTP-запроса,Например, GET/POST/HEAD/PUT и т. д.,Если этот параметр не указан, GET будет отправлен по умолчанию. |
-c | Максимальное количество запросов одновременно, то есть количество одновременных запросов. |
-n | Общее количество запросов. |
-k | Keepalive, используйте длинные соединения, попробуйте повторно использовать TCP-соединение. |
Хорошо видно, что QPS значительно улучшился в стресс-тесте в режиме длинного соединения, поскольку каждый ресурс GET пытается повторно использовать одно соединение, в отличие от короткого соединения, которое каждый раз требует подтверждения связи, а затем GET.
В то же время изHTTPполе заголовкаизConnetction:keep-alive
Это можно увидеть-kпараметр Режим стресс-теста есть.HTTPГоловное присоединениеэтот Поле:
Почему тайм-аут завершения узла или время ответа не увеличились значительно во время стресс-теста?
Хоть это может что-то объяснить,этотчасклиент Величина запроса<=Уровень обработки бизнес-уровня сервера,Таким образом, для стресс-тестирования сервера используется только один клиент.,Если партнер не достигает узкого места в производительности,Затем вы можете рассмотреть возможность увеличения параллельности стресс-тестирования или проведения стресс-тестирования на нескольких клиентах одновременно.
Ниже приведена внешняя машина для веб-тестирования в качестве демонстрации:
Как видно на рисунке выше, сервер уже находится в режиме высокой нагрузки и не может нормально отвечать на запросы и возвращает код состояния 502.
Используйте htop для наблюдения за нагрузкой и использованием памяти сервера. ЦП и память полностью загружены:
Статистика подключений, установленных сервером:
lsof -i :80|awk '/ESTABLISHED/{S+=1}END{print S}'
этот1000связи Прямо сейчасдляab -c 1000
обозначениеизколичество。
Если вы хотите подсчитать соединения, установленные по указанному IP-адресу, вы можете сделать:
lsof -i :80|awk '/ESTABLISHED/&&/ipaddress/{S+=1}END{print S}'
-s s используется для указания периода тайм-аута,Единица секунды. Из справочного документа man видно, что этот параметр доступен в версиях после 2.4.4.,Таймаут по умолчанию составляет 30 секунд.
Использование также очень простое, просто используйте его вместе с другими манометрами.
В режиме длительного соединения каждый запрос GET будет считаться запросом таймаута на срок до 5 секунд:
ab -m GET -s 3 -k -c 1000 -n 10000 http://hostname/
В режиме короткого соединения каждый POST-запрос будет считаться запросом таймаута на срок до 5 секунд:
ab -m POST -s 5 -c 1000 -n 10000 'http://hostname/?username=xxx&passwd=xxx'
-f указывает версию протокола TLS:
Как узнать, какую версию протокола поддерживает узел?
openssl s_client -connect имя хоста:443 -tls1/-tls1_2/-tls1_3 #Обратите внимание, что здесь "/" нельзя записать напрямую,Вводите только одну версию tls за раз,Если их несколько, просто используйте цикл, чтобы пройти по ним.
илииспользоватьИнтернет-сайтЗапросить поддержкуизTLSВерсия протокола。
Пример:
Укажите версию TLS1.1:
ab -f TLS1.1 -m GET -k -c 1000 -n 10000 https://hostname/
Из захвата пакета ясно видно, что клиент объявляет серверу, что он использует версию TLS1.1 в пакете подтверждения TLS:
В сценарии HTTPS разные версии TLS и комплектов шифров имеют неодинаковую надежность шифрования и дешифрования, а также неодинаковую потерю производительности, что также будет интуитивно отражаться в QPS.
-C
Формат, используемый для указания информации о файлах cookie, аналогичен парам ключ-значение:
Если вам необходимо провести стресс-тестирование определенных сценариев, требующих входа в систему, вы можете сохранить статус входа, вставив файлы cookie:
ab -m GET -k -c 500 -n 2000 -C 'cookie-name=value' http://hostname/
Вставив файлы cookie, вы можете провести стресс-тестирование любого ресурса, доступ к которому возможен только после входа в систему.
Стресс-тест через прокси, формат: -X proxy[:port]
ab -m GET -X proxyip:port -k -c 500 -n 2000 http://hostname/
Подобно семиуровневому обратному прокси-серверу nginx, запрос клиента отправляется на прокси-сервер, а прокси-сервер запрашивает реальный сервер и возвращает его клиенту.
-H
Настройка содержимого HTTP-заголовка
Укажите ХОСТ:
ab -m GET -H 'Host:test.com' -c 1000 -n 10000000 -k http://hostname/
Также укажите HOST, информацию UA и т.д.:
ab -m GET -H 'Host:domain' -H 'User-Agent: RokasYang/1.0 -c 1000 -n 10000000 -k http://hostname/
любойHTTPГолова может пройти-H
параметробозначение。
-t
Используется для ограничения общей продолжительности стресс-теста, как и команда timeout, в секундах. Если не указано по умолчанию, ограничение по времени отсутствует.
Стресс-тест ограничен 5 секундами:
ab -m GET -t 5 -c 1000 -n 10000000 http://hostname/
Его также можно использоватьcapinfos
команда для просмотра сообщенияиз首尾包час间,Интервал 5 с:
Этот параметр можно использовать вместо -m вместо использования HEAD, в результате оба отправляют запрос в HEAD.
ab -i -k -c 1000 -n 10000000 http://hostname/
-g
Вывод измерений для каждого результата в файл.
-e
Запишите время, затраченное всеми запросами, в процентном индикаторе выполнения (1%-100%), а затем в файл формата csv, то есть файл формата Excel.
Записывайте время каждого запроса:
ab -k -c 1000 -n 10000 -g output http://hostname/
Следовательно, в 10 000 запросов будет записано 10 000 запросов (без учета первой строки информации о баннере).
Запишите прошедшее время всех запросов на разных этапах:
ab -k -c 1000 -n 10000 -e output.csv http://hostname/
Если вам необходимо отразить наиболее реалистичную или самую высокую производительность QPS с узкими местами на стороне бизнеса, более подходящим является сценарий длительного соединения. Несколько запросов повторно используют одно TCP-соединение, что позволяет сэкономить множество операций по созданию коротких соединений. Из-за этого QPS с длинным соединением. всегда было будет выше коротких соединений.
Если количество клиентов невелико, бизнес-условия узла могут нормально передавать ответы и отсутствуют коды состояния HTTP 5XX, вы можете увеличить количество клиентов в стресс-тесте. Если вы хотите узнать наиболее реалистичную производительность службы по количеству запросов в секунду. , вам нужно найти критическую точку нормального бизнеса для бизнеса. Ненормальный/не отвечающий QPS.
Если вы используете разные клиенты для стресс-тестирования одного и того же сервера, QPS будет неравномерным, что нормально. Когда производительность оборудования разных клиентов различна, производительность отправки и получения пакетов ограничена, а QPS и сетевая задержка также неразделимы. Взаимосвязь, даже разница в несколько миллисекунд может привести к многоуровневому разрыву QPS. Особенно в сценарии с небольшими пакетами каждое соединение должно взаимодействовать с большим количеством пакетов. В этом сценарии разрыв QPS вызван разрывом задержки. нельзя недооценивать.
Поставляется с PDF-версией:
Обзор решения для стресс-тестирования Apache Bench
Обзор решения для стресс-тестирования Apache Скамейка(яркий вариант)