官方源码:https://github.com/wg/wrk
安装步骤:
- wrk只支持linux环境不支持windows环境,
- 安装git,并配置git环境变量,
- 克隆源码git clone https://github.com/wg/wrk
- 进入到源码的路径下执行make进行编译
- 然后会在当前路径下生成一个可执行文件wrk
- 如果想全局都可以执行,将wrk文件加入到环境变量
命令介绍: wrk <选项> <被测HTTP服务的URL>
Options:
-c, --connections <N> 跟服务器建立并保持的TCP连接数量 (请求并发数量)
-d, --duration <T> 压测时间
-t, --threads <N> 使用多少个线程进行压测 一般设置成cpu的核数的2或者4倍
-s, --script <S> 指定Lua脚本路径
-H, --header <H> 为每一个HTTP请求添加HTTP头
--latency 在压测结束后,打印延迟统计信息
--timeout <T> 超时时间
-v, --version 打印正在使用的wrk的详细版本信息
<N>代表数字参数,支持国际单位 (1k, 1M, 1G)
<T>代表时间参数,支持时间单位 (2s, 2m, 2h)
例子:
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
结果详解:
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个请求)
Transfer/sec: 22.79MB (平均每秒读取数据22.79MB)
脚本执行:
Wrk支持脚本编程,这让wrk在众压测工具中尤为突出,增加了生成压测请求的灵活性,脚本是基于Lua脚本语言编写的,Wrk有一个全局的table和几个全局的function:
Wrk的table数据结构如下:
- wrk = {
- scheme = "http",
- host = "localhost",
- port = nil,
- method = "GET",
- path = "/",
- headers = {},
- body = nil,
- thread = <userdata>,
- }
Wrk的全局变量上面的值默认会应用在所有的请求之上,也就是说我们可以通过修改wrk。Host =”192.168.3.1”,让所有的后续请求去访问主机ip是192.168.3.1的服务器,其他参数类似。
全局的函数如下:
function wrk.format(method, path, headers, body)
这个函数的主要作用是通过传参修改上面的Wrk table中的对应参数,从而生成一个字符串类型Http请求进行返回。
function wrk.lookup(host, service)
这个函数返回一个数据结构是table类型的结果,里面存储的是host和service对,类似于POSIX的getaddrinfo()函数。
function wrk.connect(addr)
如果入参的地址可以连接则返回ture 否则返回false 但是这个参数必须是通wrk.lookup()返回。
下面是几个可选的全局函数,使用者可以自定义实现,一定是函数实现:
setup(thread)-----------当线程创建的时候调用
init(args)--------------当线程初始化的时候调用
delay()----------------返回一个延迟
request()---------------调用返回一个request请求
response()-------------返回响应的时候调用、
done(summary, latency, requests)---------------执行完返回结果统计的时候调用
上面的方法根据运行时间可以分为三个部分:创建时,运行时,结束
创建时的方法:
setup(thread)每个线程在被设置了目标Ip地址之后,但是还没有实例化之前调用,每个线程都会调用一次。
入参 thread,可以有以下操作:
thread:addr 获得或者设置线程要访问的服务器地址
thread:get(name) 从线程上下文中获取key为name对应的value
thread:set(name,value) 为线程上下文设置对应的key value
thread:stop() 停止线程
运行时的方法:
init(arg),获取wrk指令中的传参,例如 wrk –helloworld,arg就是helloworld、
delay(),返回一个毫秒级别的延迟下一个request的请求就会延迟,这个时request级别的方法,每个request都会调用一次,
request() 返回一个request请求字符串,例如http://localhost:8080/,调用这个方法会影响性能,
respone() 返回http response 的时候调用,调用这个方法会影响性能
结束时的方法:
done(summary, latency, requests)当执行完压测计划后,返回测试报告的时候调用,参数详解:
接收包含结果数据的table,以及两个表示每个请求延迟和每个线程的统计对象,请求率。 持续时间和延迟是微秒值,速率是以每秒请求数衡量
- latency.min -- minimum value seen
- latency.max -- maximum value seen
- latency.mean -- average value seen
- latency.stdev -- standard deviation
- latency:percentile(99.0) -- 99th percentile value
- latency(i) -- raw value and count
- summary = {
- duration = N, -- run duration in microseconds
- requests = N, -- total completed requests
- bytes = N, -- total bytes received
- errors = {
- connect = N, -- total socket connection errors
- read = N, -- total socket read errors
- write = N, -- total socket write errors
- status = N, -- total HTTP status codes > 399
- timeout = N -- total request timeouts
- }
- }