使用 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 左右,看来要优化下了 :)