| Введение Ежедневные операции и действия будут приносить большое количество запросов. Чтобы оценить, может ли текущая система поддерживать предполагаемое количество запросов, проводятся стресс-тесты на интерфейсах с большим количеством посещений. Как правило, несколько раундов стресс-тестов Это проверка скрытых ошибок системы и поиск точек, которые можно оптимизировать, затем оценка текущей нагрузки системы по результатам опрессовки, а затем подготовка к расширению и другим работам, чтобы система могла поддерживать операционная деятельность стабильно и надежно.
Терминология измерения напряжения Описание
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. 测试环境机器性能比较高,并发请求量更大一些。
Шаги установки следующие
- Скачайте инсталляционный пакет на локальныйАдрес источника
- Пакет сжатия для локальной загрузки на компьютер тестовой среды
- Разархивируйте и скомпилируйте в тестовой среде.Если компиляция выдает ошибку, некоторые зависимые библиотеки отсутствуют, и устанавливайте по тем же шагам.
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
- Напишите сценарий теста на стресс Простое тестовое тестовое тестовое сценарию партии .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. 压测工具每秒发出的请求数能不能达到预估值,以及能不能持续压测。
3. 压测现网服务,需要考虑到依赖的其他服务,比如接入层(nginx)自身的处理能力,可以对接入层做压测。
4. 压测的时候需要实时查看现网服务的cpu使用率和系统负载情况,这个可以发现编码上的bug。
Если вы считаете, что эта статья полезна или вдохновляет вас, вы также можете прийти и пригласить меня на кофе. Интересы: Все программное обеспечение, задействованное в этой статье, является инструментами, которые автор использует ежедневно, без какой-либо платы за рекламу.