简介
wrk 是一个HTTP压力测试工具,根据官方的介绍,他有2个明显的特点:
-
集成了多线程设计与事件通知系统(如 epoll、kqueue)提升并发量
-
可以通过编写 Lua 脚本来进行扩展,例如 HTTP请求的生成、响应处理、自定义报告 ……
使用示例
安装
wrk 可以工作在 Linux 或 Mac
项目地址:
https://github.com/wg/wrk
下载后进入项目目录,执行:
make
编译完成后,在当前目录中生成一个 wrk
可执行文件
运行
执行测试命令:
./wrk -t12 -c100 -d10s http://www.baidu.com
意思是对 baidu.com 进行测试,启动 12 个线程,100 个并发,持续运行 10 秒。
建议线程数不要过多,可以设置为核数的2到4倍
输出:
Requests/sec
就是最基本的指标:每秒处理的请求数
Thread Stats
是线程执行情况,包括延迟、每秒处理个数,其中的 Avg
和 Max
很好理解,是平均值和最大值,Stdev
是标准差。
标准差 表示样本数据的离散程度。
例如两组数据 {0,5,9,14} 和 {5,6,8,9},平均值都是 7,但第二个具有较小的标准差,说明更加稳定。
所以,如果多次测试结果中的 Stdev 差距较大,说明有可能系统性能波动很大。
+/- Stdev
这个正负标准差的含义不是很理解,请明白的朋友留言指点。
结合脚本
通过脚本,可以方便的进行自定义功能的开发,例如 提交POST数据、所有请求执行完成后自定义统计结果、对多个URL进行复合测试 ……
wrk 项目中的 scripts 目录下有多个脚本示例,例如 post.lua,设置post请求,代码:
-- example HTTP POST script which demonstrates setting the
-- HTTP method, body, and adding a header
wrk.method = "POST"
wrk.body = "foo=bar&baz=quux"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
执行 wrk 命令时使用 -s参数来加载脚本
./wrk -t12 -c100 -d10s --script=post.lua http://www.baidu.com
wrk 提供的几个hook函数:
-
setup
所有 thread 生成之后,在被被调用前,每个线程执行一次这个函数
-
init
每次请求发送之前调用
-
delay
请求之间的延迟时间
-
request
可以在每次请求之前修改request的属性
-
response
对每次的响应信息进行处理
-
done
所有请求执行完成后调用