wrk 是一个高效的压测工具,最近需要对做的服务进行压测,记录下使用过程
安装:
1、绝大多说的UNIX系统都支持wrk, 需要操作系统支持 lua 和 openSSL, (基本上linux系统都支持)
2、直接
git clone https://github.com/wg/wrk
make
3、完成之后会在项目目录下生成可执行文件wrk, 后续就可以进行http压测了
简单使用
1、执行下wrk ,可以看到帮助信息
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,打印出延时统计信息. 结果如下:
Socket errores 为 socket错误的数量
Requests/sec 为 每秒的请求数量,也就是并发能力
Latency 为 延迟情况及其分布
配合lua 使用
1、wrk的生命周期
对于一些动态构建的请求,例如:认证、校验、http请求参数化等,可以使用lua来复写wrk中的hook函数
调用lua分为下面三个阶段: setup、running、done
每个阶段做的是事如下:
setup : 线程出事后会调用一次,每个线程只调用一次
init : 每次请求发送之前被调用,可以接受wrk命令行的额外参数
delay : 这个函数返回一个数值,在这次请求执行完成后延迟多长时间可以进行下一个请求,对应thinking time场景
request : 通过这个函数可以每次请求之前修改本次请求体和Header, 这里是我们最常使用的地方,可以在这里写一些要压测的逻辑
response: 每次请求返回后可以针对响应内容做特殊处理,例如遇到特殊情况停止测试或输出到控制台上
done: 可以用于自定义结果报表,整个过程中只执行一次
2、wrk的全局属性
wrk
这些全局变量可以直接拿到lua脚本中使用 是一个table类型的wrk,为全局变量,修改这个table会影响所有的请求。
3、wrk的全局方法
-- 生成整个request的string