高性能压测工具wrk
背景
最近为了做一个实验,研究对比了几个压测工具,最终选择了wrk;实验是为了验证nginx服务器“location直接转到本地静态文件”和“做一次proxy_pass”的性能有多大区别;刚开始计划使用loadrunner来完成,由于实验需要多次打压(分别验证response body不同大小时的响应情况),使用loadrunner有几个问题:1、每次实验要打到预期压力需要很长的时间,因为需要通过windows客户端进行测试数据配置、脚本修改等、打压机连接等一系列操作;2、 虽然loadrunner的发压agent没有源码,但感觉像是多进程+多线程来发压,所以感觉发压机cpu内存还没有吃满,压力就上不去了,这样想要达到很大的发压量就必须配置更多的发压机来完成测试;
wrk介绍1、github上的开源项目,安装非常简单;
2、使用简单,结果统计清晰;
3、效率特别高,10s内能达到十万级的qps请求量
4、可使用lua脚本进行扩展;使用Lua脚本个性化wrk压测
之前自己总结了一下,google的时候发现了一个总结的特别好的,直接粘过来:
介绍wrk对Lua脚本的支持
wrk支持在三个阶段对压测进行个性化,分别是启动阶段、运行阶段和结束阶段。每个测试线程,都拥有独立的Lua运行环境。
启动阶段
function setup(thread)
在脚本文件中实现setup方法,wrk就会在测试线程已经初始化但还没有启动的时候调用该方法。wrk会为每一个测试线程调用一次setup方法,并传入代表测试线程的对象thread作为参数。setup方法中可操作该thread对象,获取信息、存储信息、甚至关闭该线程。
运行阶段
init由测试线程调用,只会在进入运行阶段时,调用一次。支持从启动wrk的命令中,获取命令行参数; delay在每次发送request之前调用,如果需要delay,那么delay相应时间; request用来生成请求;每一次请求都会调用该方法,所以注意不要在该方法中做耗时的操作; reponse在每次收到一个响应时调用;为提升性能,如果没有定义该方法,那么wrk不会解析headers和body;
结束阶段
该方法在整个测试过程中只会调用一次,可从参数给定的对象中,获取压测结果,生成定制化的测试报告。
自定义脚本中可访问的变量和方法
变量:wrk
一个table类型的变量wrk,是全局变量,修改该table,会影响所有请求。
示例
使用POST METHOD
通过修改全局变量wrk,使得所有请求都使用POST方法,并指定了body和Content-Type头。
为每次request更换一个参数
通过在request方法中随机生成1~10000000之间的uid,使得请求中的uid参数随机。
每次请求之前延迟10ms
每个线程要先进行认证,认证之后获取token以进行压测
在没有token的情况下,先访问/authenticate认证。认证成功后,读取token并替换path为/resource。
- 大爷在街边卖这种小吃, 制作工具很传统, 也很美味 家乡的美食
- 别买电动车了!这或许就是未来2年的交通工具,太震撼了,大开眼
- 不买思域,10来万还可以买这4款高性能轿车!
- 投资人应该如何利用好复利这一工具
- 五金新手:这些液压工具你知道么
- 未来人类通过第九维空间来到现在, 飞碟是他们的交通工具
- 当心脏感到压迫时,这些“正常”的血压测试值可能会欺骗你!
- 吃濑尿虾不伤手的方法, 只要这一个工具就可以
- 高端不一定高价 这些高性能全面屏手机全都不超2000元
- ESO甚大望远镜借助ESPRESSO工具成为单独的巨型望远镜