以上使用8个线程200个连接,对bing首页进行了30秒的压测,并要求在压测结果中输出响应延迟信息。以下对压测结果进行简单注释:
代码登录后可见
可以看到,wrk使用方便,结果清晰。并且因为非阻塞IO的使用,可以在普通的测试机上创建出大量的连接,从而达到较好的压测效果。
使用Lua脚本个性化wrk压测
以上两节安装并简单使用了wrk,但这种简单的压测可能不能满足我们的需求。比如我们可能需要使用POST METHOD跟服务器交互;可能需要为每一次请求使用不同的参数,以更好的模拟服务的实际使用场景等。wrk支持用户使用–script指定Lua脚本,来定制压测过程,满足个性化需求。
- 介绍wrk对Lua脚本的支持
wrk支持在三个阶段对压测进行个性化,分别是启动阶段、运行阶段和结束阶段。每个测试线程,都拥有独立的Lua运行环境。
启动阶段
代码登录后可见
在脚本文件中实现setup方法,wrk就会在测试线程已经初始化但还没有启动的时候调用该方法。wrk会为每一个测试线程调用一次setup方法,并传入代表测试线程的对象thread作为参数。setup方法中可操作该thread对象,获取信息、存储信息、甚至关闭该线程。
代码登录后可见
运行阶段
代码登录后可见
init由测试线程调用,只会在进入运行阶段时,调用一次。支持从启动wrk的命令中,获取命令行参数;
delay在每次发送request之前调用,如果需要delay,那么delay相应时间;
request用来生成请求;每一次请求都会调用该方法,所以注意不要在该方法中做耗时的操作;
reponse在每次收到一个响应时调用;为提升性能,如果没有定义该方法,那么wrk不会解析headers和body;
结束阶段
代码登录后可见
该方法在整个测试过程中只会调用一次,可从参数给定的对象中,获取压测结果,生成定制化的测试报告。
自定义脚本中可访问的变量和方法
变量:wrk
代码登录后可见
一个table类型的变量wrk,是全局变量,修改该table,会影响所有请求。
方法:wrk.fomat wrk.lookup wrk.connect
代码登录后可见
- 示例
使用POST METHOD
代码登录后可见
通过修改全局变量wrk,使得所有请求都使用POST方法,并指定了body和Content-Type头。
为每次request更换一个参数
代码登录后可见
通过在request方法中随机生成1~10000000之间的uid,使得请求中的uid参数随机。
每次请求之前延迟10ms
代码登录后可见
每个线程要先进行认证,认证之后获取token以进行压测
代码登录后可见
在没有token的情况下,先访问/authenticate认证。认证成功后,读取token并替换path为/resource。
压测支持HTTP pipeline的服务
代码登录后可见
通过在init方法中将三个HTTP request请求拼接在一起,实现每次发送三个请求,以使用HTTP pipeline。