压测工具:Wrk

官方源码:https://github.com/wg/wrk

安装步骤:

  1. wrk只支持linux环境不支持windows环境,
  2. 安装git,并配置git环境变量,
  3. 克隆源码git clone https://github.com/wg/wrk
  4. 进入到源码的路径下执行make进行编译
  5. 然后会在当前路径下生成一个可执行文件wrk
  6. 如果想全局都可以执行,将wrk文件加入到环境变量

 

命令介绍: wrk <选项> <被测HTTP服务的URL>                           

  Options:                                           

    -c, --connections   跟服务器建立并保持的TCP连接数量 (请求并发数量)

    -d, --duration      压测时间          

    -t, --threads       使用多少个线程进行压测 一般设置成cpu的核数的2或者4倍

                                                     

    -s, --script        指定Lua脚本路径      

    -H, --header        为每一个HTTP请求添加HTTP头     

        --latency          在压测结束后,打印延迟统计信息  

        --timeout       超时时间    

    -v, --version          打印正在使用的wrk的详细版本信息

                                                     

  代表数字参数,支持国际单位 (1k, 1M, 1G)

  代表时间参数,支持时间单位 (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数据结构如下:

  1. wrk = {  
  2.   scheme  = "http",  
  3.   host    = "localhost",  
  4.   port    = nil,  
  5.   method  = "GET",  
  6.   path    = "/",  
  7.   headers = {},  
  8.   body    = nil,  
  9.   thread  = ,  
  10. }  

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类型的结果,里面存储的是hostservice对,类似于POSIXgetaddrinfo()函数。

 

 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) 从线程上下文中获取keyname对应的value

thread:set(name,value) 为线程上下文设置对应的key value

thread:stop() 停止线程

 

运行时的方法:

init(arg),获取wrk指令中的传参,例如 wrk –helloworldarg就是helloworld

delay(),返回一个毫秒级别的延迟下一个request的请求就会延迟,这个时request级别的方法,每个request都会调用一次,

request() 返回一个request请求字符串,例如http://localhost:8080/,调用这个方法会影响性能,

respone() 返回http response 的时候调用,调用这个方法会影响性能

 

结束时的方法:

done(summary, latency, requests)当执行完压测计划后,返回测试报告的时候调用,参数详解:

接收包含结果数据的table,以及两个表示每个请求延迟和每个线程的统计对象,请求率。 持续时间和延迟是微秒值,速率是以每秒请求数衡量

  1. latency.min              -- minimum value seen  
  2. latency.max              -- maximum value seen  
  3. latency.mean             -- average value seen  
  4. latency.stdev            -- standard deviation  
  5. latency:percentile(99.0) -- 99th percentile value  
  6. latency(i)               -- raw value and count  
  7.   
  8. summary = {  
  9.   duration = N,  -- run duration in microseconds  
  10.   requests = N,  -- total completed requests  
  11.   bytes    = N,  -- total bytes received  
  12.   errors   = {  
  13.     connect = N, -- total socket connection errors  
  14.     read    = N, -- total socket read errors  
  15.     write   = N, -- total socket write errors  
  16.     status  = N, -- total HTTP status codes > 399  
  17.     timeout = N  -- total request timeouts  
  18.   }  
  19. }  

 

你可能感兴趣的:(压测工具)