Hugh's Blog

使用 wrk 进行 benchmark 测试

wrk 是一个轻量的 HTTP 压力测试工具,跟 ApacheBench 类似。

工具是开源的,地址是:wg/wrk,安装也简单,Wiki 上面就有,不过最近经常用 Docker,所以用的是这个版本:williamyeh/wrk

使用命令很简单,跟 ab 类似。

# 查看使用命令
docker run --rm williamyeh/wrk --version
wrk  [epoll] Copyright (C) 2012 Will Glozer
Usage: wrk <options> <url>
  Options:
    -c, --connections <N>  Connections to keep open
    -d, --duration    <T>  Duration of test
    -t, --threads     <N>  Number of threads to use

    -s, --script      <S>  Load Lua script file
    -H, --header      <H>  Add header to request
        --latency          Print latency statistics
        --timeout     <T>  Socket/request timeout
    -v, --version          Print version details

  Numeric arguments may include a SI unit (1k, 1M, 1G)
  Time arguments may include a time unit (2s, 2m, 2h)

# 例如使用 3 个线程来模拟 50 个并发连接,持续 2 分钟,设置超时 30 秒,并打印出请求的延迟统计信息,注意线程数一般不用太高,根据 CPU 的核心数设置就行
docker run --rm --net=host williamyeh/wrk -c 50 -t 3 -d 2m --latency --timeout 30s https://imhugh.com/

单独来看下输出结果:

Running 2m test @ https://imhugh.com/
  3 threads and 50 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     2.19s   257.16ms   3.21s    80.52%
    Req/Sec     8.23      5.16    30.00     71.45%
  Latency Distribution
     50%    2.14s
     75%    2.33s
     90%    2.52s
     99%    2.88s
  2151 requests in 2.00m, 11.20MB read
  Socket errors: connect 0, read 0, write 0, timeout 6
Requests/sec:     17.91
Transfer/sec:     95.54KB

说明:

  • Latency:延迟时间

  • Req/Sec:每个线程每秒钟完成的请求数

  • Latency Distribution:延迟统计分析

  • Socket errors socket:错误的数量

  • Requests/sec:每秒完成的请求数,也就是并发能力 (QPS)

  • Transfer/sec:每秒处理的数据传输量

可以看到,一共在 2 分钟内完成了 2151 个请求,QPS 大概是 18,平均每次请求延迟 2 秒,99% 的请求在 3 秒内完成(国内到硅谷)。

另外还可以使用 lua 脚本来进行其他复杂的请求,比如示例脚本里面有提供了一个简单 POST 请求:

# post.lua
-- example HTTP POST script which demonstrates setting the
-- HTTP method, body, and adding a header

wrk.method = "POST"
wrk.body   = "foo=bar&baz=quux"
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"

在请求时带上脚本:

docker run --rm --net=host -v `pwd`:/data williamyeh/wrk -c 5 -t 1 -d 30s --latency -s post.lua https://imhugh.com/

对于 lua 写法不是很熟,用到的时候再看吧。

目前来说网站的 QPS 只有 15 左右,看来要优化下了 :)


参考

Http压测工具wrk使用指南

高性能测试工具WRK的高级使用方法

使用ab和wrk对OSS进行benchmark测试