介绍
官方解释 wrk is a modern HTTP benchmarking tool capable of generating significant load when run on a single multi-core CPU. It combines a multithreaded design with scalable event notification systems such as epoll and kqueue.
它结合了多线程以及类似epoll、kqueue的多事件模式,可以在单机多核CPU的条件下构造大量的负载。
工具 | 优点 | 劣点 |
wrk | wrk的优势从我这段时间的一个接口压测来看,主要有以下几点:
|
wrk的劣势主要是目前支持单机压测,即不支持多机器对目标的压测,即每次压测的机器地址很难去改变,可以改变压测的接口地址,但是压测的机器地址变不了 |
安装
git clone https://gitee.com/mirrors/wrk.git
参数
-c, --connections <N> Connections to keep open,需要模拟的连接数
-d, --duration <T> Duration of test,测试的持续时间
-t, --threads <N> Number of threads to use,需要模拟的线程数
-s, --script <S> Load Lua script file,lua脚本,使用方法往下看
-H, --header <H> Add header to request,添加http header, 比如. “User-Agent: wrk”
--latency Print latency statistics,显示延迟统计
--timeout, -T: <T> Socket/request timeout,超时的时间
-v, --version Print version details
例子
wrk -c 10000 -t 100 http://127.0.0.1:80/test -d 20s -T2 --latency
Running 20s test @ http://127.0.0.1/test
100 threads and 10000 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 146.36ms 253.95ms 2.00s 88.39%
Req/Sec 1.24k 298.79 3.61k 69.12%
Latency Distribution
50% 34.30ms
75% 176.93ms
90% 459.42ms
99% 1.16s
2484504 requests in 20.10s, 781.90MB read
Socket errors: connect 0, read 0, write 0, timeout 9316
Requests/sec: 123612.53
Transfer/sec: 38.90MB
借助lua脚本进行复杂测试
wrk默认是采用GET请求方式进行接口测试,如果需要使用POST请求就需要使用到lua脚本,通过加载编写好的lua脚本来进行定制化的请求。采用-s 或者 --script
可以加载脚本文件。
-
单纯的利用POST提交方法
-- 全局设定
wrk.method = "POST"
wrk.body = "name=zhangsan&password=123456"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
或者可以采用以下的方式:
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
request = function()
method = "POST"
body = "name=zhangsan&password=123456"
path = "/user/login" return wrk.format(method,path,nil,body)
end
-
自定义请求和参数
要求每一次的参数不同如何处理
request = function()
uid = math.random(1,1000000)
path = "/login?uid"..uid return wrk.formate(nil,path,nil,nil)
end
-
设置延迟
function
delay()
return 10 -- 表示设置10ms的延迟 end
-
先登录后请求
这个地方是为了对一些需要先登录获取token,后续的请求都需要携带token请求的接口进行测试的,参照官方给出的lua脚本案例:auth.lua文章来源:https://www.toymoban.com/news/detail-722311.html
-- example script that demonstrates response handling and
-- retrieving an authentication token to set on all future
-- requests
token = nil
path = "/authenticate" -- 初始的请求url
request = function()
return wrk.format("GET", path) -- 发送第一次authenticate认证请求
end
response = function(status, headers, body)
if not token and status == 200 then
token = headers["X-Token"]
path = "/resource" -- 拿到之后做修改
wrk.headers["X-Token"] = token -- 修改头,携带token进入后续的请求
end
end
-
pipeline请求
即一次发送多个请求,参照官方给出的pipeline.lua文章来源地址https://www.toymoban.com/news/detail-722311.html
-- example script demonstrating HTTP pipelining
init = function(args)
local r = {}
r[1] = wrk.format(nil, "/?foo")
r[2] = wrk.format(nil, "/?bar")
r[3] = wrk.format(nil, "/?baz")
req = table.concat(r)
end
request = function()
return req
end
到了这里,关于wrk HTTP打流测试工具的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!