wrk 是一个高效的压测工具,最近需要对做的服务进行压测,记录下使用过程

安装:

1、绝大多说的UNIX系统都支持wrk, 需要操作系统支持 lua 和 openSSL, (基本上linux系统都支持)

2、直接


git clone https://github.com/wg/wrk
      make



3、完成之后会在项目目录下生成可执行文件wrk, 后续就可以进行http压测了

简单使用

1、执行下wrk ,可以看到帮助信息




lua插件idea lua插件 延迟测试 插件_全局变量


2、简单说明下参数


-c  和服务器保持的TCP连接数量
      -d  压测时间
      -t  使用多少个线程压测
      -s  指定的Lua脚本位置
      -H  为每个http请求增加http请求头
      --latency  压测结束后统计延时信息
      --timeout  设置超时时间


需要注意的是,

wrk使用的异步非阻塞io并非使用线程去模拟并发连接,因此不需要设置很多的线程,一般根据cpu的核数设置即可。

-c 的参数设置必须大于-t的参数值

-c 如果设置的太大,可能导致出现too many open files 的error。 可以查看下系统的配置


cat /porc/sys/fs/file-max


3、一个例子,简单压测下百度首页的信息


wrk -t4 -c100 -d30s --latency https://www.baidu.com/


这条命令的含义是,使用4个线程来模拟100个并发,整个压测持续30s,打印出延时统计信息. 结果如下:


lua插件idea lua插件 延迟测试 插件_全局变量_02


Socket errores 为 socket错误的数量
Requests/sec   为 每秒的请求数量,也就是并发能力
Latency        为 延迟情况及其分布


配合lua 使用

1、wrk的生命周期

对于一些动态构建的请求,例如:认证、校验、http请求参数化等,可以使用lua来复写wrk中的hook函数

调用lua分为下面三个阶段: setup、running、done


lua插件idea lua插件 延迟测试 插件_全局变量_03


每个阶段做的是事如下:


setup : 线程出事后会调用一次,每个线程只调用一次
 init  : 每次请求发送之前被调用,可以接受wrk命令行的额外参数
 delay : 这个函数返回一个数值,在这次请求执行完成后延迟多长时间可以进行下一个请求,对应thinking time场景
 request : 通过这个函数可以每次请求之前修改本次请求体和Header, 这里是我们最常使用的地方,可以在这里写一些要压测的逻辑
 response: 每次请求返回后可以针对响应内容做特殊处理,例如遇到特殊情况停止测试或输出到控制台上
 done:    可以用于自定义结果报表,整个过程中只执行一次


2、wrk的全局属性


wrk


这些全局变量可以直接拿到lua脚本中使用 是一个table类型的wrk,为全局变量,修改这个table会影响所有的请求。

3、wrk的全局方法


-- 生成整个request的string