Обзор стресс-тестирования Apache Bench(ab), охватывающего основные сценарии использования от 0 до 1
Обзор стресс-тестирования Apache Bench(ab), охватывающего основные сценарии использования от 0 до 1

Предисловие

Apache Bench (ab) в основном используется для проведения стресс-тестирования производительности HTTP-сервисов. Ниже приведены методы стресс-тестирования, используемые ab в повседневном использовании.

ab ближе к прагматизму и не включает в себя большое количество параметров с небольшим количеством сценариев использования, как другие инструменты. Увидев плотные параметры, отображаемые в справочных документах man или --help, некоторые люди неизбежно будут разочарованы.

Эта статья ориентирована на производство и повседневное использование, и в ней не будут подробно описаны все параметры. Когда вы читаете эту статью, вы, должно быть, пришли к выводу о необходимости решать проблемы и стараться использовать как можно меньше времени и затрат и улучшить бизнес. производительности, есть примерно полная оценка грузоподъемности.

1. Как установить аб

1.Linux

Рекомендуется устанавливать непосредственно из исходного кода программного обеспечения. Зависимости, необходимые для каждого компонента, будут установлены по умолчанию. Компиляция и установка требуют ручной установки зависимостей. Имена зависимых компонентов могут быть разными для каждого дистрибутива, и вы можете столкнуться с различными ошибками. по ходу, как и в рекурсию, в нее надо вникать, поэтому я предпочитаю практичность и минимализм, если только версия ПО, идущая в комплекте, не слишком старая и не соответствует потребностям, или вы обязательно укажете. определенный, просмотрев журнал изменений каждой версии. Установите версию, затем вы можете скомпилировать и установить. Установка не является темой этой статьи, поэтому я постараюсь кратко упомянуть о ней.

Дистрибутив

Команда установки

Arch

pacman -Sy apache

CentOS

yum install -y httpd-tools

Debian/Ubuntu

apt install -y apache2-utils

2.Windows

WindowsклиентСм. эту ссылку,Загрузите сжатый файл и разархивируйте его.,Установите каталог bin в качестве переменной среды или cmd в каталог bin.,Затем используйте команду ab.

2. Оптимизация параметров машины для опрессовки.

При использовании инструмента стресс-тестирования для стресс-тестирования он будет ограничен производительностью инструмента или производительностью самой машины. Если он ограничен аппаратной производительностью самой машины, рекомендуется использовать несколько клиентов для стресс-тестирования. В то же время сама отдельная машина также имеет некоторые параметры ядра, связанные с сетью.

1.tcp_fin_timeout

MSL — это максимальное время жизни сегмента, которое определяет максимальное время жизни любого пакета. Если оно превышается, он будет отброшен.

Такtcp_fin_timeoutПросто для настройкиMSLиз,По умолчанию — 60 с.

Язык кода:shell
копировать
cat /proc/sys/net/ipv4/tcp_fin_timeout
2.tcp_tw_reuse

Количество дескрипторов файлов, выделенных каждому пользователю в Linux, ограничено.,После отключения,Порты и связанные с ними ресурсы не будут выпущены немедленно.,но войдиtime_waitсостояние,ждать2MSLВведено позжеCLOSEсостояние,Затем соединение освобождается,Можно обратиться кRFC793изопределение:

очевидно,В сценарии стресс-теста,Нам нужно разрешить стресс-тестеру устанавливать как можно больше TCP-соединений за короткий период времени.,иtime_waitсостояние Если оно останется2MSL(Прямо сейчас2минута),Такэтот2MSLсоответствующийизtime_waitзаниматьиз Как только ручка достигнет верхнего предела,Невозможно создать новое TCP-соединение.

мы должныtcp_tw_reuseпараметр Открыть,Пусть система запуститсяtime_waitсостояниеповторное использование,Позволяет повторно использовать ресурсы в этом состоянии для новых TCP-соединений.

Просто откройте его временно:

Язык кода:shell
копировать
sysctl -w sysctl net.ipv4.tcp_tw_reuse = 1

или:

Язык кода:txt
копировать
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse

Если вам нужно открыть его навсегда,тогда вам нужно написать/etc/sysctl.conf,и выполнитьsysctl -pВступить в силу。

3.tcp_tw_recycle

Как следует из названия,этотпараметрдля переработкиtime_waitсостояниеизресурс,Вообще говоряtcp_tw_reuseиспользуются вместе。

Временно открыто:

Язык кода:shell
копировать
sysctl -w sysctl net.ipv4.tcp_tw_recycle = 1

или:

Язык кода:shell
копировать
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle

Если вам нужно открыть его навсегда,тогда вам нужно написать/etc/sysctl.conf,и выполнитьsysctl -pВступить в силу。

4.ip_local_port_range

Этот параметр представляет диапазон портов, который может использоваться локальными и внешними соединениями.,параметр Значение по умолчанию:32768 60999,То есть одна машина может одновременно установить 28231 соединение:

Отрегулируйте этот параметр соответствующим образом в соответствии со сценарием стресс-теста.

Например, чтобы добавить еще 1000 портов, это может быть:

Язык кода:shell
копировать
echo '32768 61999' > /proc/sys/net/ipv4/ip_local_port_range
5. Подсчитайте количество подключений в каждом статусе.

Наконец, подсчитайте количество соединений в каждом состоянии, которое может быть:

Язык кода:shell
копировать
netstat -an|awk '/tcp/{print $6}'|sort |uniq -c
netstat -an|awk '/tcp/{s[$6]++}END{for(i in s)print i,s[i]}'

3. Начните путешествие по стресс-тестированию

использовать--helpможно увидетьпараметр Список поддержки:

Формат измерения давления::ab [options] [http[s]]://]hostname[:port]/path/

Примечание. Не указывайте параметры после имени хоста. Такое использование не поддерживается.

1. Короткое соединение для испытания под давлением (-m/-c/-n)

При использовании запроса HTTP GET максимальный параллелизм составляет 1000 каждый раз, а количество стресс-тестов — 10 000 раз:

Язык кода:shell
копировать
ab -m GET -c 1000 -n 10000  http://hostname/

Примечание. За целью должен следовать путь. Если это корневой путь, добавьте «/», например имя хоста/, указанное выше, иначе будет сообщено об ошибке.

Определение:

параметр

Определение

-m

Укажите метод HTTP-запроса,Например, GET/POST/HEAD/PUT и т. д.,Если этот параметр не указан, GET будет отправлен по умолчанию.

-c

Максимальное количество запросов одновременно, то есть количество одновременных запросов.

-n

Общее количество запросов.

Выходная информация:

Язык кода:shell
копировать
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 сеансов. .

Если необходима более высокая доза, например:

Язык кода:shell
копировать
ab -m GET -c 10000 -n 1000000  http://hostname/

-c 10000,Каждый раз можно инициировать максимум 10 000 запросов.,Поскольку объем параллелизма велик,Максимальное количество открытых файлов для одного пользователя может быть превышено.,В это время необходимо установить ulimit:

Язык кода:shell
копировать
ulimit -n 65535

ulimit это своего рода Linux Внутренняя ключевая функция системы, имеющая набор параметров для Установите ограничения на использование ресурсов процессом оболочки и его дочерними процессами. Установить пользователя открытым файлы (максимальное количество файлов, которые может открыть пользователь).

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

Язык кода:shell
копировать
lsof -u `whoami` |wc -l
2. Соединение длины измерения давления (-k)
Язык кода:shell
копировать
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 для наблюдения за нагрузкой и использованием памяти сервера. ЦП и память полностью загружены:

Статистика подключений, установленных сервером:

Язык кода:shell
копировать
lsof -i :80|awk '/ESTABLISHED/{S+=1}END{print S}'

этот1000связи Прямо сейчасдляab -c 1000обозначениеизколичество。

Если вы хотите подсчитать соединения, установленные по указанному IP-адресу, вы можете сделать:

Язык кода:shell
копировать
lsof -i :80|awk '/ESTABLISHED/&&/ipaddress/{S+=1}END{print S}'
3. Укажите таймаут(-ы)

-s s используется для указания периода тайм-аута,Единица секунды. Из справочного документа man видно, что этот параметр доступен в версиях после 2.4.4.,Таймаут по умолчанию составляет 30 секунд.

Использование также очень простое, просто используйте его вместе с другими манометрами.

В режиме длительного соединения каждый запрос GET будет считаться запросом таймаута на срок до 5 секунд:

Язык кода:shell
копировать
ab -m GET -s 3 -k -c 1000 -n 10000 http://hostname/

В режиме короткого соединения каждый POST-запрос будет считаться запросом таймаута на срок до 5 секунд:

Язык кода:shell
копировать
ab -m POST -s 5 -c 1000 -n 10000 'http://hostname/?username=xxx&passwd=xxx'
4. Укажите стресс-тест версии TLS (-f)

-f указывает версию протокола TLS:

Как узнать, какую версию протокола поддерживает узел?

Язык кода:shell
копировать
openssl s_client -connect имя хоста:443 -tls1/-tls1_2/-tls1_3 #Обратите внимание, что здесь "/" нельзя записать напрямую,Вводите только одну версию tls за раз,Если их несколько, просто используйте цикл, чтобы пройти по ним.

илииспользоватьИнтернет-сайтЗапросить поддержкуизTLSВерсия протокола。

Пример:

Укажите версию TLS1.1:

Язык кода:shell
копировать
ab -f TLS1.1 -m GET -k -c 1000 -n 10000 https://hostname/ 

Из захвата пакета ясно видно, что клиент объявляет серверу, что он использует версию TLS1.1 в пакете подтверждения TLS:

В сценарии HTTPS разные версии TLS и комплектов шифров имеют неодинаковую надежность шифрования и дешифрования, а также неодинаковую потерю производительности, что также будет интуитивно отражаться в QPS.

5. Вставьте файлы cookie (-C)

-C Формат, используемый для указания информации о файлах cookie, аналогичен парам ключ-значение:

Если вам необходимо провести стресс-тестирование определенных сценариев, требующих входа в систему, вы можете сохранить статус входа, вставив файлы cookie:

Язык кода:shell
копировать
ab -m GET -k -c 500 -n 2000 -C 'cookie-name=value'  http://hostname/

Вставив файлы cookie, вы можете провести стресс-тестирование любого ресурса, доступ к которому возможен только после входа в систему.

6. Укажите прокси-сервис (-X)

Стресс-тест через прокси, формат: -X proxy[:port]

Язык кода:shell
копировать
ab -m GET -X proxyip:port -k -c 500 -n 2000 http://hostname/

Подобно семиуровневому обратному прокси-серверу nginx, запрос клиента отправляется на прокси-сервер, а прокси-сервер запрашивает реальный сервер и возвращает его клиенту.

7. Установите HTTP-заголовок (-H)

-H Настройка содержимого HTTP-заголовка

Укажите ХОСТ:

Язык кода:shell
копировать
ab -m GET -H 'Host:test.com' -c 1000 -n 10000000 -k http://hostname/

Также укажите HOST, информацию UA и т.д.:

Язык кода:shell
копировать
ab -m GET -H 'Host:domain' -H 'User-Agent: RokasYang/1.0 -c 1000 -n 10000000 -k http://hostname/

любойHTTPГолова может пройти-Hпараметробозначение。

8. Укажите общее время испытания под давлением (-t)

-t Используется для ограничения общей продолжительности стресс-теста, как и команда timeout, в секундах. Если не указано по умолчанию, ограничение по времени отсутствует.

Стресс-тест ограничен 5 секундами:

Язык кода:shell
копировать
ab -m GET -t 5 -c 1000 -n 10000000 http://hostname/

Его также можно использоватьcapinfosкоманда для просмотра сообщенияиз首尾包час间,Интервал 5 с:

9. Используйте запрос HAED вместо GET(-i)

Этот параметр можно использовать вместо -m вместо использования HEAD, в результате оба отправляют запрос в HEAD.

Язык кода:shell
копировать
ab -i -k -c 1000 -n 10000000 http://hostname/
10. Вывод в файл (-g/-e)

-g Вывод измерений для каждого результата в файл.

-e Запишите время, затраченное всеми запросами, в процентном индикаторе выполнения (1%-100%), а затем в файл формата csv, то есть файл формата Excel.

Записывайте время каждого запроса:

Язык кода:shell
копировать
ab -k -c 1000 -n 10000 -g output http://hostname/

Следовательно, в 10 000 запросов будет записано 10 000 запросов (без учета первой строки информации о баннере).

Запишите прошедшее время всех запросов на разных этапах:

Язык кода:shell
копировать
ab -k -c 1000 -n 10000 -e output.csv http://hostname/

4. Резюме

Если вам необходимо отразить наиболее реалистичную или самую высокую производительность QPS с узкими местами на стороне бизнеса, более подходящим является сценарий длительного соединения. Несколько запросов повторно используют одно TCP-соединение, что позволяет сэкономить множество операций по созданию коротких соединений. Из-за этого QPS с длинным соединением. всегда было будет выше коротких соединений.

Если количество клиентов невелико, бизнес-условия узла могут нормально передавать ответы и отсутствуют коды состояния HTTP 5XX, вы можете увеличить количество клиентов в стресс-тесте. Если вы хотите узнать наиболее реалистичную производительность службы по количеству запросов в секунду. , вам нужно найти критическую точку нормального бизнеса для бизнеса. Ненормальный/не отвечающий QPS.

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

Поставляется с PDF-версией:

Обзор решения для стресс-тестирования Apache Bench

Обзор решения для стресс-тестирования Apache Скамейка(яркий вариант)

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.