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

发表于:2016-05-31来源:翱翔 Beta作者:欣雨小筑点击数: 标签:性能测试工具
然后是所以线程总共平均每秒钟完成168个请求. 每秒钟读取2.5兆数据量. 可以看到, 相对于专业性能 测试工具 . wrk 的统计信息是非常简单的. 但是这些信息

  然后是所以线程总共平均每秒钟完成168个请求. 每秒钟读取2.5兆数据量.

  可以看到, 相对于专业性能测试工具. wrk 的统计信息是非常简单的. 但是这些信息基本上足够我们判断系统是否有问题了.

  wrk 默认超时时间是1秒. 这个有点短. 我一般设置为30秒. 这个看上去合理一点.如果这样执行命令:

  /wrk -t12 -c100 -d30s -T30s http://www.baidu.com

  可以看到超时数就大大降低了, Socket errors 那行没有了:

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

  12 threadsand 100 connections

  ThreadStats Avg Stdev Max +/- Stdev

  Latency 1.16s 1.61s 14.42s 86.52%

  Req/Sec 22.59 19.31 108.00 70.98%

  4534 requestsin 30.10s, 67.25MB read

  Requests/sec: 150.61

  Transfer/sec: 2.23MB

通过 -d 可以设置测试的持续时间. 一般只要不是太短都是可以的. 看你自己的忍耐程度了.
时间越长样本越准确. 如果想测试系统的持续抗压能力, 采用 loadrunner 这样的专业测试工具会更好一点.

  想看看响应时间的分布情况可以加上–latency参数:

  wrk -t12 -c100 -d30s -T30s --latencyhttp://www.baidu.com

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

  12 threadsand 100 connections

  ThreadStats Avg Stdev Max +/- Stdev

  Latency 1.22s 1.88s 17.59s 89.70%

  Req/Sec 14.47 9.92 98.00 77.06%

  LatencyDistribution

  50% 522.18ms

  75% 1.17s

  90% 3.22s

  99% 8.87s

  3887 requestsin 30.09s, 57.82MB read

  Socketerrors: connect 0, read 2, write 0, timeout 0

  Requests/sec: 129.19

  Transfer/sec: 1.92MB

  可以看到50%在0.5秒以内, %75在1.2s 以内. 看上去还不错.

  看到这里可能有人会说了, HTTP 请求不会总是这么简单的, 通常我们会有 POST,GET 等多个 method, 会有 Header, 会有 body 等.

  在我第一次知道有 wrk 这个工具的时候他确实还不太完善, 要想测试一些复杂的请求还有点难度. 现在 wrk 支持 lua 脚本. 在这个脚本里你可以修改 method, header, body, 可以对 response 做一下自定义的分析. 因为是 lua 脚本, 其实这给了你无限的可能. 但是这样一个强大的功能如果不谨慎使用, 会降低测试端的性能, 测试结果也受到影响.

  一般修改method, header, body不会影响测试端性能, 但是操作 request, response 就要格外谨慎了.

  我们通过一些测试场景在看看怎么使用 lua 脚本.

  POST + header + body.

  首先创建一个 post.lua 的文件:

  wrk.method = "POST"

  wrk.body = "foo=bar&baz=quux"

  wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"

  就这三行就可以了, 当然 headers 可以加入任意多的内容.然后执行:

  wrk -t12 -c100 -d30s -T30s --script=post.lua --latencyhttp://www.baidu.com

  当然百度可能不接受这个 post 请求.

  对 wrk 对象的修改全局只会执行一次.通过 wrk 的源代码可以看到 wrk 对象的源代码有如下属性:

  localwrk = {

  scheme = "http",

  host = "localhost",

  port = nil,

  method = "GET",

  path = "/",

  headers = {},

  body = nil,

  thread = nil,

  }

  schema, host, port, path 这些, 我们一般都是通过 wrk 命令行参数来指定.

  wrk 提供的几个 lua 的 hook 函数:

  setup 函数

  这个函数在目标 IP 地址已经解析完, 并且所有 thread 已经生成, 但是还没有开始时被调用. 每个线程执行一次这个函数.

  可以通过thread:get(name), thread:set(name, value)设置线程级别的变量.

  init 函数

  每次请求发送之前被调用.

  可以接受 wrk 命令行的额外参数. 通过 — 指定.

  delay函数这个函数返回一个数值, 在这次请求执行完以后延迟多长时间执行下一个请求. 可以对应 thinking time 的场景.

  request函数通过这个函数可以每次请求之前修改本次请求的属性. 返回一个字符串. 这个函数要慎用, 会影响测试端性能.

  response函数每次请求返回以后被调用. 可以根据响应内容做特殊处理, 比如遇到特殊响应停止执行测试, 或输出到控制台等等.

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