这篇文章是关于wrk压测工具的使用指南。它首先介绍了如何安装wrk,然后详细解释了wrk的基本使用方法,包括如何查看使用帮助、版本信息,以及如何进行简单的压测。文章还介绍了如何增加header参数进行压测,以及如何压测POST接口。在每个示例后,作者都对结果进行了详细的注释和解释。
安装
wrk支持大多数类UNIX系统,不支持windows。需要操作系统支持LuaJIT和OpenSSL,不过不用担心,大多数类Unix系统都支持。安装wrk非常简单,只要从github上下载wrk源码,在项目路径下执行make命令即可。
git clone https://github.com/wg/wrk
// 切换到wrk目录
make
make
之后,会在项目路径下生成可执行文件wrk,随后就可以用其进行HTTP压测了。可以把这个可执行文件拷贝到某个已在path中的路径,比如/usr/local/bin
,这样就可以在任何路径直接使用wrk
了。
默认情况下wrk
会使用自带的LuaJIT
和OpenSSL
,如果你想使用系统已安装的版本,可以使用WITH_LUAJIT
和WITH_OPENSSL
这两个选项来指定它们的路径。比如:
make WITH_LUAJIT=/usr WITH_OPENSSL=/usr
基本使用
命令行敲下wrk
,可以看到使用帮助
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)
简单翻成中文:
使用方法: wrk <选项> <被测HTTP服务的URL>
Options:
-c, --connections <N> 跟服务器建立并保持的TCP连接数量
-d, --duration <T> 压测时间
-t, --threads <N> 使用多少个线程进行压测
-s, --script <S> 指定Lua脚本路径
-H, --header <H> 为每一个HTTP请求添加HTTP头
--latency 在压测结束后,打印延迟统计信息
--timeout <T> 超时时间
-v, --version 打印正在使用的wrk的详细版本信息
<N>代表数字参数,支持国际单位 (1k, 1M, 1G)
<T>代表时间参数,支持时间单位 (2s, 2m, 2h)
看下版本
wrk -v
输出:
wrk 4.0.2 [epoll] Copyright (C) 2012 Will Glozer
看到是4.0.2版本的wrk
,使用了epoll
。这意味着我们可以用少量的线程来跟被测服务创建大量连接,进行压测。
做一次简单压测,分析下结果
wrk -t8 -c200 -d30s --latency "http://www.bing.com"
输出:
Running 30s test @ http://www.bing.com
8 threads and 200 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 46.67ms 215.38ms 1.67s 95.59%
Req/Sec 7.91k 1.15k 10.26k 70.77%
Latency Distribution
50% 2.93ms
75% 3.78ms
90% 4.73ms
99% 1.35s
1790465 requests in 30.01s, 684.08MB read
Requests/sec: 59658.29
Transfer/sec: 22.79MB
以上使用8个线程200个连接,对bing首页进行了30秒的压测,并要求在压测结果中输出响应延迟信息。以下对压测结果进行简单注释:
Running 30s test @ http://www.bing.com (压测时间30s)
8 threads and 200 connections (共8个测试线程,200个连接)
Thread Stats Avg Stdev Max +/- Stdev
(平均值) (标准差)(最大值)(正负一个标准差所占比例)
Latency 46.67ms 215.38ms 1.67s 95.59%
(延迟)
Req/Sec 7.91k 1.15k 10.26k 70.77%
(处理中的请求数)
Latency Distribution (延迟分布)
50% 2.93ms
75% 3.78ms
90% 4.73ms
99% 1.35s (99分位的延迟)
1790465 requests in 30.01s, 684.08MB read (30.01秒内共处理完成了1790465个请求,读取了684.08MB数据)
Requests/sec: 59658.29 (平均每秒处理完成59658.29个请求及QPS)
Transfer/sec: 22.79MB (平均每秒读取数据22.79MB)
可以看到,wrk
使用方便,结果清晰。并且因为非阻塞IO的使用,可以在普通的测试机上创建出大量的连接,从而达到较好的压测效果。
增加header参数压测
ab -c50 -n1000 -t30 -H "token: xxx" "http://127.0.0.1:80/test/test1?a=111" # 注意Header头的空格
wrk -t8 -c200 -d30s --header "token: xxx" --latency "http://127.0.0.1:80/test/test1?a=111" # 注意Header头的空格
压测POST接口
如果post请求的body不为空则指定lua文件进行读取,示例如下:
./wrk -t 5 -c 300 -d 60 --script=post.lua --latency https://api.midukanshu.com/logstash/userbehavior/create
// post.lua文件内容
wrk.method = "POST"
wrk.body = ""
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"