高性能压测工具wrk

背景

最近为了做一个实验,研究对比了几个压测工具,最终选择了wrk;实验是为了验证nginx服务器“location直接转到本地静态文件”和“做一次proxy_pass”的性能有多大区别;刚开始计划使用loadrunner来完成,由于实验需要多次打压(分别验证response body不同大小时的响应情况),使用loadrunner有几个问题:1、每次实验要打到预期压力需要很长的时间,因为需要通过windows客户端进行测试数据配置、脚本修改等、打压机连接等一系列操作;2、 虽然loadrunner的发压agent没有源码,但感觉像是多进程+多线程来发压,所以感觉发压机cpu内存还没有吃满,压力就上不去了,这样想要达到很大的发压量就必须配置更多的发压机来完成测试;

wrk介绍

1、github上的开源项目,安装非常简单;

 



2、使用简单,结果统计清晰;

高性能压测工具wrk

3、效率特别高,10s内能达到十万级的qps请求量

 



4、可使用lua脚本进行扩展;

使用Lua脚本个性化wrk压测

之前自己总结了一下,google的时候发现了一个总结的特别好的,直接粘过来:

 



介绍wrk对Lua脚本的支持

 



wrk支持在三个阶段对压测进行个性化,分别是启动阶段、运行阶段和结束阶段。每个测试线程,都拥有独立的Lua运行环境。

  • 启动阶段

  • function setup(thread)

     



    在脚本文件中实现setup方法,wrk就会在测试线程已经初始化但还没有启动的时候调用该方法。wrk会为每一个测试线程调用一次setup方法,并传入代表测试线程的对象thread作为参数。setup方法中可操作该thread对象,获取信息、存储信息、甚至关闭该线程。

    高性能压测工具wrk

  • 运行阶段

  • 高性能压测工具wrk

    init由测试线程调用,只会在进入运行阶段时,调用一次。支持从启动wrk的命令中,获取命令行参数; delay在每次发送request之前调用,如果需要delay,那么delay相应时间; request用来生成请求;每一次请求都会调用该方法,所以注意不要在该方法中做耗时的操作; reponse在每次收到一个响应时调用;为提升性能,如果没有定义该方法,那么wrk不会解析headers和body;

  • 结束阶段

  • 高性能压测工具wrk

    该方法在整个测试过程中只会调用一次,可从参数给定的对象中,获取压测结果,生成定制化的测试报告。

  • 自定义脚本中可访问的变量和方法

     



    变量:wrk

  • 高性能压测工具wrk

    一个table类型的变量wrk,是全局变量,修改该table,会影响所有请求。

    高性能压测工具wrk

    示例

     



    使用POST METHOD

    高性能压测工具wrk

    通过修改全局变量wrk,使得所有请求都使用POST方法,并指定了body和Content-Type头。

    为每次request更换一个参数

    高性能压测工具wrk

    通过在request方法中随机生成1~10000000之间的uid,使得请求中的uid参数随机。

    每次请求之前延迟10ms

    高性能压测工具wrk

    每个线程要先进行认证,认证之后获取token以进行压测

    高性能压测工具wrk

    在没有token的情况下,先访问/authenticate认证。认证成功后,读取token并替换path为/resource。