性能测试工具 一把性能基线测试瑞士军刀,wrk 性能测试工具

大话性能 · August 23, 2018 · Last by 测试初妹 replied at March 16, 2019 · Last modified by admin 卡斯 · 2433 hits

记得很清楚,刚开始工作的时候要对一个网页进行压测用的是ab命令,Apache自带的,该命令基本上只能支持超级简单的页面压测。今天讲讲另一款更加瑞士军刀版的工具wrk。wrk是一款现代HTTP基准测试工具,能够在单个多核CPU上运行时产生显着负载。它将多线程设计与可扩展事件通知系统(如epoll和kqueue)结合在一起,这意味着我们可以用少量的线程来跟被测服务创建大量连接,进行压测,来一起实践一下。
更多工作实战好文,尽在公众号大话性能,敬请关注。
http://dwz.cn/ZXoyv528

1、安装部署

wrk支持大多数类UNIX系统,不支持windows,安装wrk非常简单。
首先只要从github上下载wrk源码;
git clone https://github.com/wg/wrk
然后执行make命令安装;
make之后,会在项目路径下生成可执行文件wrk,随后就可以用其进行HTTP压测了。

Ps: 可以把这个可执行文件拷贝到某个已在path中的路径,比如/usr/local/bin,这样就可以在任何路径直接使用wrk了。
我是在本机mac上安装的,wrk -v即可验证是否安装成功。

2、参数说明

Wrk使用中最常用的选项命令含义解释如下。
使用方法: wrk <选项> <被测HTTP服务的URL>

常用选项:
-c, --connections 跟服务器建立并保持的TCP连接数量
-d, --duration 压测时间
-t, --threads 使用多少个线程进行压测
-s, --script 指定Lua脚本路径
-H, --header 为每一个HTTP请求添加HTTP头
--latency 在压测结束后,打印延迟统计信息
--timeout 超时时间,默认1s

一般线程数不宜过多,核数的2到4倍足够了,多了反而因为线程切换过多造成效率降低,因为wrk不是使用每个连接一个线程的模型, 而是通过异步网络io提升并发量,所以网络通信不会阻塞线程执行,这也是wrk可以用很少的线程模拟大量网路连接的原因,而现在很多性能工具并没有采用这种方式, 而是采用提高线程数来实现高并发,所以并发量一旦设的很高, 测试机自身压力就很大,测试效果反而下降。

3、简单使用

Wrk最简单的使用如下,对www.baidu.com页面进行了简单压测,不带任何请求头,请求参数。


结果说明:
一般我们最关心的几个结果指标
1、Latency: 可以理解为响应时间分布。
2、Requests/Sec: 每秒的处理请求数,可以理解为tps。
3、连接超时数目timeout。

4、高级用法

而很多实际工作中,不可能像上面那么简单的压测,我们可能需要使用POST METHOD跟服务器交互;可能需要为每一次请求使用不同的参数,以更好的模拟服务的实际使用场景等。wrk支持用户使用--script指定Lua脚本,来定制压测过程,满足个性化需求。但是也不能完全替代其他压测工具进行特别复杂的场景设计,毕竟也只是瑞士军刀而已。

在lua脚本里你可以修改 method, header, body, 可以对 response 做一下自定义的分析。接下来就讲讲get请求和post请求里面如何动态化参数。

1、get请求,请求参数uid随机生成。结果如下,每次请求uid都是不一样的。


2、post请求,发送json的body,其中age字段动态变化。


现在 wrk 支持 lua 脚本,虽然这给了你的请求带来了无限的可能,但是这样一个强大的功能如果不谨慎使用, 会降低测试端的性能, 测试结果也受到影响。
一般修改method, header, body不会影响测试端性能, 但是操作 request, response 就要格外谨慎了。

大家可持续关注大话性能公众号,不断学习测试实战技能和高薪岗位内推。

共收到 7 条回复 时间 点赞

楼主有二次开发过wrk吗?缺点是验证不了返回,有实际应用的分享吗?

能对比下ab和http_load啊

回复

用lua脚本可以做简单的校验,一般很复杂的也不建议用wrk工具了,毕竟我觉得它擅长于简单的基线测试,类似于
response = function(status, headers, body)
if status == 200 then
token = headers["X-Token"]
path = "/resource"
wrk.headers["X-Token"] = token
end
end

arrow 回复

ab和http_load现在基本很少用了,建议你可以考虑用jimeter、locust,一款是基于java开源,一款是基于python开源,可扩展性强。
可以关注微信公众号大话性能哦。😀

arrow 回复

http_load 06年的过时东西了就别提了吧……

ab不推荐,content-length长度变了也当成错误,而且单线程是个瓶颈,用nginx-status页面做测试,客户端找台8核以上的服务器,跑一下就知道和wrk差距有多大了。

小工具推荐 wrk2,https://github.com/giltene/wrk2,是 wrk 的分支。推荐看看作者 Gil Tene 在 readme 里写的关于如何正确测量响应时间,推荐搜一下作者讲 coordinated omission(CO) 的 2 个youtube视频。

wrk 也可用,性能也更好些。建议跟 wrk2 对照,毕竟CO是个大坑,全世界绝大部分压测工具都掉坑里。

locust 不推荐,一是作者看上去不知道自己在做什么,二是框架性能和报告功能都极差,有这功夫填坑不如找个更正经的框架二次开发。

ngrinder 不推荐,往往是只做过demo的人才吹它的开箱即用。github上2年多没更新了,跟死了差不多。

taurus + jmeter组合现在很流行,算是可用,但小心CO问题。它的命令行报告生成的网页里,首页的响应时间百分位数统计不一定可靠,注意点开看菜单里的各种overtime图表。坑踩得少的人很容易用它骗自己接口的响应时间没问题。现在项目里已经基本抛弃它了。

愿意封装和写代码的话推荐 Gatling。动手封装前最好搜一下一篇貌似叫 close workload model vs open workload model 之类的论文,06年的。Gatling 要用 open workload model,也就是指定 RPS 然后它每秒新建这么多连接,才能避免 CO 问题。

Keith Mo 回复

我们现在都是用的JMeter做性能测试。
一下介绍了这么多工具,我去研究看看。
非常感谢你耐心的回复。

Keith Mo 回复

简直不要太好了。。谢谢

需要 Sign In 后方可回复, 如果你还没有账号请点击这里 Sign Up