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

hutong · 2018年08月23日 · 最后由 arrow 回复于 2018年08月27日 · 最后更新自管理员 kasi · 1110 次阅读

记得很清楚,刚开始工作的时候要对一个网页进行压测用的是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 就要格外谨慎了。

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

共收到 6 条回复 时间 点赞

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

能对比下ab和http_load啊

BensonMax 回复

用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 问题。

keithmork 回复

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

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册