Практика нагрузочного тестирования интерфейсов ab и wrk

задняя часть

| Введение Ежедневные операции и действия будут приносить большое количество запросов. Чтобы оценить, может ли текущая система поддерживать предполагаемое количество запросов, проводятся стресс-тесты на интерфейсах с большим количеством посещений. Как правило, несколько раундов стресс-тестов Это проверка скрытых ошибок системы и поиск точек, которые можно оптимизировать, затем оценка текущей нагрузки системы по результатам опрессовки, а затем подготовка к расширению и другим работам, чтобы система могла поддерживать операционная деятельность стабильно и надежно.

Терминология измерения напряжения Описание

1. Пропускная способность

Понятие: Количественное описание возможностей одновременной обработки сервера в запросах/с, которое относится к количеству запросов, обрабатываемых в единицу времени при числе одновременно работающих пользователей. Максимальное количество запросов, которое может быть обработано в единицу времени при определенном количестве одновременных пользователей, называется максимальной пропускной способностью. Формула расчета: общее количество запросов / время обработки этих запросов, т.е. Запросов в секунду = Завершенные запросы / Время, затраченное на тесты

2. Количество одновременных подключений

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

3. Количество одновременных пользователей

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

4. Среднее время ожидания запроса пользователем

Формула расчета: время, затраченное на обработку всех запросов / (общее количество запросов / одновременных пользователей), т. е. Время на запрос = время, затраченное на тесты / (выполненные запросы / уровень параллелизма)

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

1. Инструмент для измерения давления на практике

введение в использование ab

Вот часто используемые параметры и использование

-n requests 总请求数
-c concurrency 一次产生的请求数,可以理解为并发数
-t timelimit 测试所进行的最大秒数, 可以当做请求的超时时间
-p postfile 包含了需要POST的数据的文件
-T content-type POST数据所使用的Content-type头信息

получить запрос: ab -n 1000 -c 10 -t 10 "проверить URL.com/individual_user?UI…"

почтовый запрос: ab -n 1000 -c 10 -t 10 -p post.json -T "application/x-www-form-urlencoded" "testurl.com/add_user" где post.json — это параметр json, требуемый вашим интерфейсом.

{"name":"bob","age":12,"sex":1}

Написать сценарий пакетного испытания под давлением (несколько одновременных испытаний под давлением)

В реальном стресс-тесте нам часто нужно стресс-тестировать много интерфейсов, и многие интерфейсы запрашиваются одновременно, поэтому мы не можем получить TPS, тестируя интерфейсы один за другим, поэтому нам нужно написать свои собственные скрипты для выполнения требований. одновременного стресс-тестирования. Ниже приведен простой сценарий пакетного стресс-тестирования test.sh:

#!/bin/sh

RESULT_DIR="/data/home/yawenxu/TestResult/"
jsonFileArr="ff0e_00.json ff0e_02.json ff0e_05.json ff0e_06.json ff0e_07.json ff0e_08.json ff0e_10.json ff0e_11.json" # 每个接口post需要的json参数的文件
concurrency=${1-1} #并发数
count=${2-1}  #总请求数
input_file_name=$3
exec_single_ab(){
        if [ -f $1 ];then
                /usr/bin/ab -n $2 -c $3 -p $1 -T "application/x-www-form-urlencoded" "http://$4" >$RESULT_DIR$1$2"_nginx.txt" 2>&1 &
        else
                echo $1" is not exists"
        fi

}
exec_loop_ab(){
        for item_name in $jsonFileArr
        do
                exec_single_ab $item_name $concurrency $count "http://api.com/xxx" &
        done
}

if [ -f $input_file_name ];then
        exec_single_ab $input_file_name $concurrency $count &
else
        exec_loop_ab &
fi

Этот сценарий обеспечивает одновременное стресс-тестирование нескольких интерфейсов и сохраняет отчет о стресс-тестировании каждого интерфейса в файл для удобства анализа. Выполните команду sh test.sh 10000 10000, чтобы создать файл отчета о проверке давления за один раз следующим образом:

ff0e_00.json10000_nginx.txt  ff0e_05.json10000_nginx.txt  ff0e_07.json10000_nginx.txt  ff0e_10.json10000_nginx.txt
ff0e_02.json10000_nginx.txt  ff0e_06.json10000_nginx.txt  ff0e_08.json10000_nginx.txt  ff0e_11.json10000_nginx.txt

Отчет о проверке давления файла выглядит следующим образом

This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking www.voovlive.com (be patienComCompleted 100 requesComCompleted 200 requesComCompleted 300 requesComCompleted 400 requesCompleted 500 requests
Finished 500 requests


Server Software:        
Server Hostname:        10.228.15.46
Server Port:            3002

Document Path:          /test/get
Document Length:        248 bytes

Concurrency Level:      500
Time taken for tests:   2.523 seconds
Complete requests:      500
Failed requests:        0
Write errors:           0
Total transferred:      161500 bytes
Total POSTed:           359640
HTML transferred:       124000 bytes
Requests per second:    198.19 [#/sec] (mean)
Time per request:       2522.808 [ms] (mean)
Time per request:       5.046 [ms] (mean, across all concurrent requests)
Transfer rate:          62.52 [Kbytes/sec] received
                        139.21 kb/s sent
                        201.73 kb/s total

Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0   13   4.1     14      17
Processing:   416  948 516.2    828    2485
Waiting:      415  947 516.4    827    2485
Total:        432  961 513.2    841    2497

Percentage of the requests served within a certain time (ms)
  50%    841
  66%    913
  75%    990
  80%   1213
  90%   2039
  95%   2064
  98%   2476
  99%   2484
 100%   2497 (longest request)
uest)

Несколько моментов, которые нас больше всего беспокоят 1. Уровень параллелизма: 500 // Параллелизм 2.Время, затраченное на тесты: 2,523 секунды // общее время 3.Полные запросы: 500 // Количество выполненных запросов 4. Неудачные запросы: 0 // Количество неудачных запросов 5. Запросов в секунду: 198,19 [#/сек] (среднее значение) // Пропускная способность (TPS) 6. Время на запрос: 2522,808 [мс] (среднее) // Среднее время, потраченное на запрос 7. Процент запросов, обслуженных за определенное время (мс) // Распределение запросов по времени Стресс-тест предназначен в основном для оценки нагрузки на текущую систему, поэтому обычно достаточно посмотреть на пропускную способность (TPS) и показатель успешности.Если вы хотите оценить производительность интерфейса, вы можете просмотреть данные в пунктах 6 и 7. Часто бывает необходимо изменить параметры измерения давления (одновременное количество и общее количество запросов) несколько раз, чтобы получить точное значение TPS.

Сводка проблемы

Преимущества АБ заключаются в следующем:

1. 简单易用
2. 支持post请求,接受json文件作为参数 (方便编写脚本批量测试)
3. 压测量不大的情况下够用(1024个并发以下)

Но есть и очевидные недостатки

1. Невозможно продолжить измерение давления, контроль скорости измерения давления. ab не имеет этой функции.
2. Давление не может быть измерено. Основная причина в том, что ab может использовать только один процессор, только один процесс, а система ограничивает максимальное количество файлов, открываемых каждым процессом, до 1024, поэтому максимальное количество потоков равно 1024. Если это многоядерный процессор, эти ресурсы будут потрачены впустую.
3. Если промежуточный запрос отклонен сервером, отчет о тестировании является неполным, и ситуация стресс-теста завершенного запроса не может быть получена. Ниже приведен отчет, который был отклонен сервером на полпути, что очень недружелюбно:
This is ApacheBench, Version 2.3 <$Revision: 655654 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 100.125.176.120 (be patienCompleted 100 requests
Completed 200 requests
ComCompleted 300 requesComCompleted 400 requesComCompleted 500 requesapr_socket_recv: Connection timed out (110)
Total of 536 requests completed
ed

2. Практика работы с прибором для измерения давления

После обнаружения того, что недостатки AB не смогли удовлетворить текущие требования к тестированию давления, я проверил множество инструментов тестирования давления, и, наконец, обнаружил, что WRK, который также прост в использовании, не имеет недостатков вышеуказанного AB и использует Инструмент тестирования давления с немного более высокой стоимостью обучения. WRK может работать на одном или нескольких основных процессорах во время тестирования нагрузки. WRK объединяет многопоточные идеи дизайна, такие как EPOLL и KQUEUE, масштабируемая система уведомлений о событиях.

Введение в использование wrk

1. Установка

Стресс-тест выполняется на машине в тестовой среде.Поскольку машина в тестовой среде не может получить доступ к внешней сети, установить некоторые инструменты проблематично. Зачем переходить на машину тестовой среды? так как

1. 本机windows环境,安装同样比较麻烦
2. 压测现网服务有些是通过ip压测的,本机无法访问。
3. 测试环境机器性能比较高,并发请求量更大一些。

Шаги установки следующие

  1. Скачайте инсталляционный пакет на локальныйАдрес источника
  2. Пакет сжатия для локальной загрузки на компьютер тестовой среды
  3. Разархивируйте и скомпилируйте в тестовой среде.Если компиляция выдает ошибку, некоторые зависимые библиотеки отсутствуют, и устанавливайте по тем же шагам.

2. Описание основных параметров

-t --threads   开启的线程数,用于控制并发请求速度。最大值一般是cpu总核心数的2-4倍
-c --conections 保持的连接数(会话数)
-d --duration 压测持续时间(s)
-s --script 加载lua脚本(post请求写一些参数到脚本里)
-H --header 在请求头部添加一些参数
--latency 压测报告输出请求回包花费时间分布
--timeout 请求的最大超时时间(s),这个很有用

простой пример wrk -t4 -c1000 -d30s -T30s --задержкаwww.baidu.comПриведенная выше команда означает использование 4 потоков для имитации 1000 одновременных соединений, весь тест длится 30 секунд, время ожидания соединения составляет 30 секунд, и выводится статистика задержки запроса.

Написать скрипт для пакетного нагрузочного тестирования интерфейсов (одновременное нагрузочное тестирование нескольких интерфейсов)

1. Напишите луа-скрипт Поскольку для интерфейса требуются параметры формата json, сначала напишите сценарий lua, добавьте параметры json в сценарий lua, ff0e_05.lua выглядит следующим образом.

request = function()
    local headers = { }
    headers['Content-Type'] = "application/json"
    body = '{"uin":"123","lang":"en"}'
    return wrk.format('POST', nil, headers, body)
end
  1. Напишите сценарий теста на стресс Простое тестовое тестовое тестовое сценарию партии .SH:
#!/bin/sh

RESULT_DIR="/data/home/yawenxu/wrkTestResult/"
luaFileArr="ff0e_00.lua ff0e_02.lua ff0e_05.lua ff0e_06.lua ff0e_07.lua ff0e_08.lua ff0e_10.lua ff0e_11.lua" # 每个接口post需要的json参数的lua文件
concurrency=${1-1} #开启线程数,用于控制速度
count=${2-1}  #保持连接数
continueTime=${3-1}  # 持续时间
input_file_name=$4
exec_single_wrk(){
        if [ -f $1 ];then
                ./wrk -t $2 -c $3 -d $continueTime --script=$1 --latency --timeout 10 "http://$4" >$RESULT_DIR$1$3"_nginx.txt" 2>&1 &
        else
                echo $1" is not exists"
        fi
}

exec_loop_wrk(){
        for item_name in $luaFileArr
        do
                exec_single_wrk $item_name $concurrency $count "http://api.com/xxx" &
        done
}

if [ -f $input_file_name ];then
        exec_single_wrk $input_file_name $concurrency $count &
else
        exec_loop_wrk &
fi

Этот сценарий обеспечивает одновременное стресс-тестирование нескольких интерфейсов и сохраняет отчет о стресс-тестировании каждого интерфейса в файл для удобства анализа. Выполните команду sh test.sh 12 5000 10, чтобы сгенерировать файлы отчета о проверке давления для всех интерфейсов одновременно.Один из отчетов о проверке давления выглядит следующим образом:

Running 10s test @ http://api.com/xxx
  12 threads and 5000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.27s   386.53ms   1.99s    59.87%
    Req/Sec    53.85     75.74   777.00     93.91%
  Latency Distribution
     50%    1.26s
     75%    1.61s
     90%    1.80s
     99%    1.97s
  3641 requests in 10.10s, 1.88MB read
  Socket errors: connect 0, read 0, write 0, timeout 2146
Requests/sec:    360.51
Transfer/sec:    190.82KB

Глядя на приведенный выше отчет, можно увидеть, что количество поддерживаемых соединений составляет 5000, непрерывный стресс-тест составляет 10 с, а время ожидания составляет 10 с.В этом случае тайм-аут интерфейса особенно серьезен.Общее количество запросов 3641, а количество тайм-аутов равно 2146. Однако, глядя на распределение задержки, обнаруживается, что 99% запросов Пакет возвращается в течение 1,97 с. В это время необходимо учитывать возможность пересылки nginx Уровень доступа относительно низкий. Таким образом, мы можем стресс-тестировать конкретный IP-адрес нашего сервиса, не проходя через уровень доступа nginx. В конце концов, стресс-тест показал, что действительно есть узкое место оценки в переадресации трафика nginx, поэтому мы можем принять меры для расширения nginx.

При выполнении стресс-теста скрипта вам необходимо проверить загрузку ЦП и системную загрузку работающей сетевой службы в режиме реального времени и обнаружить, что загрузка и загрузка ЦП значительно возросли. Команда: top -d 1, вы можете обратиться кАнализ производительности процессора с помощью графиков Perf и Flame

краткое изложение проблемы

  1. Стресс-тест не может быть выполнен на одном интерфейсе, необходимо смоделировать реальную ситуацию и одновременно протестировать множество интерфейсов, которые фактически запрашиваются одновременно, чтобы найти системные проблемы.
  2. При измерении давления необходимо учитывать множество факторов.
1. 压测所用机器的性能,每秒发出的请求数能不能达到预估值
2. 压测工具每秒发出的请求数能不能达到预估值,以及能不能持续压测。
3. 压测现网服务,需要考虑到依赖的其他服务,比如接入层(nginx)自身的处理能力,可以对接入层做压测。
4. 压测的时候需要实时查看现网服务的cpu使用率和系统负载情况,这个可以发现编码上的bug。

Если вы считаете, что эта статья полезна или вдохновляет вас, вы также можете прийти и пригласить меня на кофе. Интересы: Все программное обеспечение, задействованное в этой статье, является инструментами, которые автор использует ежедневно, без какой-либо платы за рекламу.