wrk — 小巧轻盈的 http 性能测试工具

发表于:2016-05-31来源:翱翔 Beta作者:欣雨小筑点击数: 标签:性能测试工具
测试先行是软件系统质量保证的有效手段. 在单元测试方面, 我们有非常成熟的 xUnit 方案. 在集成测试方面, 我们 selenium 等自动化方案. 在性能测试方面也有很多成熟的工具, 比如 Load

  测试先行是软件系统质量保证的有效手段. 在单元测试方面, 我们有非常成熟的 xUnit 方案. 在集成测试方面, 我们 selenium 等自动化方案. 在性能测试方面也有很多成熟的工具, 比如 LoadRunner, Jmeter 等. 但是很多工具都是给专门的性能测试人员使用的, 功能虽然强大, 但是安装和操作不太方便. 作为开发人员, 我们有些时候想快速验证我们的解决方案是不是存在性能问题, 或者在并发情况下是否有意想不到的问题. 安装 LoadRunner 这样工具, 录制脚本很麻烦, 用起来就像在用大炮打蚊子.

  wrk 是一个很简单的 http 性能测试工具. 也可以叫做 http benchmark 工具. 只有一个命令行, 就能做很多基本的 http 性能测试.

  wrk 的开源的, 代码在 github 上. https://github.com/wg/wrk

  首先要说的一点是: wrk 只能运行在 Unix 类的系统上. 比如 linux, mac, solaris 等. 也只能在这些系统上编译.

  这里不得不说一下, 为什么很多人说 mac 是最好的开发环境. 不是因为使用 mac 逼格有多高. 而是你可以同时得到 windows 和 linux 的好处. 多数 linux 下的开发工具都可以在 mac 上使用. 很多都是预编译好的, 有些只需要编译一下就能用.

  wrk 的一个很好的特性就是能用很少的线程压出很大的并发量. 原因是它使用了一些操作系统特定的高性能 io 机制, 比如 select, epoll, kqueue 等. 其实它是复用了 redis 的 ae 异步事件驱动框架. 确切的说 ae 事件驱动框架并不是 redis 发明的, 它来至于 Tcl的解释器 jim, 这个小巧高效的框架, 因为被 redis 采用而更多的被大家所熟知.

  要用 wrk, 首先要编译 wrk.你的机器上需要已经安装了 git 和基本的c编译环境. wrk 本身是用 c 写的. 代码很少. 并且没有使用很多第三方库. 所以编译基本不会遇到什么问题.

  gitclone https://github.com/wg/wrk.git

  cdwrk

  make

  就 ok了.make 成功以后在目录下有一个 wrk 文件. 就是它了. 你可以把这个文件复制到其他目录, 比如 bin 目录. 或者就这个目录下执行.

  如果编译过程中出现:

  src/wrk.h:11:25: fatalerror: openssl/ssl.h: Nosuchfileor directory

  #include

  是因为系统中没有安装openssl的库.

  sudo apt-get install libssl-dev

  或

  sudo yum install openssl-devel

  我们先来做一个简单的性能测试:

  wrk -t12 -c100 -d30shttp://www.baidu.com

  30秒钟结束以后可以看到如下输出:

  Running 30s test @ http://www.baidu.com

  12 threadsand 100 connections

  ThreadStats Avg Stdev Max +/- Stdev

  Latency 538.64ms 368.66ms 1.99s 77.33%

  Req/Sec 15.62 10.28 80.00 75.35%

  5073 requestsin 30.09s, 75.28MB read

  Socketerrors: connect 0, read 5, write 0, timeout 64

  Requests/sec: 168.59

  Transfer/sec: 2.50MB

  先解释一下输出:

  12 threads and 100 connections

  这个能看懂英文的都知道啥意思: 用12个线程模拟100个连接.

  对应的参数 -t 和 -c 可以控制这两个参数.

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

  下面是线程统计:

  ThreadStats Avg Stdev Max +/- Stdev

  Latency 538.64ms 368.66ms 1.99s 77.33%

  Req/Sec 15.62 10.28 80.00 75.35%

  Latency: 可以理解为响应时间, 有平均值, 标准偏差, 最大值, 正负一个标准差占比.Req/Sec: 每个线程每秒钟的完成的请求数, 同样有平均值, 标准偏差, 最大值, 正负一个标准差占比.

  一般我们来说我们主要关注平均值和最大值. 标准差如果太大说明样本本身离散程度比较高. 有可能系统性能波动很大.

  接下来:

  5073 requestsin 30.09s, 75.28MB read

  Socketerrors: connect 0, read 5, write 0, timeout 64

  Requests/sec: 168.59

  Transfer/sec: 2.50MB

  30秒钟总共完成请求数和读取数据量.

  然后是错误统计, 上面的统计可以看到, 5个读错误, 64个超时.

原文转自: https://blog.satikey.com/p/5768/wrk-the-compact-and-lightweight-htt