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

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


↙↙↙阅读原文可查看相关链接,并与作者交流