Обзор стресс-тестирования 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
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose