简介
wrk 是针对 HTTP(HTTPS) 协议的轻量级性能测试工具,wrk的优点是支持多线程,通过多线程和事件模式,对目标机器产生大量的负载。
wrk 的劣势是目前仅支持单机压测,后续也不太可能支持多机器对目标机压测,因为它本身的定位,并不是用来取代 JMeter, LoadRunner 等专业的测试工具,wrk 提供的功能,对我们后端开发人员来说,应付日常接口性能验证还是比较友好的。
wrk安装简单、轻量,还可以配合lua脚本定制测试过程,灵活性高。
压测术语说明
1. 吞吐率QPS
概念:服务器并发处理能力的量化描述,单位是reqs/s,指的是某个并发用户数下单位时间内处理的请求数。某个并发用户数下单位时间内能处理的最大请求数,称之为最大吞吐率。 计算公式:总请求数 / 处理完成这些请求数所花费的时间,即 Request per second = Complete requests / Time taken for tests
2. 并发连接数
概念:某个时刻服务器所接受的请求数目
安装wrk
本次测试环境为linux环境,通过github下载wrk安装包很慢,这里下载本地文件再上传进行安装;
解压wrk文件,解压成功后,目录下就会有一个wrk文件夹;进入到该文件夹后make。
编译成功后,目录下会有wrk可执行文件;
$ ./wrk --help
如果编译过程中,出现如下错误:
若报错gcc: Command not found,则需安装gcc,参考wrk编译报错gcc: Command not found
若报错fatal error: openssl/ssl.h: No such file or directory,则需要安装openssl的库。
wrk参数说明
-c --conections 保持的连接数(会话数),连接数需要在测试过程中多次调试,找到QPS达到最大临界点的最大并发量;由于服务器有自身的负载极限,也会出现连接数越大QPS越低的情况,这种情况是因为连接数设置的过高,导致待测系统超出自身能承受的负载。
-d --duration 压测持续时间(s)
-t --threads 开启的线程数,用于控制并发请求速度。最大值一般是cpu总核心数的2-4倍
-s --script 加载lua脚本(post请求写一些参数到脚本里)
-H --header 在请求头部添加一些参数
--latency 压测报告输出请求回包花费时间分布
--timeout 请求的最大超时时间(s),这个很有用
实践两个接口同时压测
1、编写lua脚本,因为接口需要json格式参数,所以首先编写lua脚本,在lua脚本里添加json参数 remain01.lua如下
request = function()
local path ="/api/report/remain_ip_inner/"
local headers = { }
headers['Content-Type'] = "application/json"
headers["platformId"] = "41f64827f25f468595ffa3a5deb5d15d"
headers["resourceType"] = "ip"
return wrk.format('GET', path, headers, nil)
--根据参数和全局变量wrk生成一个http请求函数签名:
--wrk.format(method, path, headers, body)
end
remain02.lua如下
request = function()
local path ="/api/report/remain_ip/"
local headers = { }
headers['Content-Type'] = "application/json"
headers["platformId"] = "41f64827f25f468595ffa3a5deb5d15d"
headers["resourceType"] = "ip"
return wrk.format('GET', path, headers, nil)
--根据参数和全局变量wrk生成一个http请求函数签名:
--wrk.format(method, path, headers, body)
end
2、编写一个简单的批量压测脚本get_remain.sh:
#!/bin/env/sh
resultDir="./wrkResult/"
luaFile="remain01.lua remain02.lua" # 每个接口lua文件
thread=${1-64} #开启线程数默认64
concurrency=${2-64} #并发连接数默认64
continueTime=${3-10} # 持续时间默认10秒
exec_single_wrk(){
if [ -f $1 ];then
./wrk -t ${thread} -c ${concurrency} -d ${continueTime} --script=$1 --latency "h t t p ://$4" > ${resultDir}$1$3".txt" 2>&1 &
else
echo $1" is not exists"
fi
}
exec_loop_wrk(){
for item_name in $luaFile
do
exec_single_wrk ${item_name} ${thread} ${concurrency} "api.com/xxx" &
done
}
exec_loop_wrk &
3、执行命令for i in {64..100} ;do sh get_remain.sh 64 $i 10;done
多个接口同时压测,同时将每个接口的压测报告保存到文件里便于分析。压测结果示例如下:
压测时模拟实际情况,对实际有同时请求的很多接口同时压测,并且压测还需要考虑cpu使用率和系统负载情况等多方面因素。