- init(args): 由测试线程调用,只会在进入运行阶段时,调用一次 。支持从启动 wrk 的命令中,获取命令行参数;
- delay(): 在每次发送请求之前调用,如果需要定制延迟时间,可以在这个方法中设置;
- request(): 用来生成请求, 每一次请求都会调用该方法,所以注意不要在该方法中做耗时的操作;
- response(status, headers, body): 在每次收到一个响应时被调用,为提升性能,如果没有定义该方法,那么wrk不会解析 headers 和 body;
function done(summary, latency, requests)
done() 方法在整个测试过程中只会被调用一次,我们可以从给定的参数中,获取压测结果,生成定制化的测试报告 。自定义 Lua 脚本中可访问的变量以及方法:
变量:wrk
wrk = {scheme= "http",host= "localhost",port= 8080,method= "GET",path= "/",headers = {},body= nil,thread= <userdata>,}
以上定义了一个 table 类型的全局变量,修改该 wrk 变量,会影响所有请求 。方法:
- wrk.fomat
- wrk.lookup
- wrk.connect
function wrk.format(method, path, headers, body)wrk.format returns a HTTP request string containing the passed parametersmerged with values from the wrk table.# 根据参数和全局变量 wrk,生成一个 HTTP rquest 字符串 。function wrk.lookup(host, service)wrk.lookup returns a table containing all known addresses for the hostand service pair. This corresponds to the POSIX getaddrinfo() function.# 给定 host 和 service(port/well known service name),返回所有可用的服务器地址信息 。function wrk.connect(addr)wrk.connect returns true if the address can be connected to, otherwiseit returns false. The address must be one returned from wrk.lookup().# 测试给定的服务器地址信息是否可以成功创建连接
4.4.1 通过 Lua 脚本压测示例调用 POST 接口:wrk.method = "POST"wrk.body= "foo=bar&baz=quux"wrk.headers["Content-Type"] = "Application/x-www-form-urlencoded"
注意: wrk 是个全局变量,这里对其做了修改,使得所有请求都使用 POST 的方式,并指定了 body 和 Content-Type头 。自定义每次请求的参数:
request = function()uid = math.random(1, 10000000)path = "/test?uid=" .. uidreturn wrk.format(nil, path)end
在 request 方法中,随机生成 1~10000000 之间的 uid,并动态生成请求 URL.每次请求前,延迟 10ms:
function delay()return 10end
请求的接口需要先进行认证,获取 token 后,才能发起请求,咋办?token = nilpath= "/auth"request = function()return wrk.format("GET", path)endresponse = function(status, headers, body)if not token and status == 200 thentoken = headers["X-Token"]path= "/test"wrk.headers["X-Token"] = tokenendend
上面的脚本表示,在 token 为空的情况下,先请求 /auth 接口来认证,获取 token, 拿到 token 以后,将 token 放置到请求头中,再请求真正需要压测的 /test 接口 。压测支持 HTTP pipeline 的服务:
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)endrequest = function()return reqend
通过在 init 方法中将三个 HTTP请求拼接在一起,实现每次发送三个请求,以使用 HTTP pipeline 。五、总结本文中,我们学习了轻量级性能测试工具 wrk, 如何安装,以及具体的使用方法,包括通过 Lua 脚本来个性化定制请求等 。希望读完本文,能对您有所帮助哦!
六、参考文档:
- https://github.com/wg/wrk
- https://zjumty.iteye.com/blog/2221040
- http://www.cnblogs.com/xinzhao/p/6233009.html
【性能测试工具 wrk 使用教程】
推荐阅读
- Nginx+Tomcat搭建高性能负载均衡集群
- 高并发性能测试,it人员必备技能
- Mysql性能优化之逐级优化,开发人员必备技巧
- 数据库读写分离方案,实现高性能数据库集群
- Jmeter分布式部署测试做压力性能测试
- 推荐给专业人士10个渗透测试工具
- 沃尔沃为何号称全球最安全 沃尔沃汽车安全性能是全球最好的汽车?
- PING命令详解,端到端的延时测试工具
- 5个Linux服务器一键综合测试性能和配置脚本工具
- MySql,Mssql,Oracle三种数据库性能优缺点