wrk的高级应用总结

WRK高级应用简介:

基于事件机制的高性能http压力测试工具,除了能针对单个url进行测试外,最重要的就是能够构造不同的url、不同的参数进行测试,发送携带body的POST请求。

wrk 公共lua API

  1. init = function(args)
  2. request = function()
  3. response = function(status, headers, body)
  4. done = function(summary,latency, requests)
  5. 全局变量wrk
    wrk = {
    	  scheme  = "http",
    	  host    = "localhost",
    	  port    = nil,
    	  method  = "GET",
    	  path    = "/",
    	  headers = {},
    	  body    = nil
    	}
    

lua脚本

wrk功能高级的地方在于使用luajit进行自定义功能扩展,使用自定义函数构造不同的请求场景,常用的函数有:

  • function setup(thread) 在创建线程时调用,wrk会为每一个测试线程调用一次setup方法,并传入代表测试线程的对象thread作为参数。setup方法中可操作该thread对象,获取信息、存储信息、甚至关闭该线程。
  • function init(args) 在线程启动时调用一次
  • function delay() 在每次发送request之前调用
  • function request() 用来生成请求,每一次请求都会调用该方法,所以不要在这里写入耗时的操作,如果复杂的请求,在init函数就构造好,这里直接引用。
  • function response(status, headers,body) 在每次收到一个响应时调用;为提升性能,如果没有定义该方法,那么wrk不会解析headers和body
  • function done(summary, latency,requests) 该方法在整个测试过程中只会调用一次,可从参数给定的对象中,获取压测结果,生成定制化的测试报告。

自定义脚本中可访问的变量和方法:

变量wrk是一个table类型的全局变量,若修改改table,则会影响所有的请求。
wrk = {}

function wrk.format(method, path, headers, body)

wrk.format returns a HTTP request string containing the passed parameters merged with values from the wrk table.
– 根据参数和全局变量wrk,生成一个HTTP请求字符串。

function wrk.lookup(host, service)

wrk.lookup returns a table containing all known addresses for the host and service pair. This corresponds to the POSIX getaddrinfo()function.
– 给定host和service(port/well known service name),返回所有可用的服务器地址信息。

function wrk.connect(addr)

wrk.connect returns true if the address can be connected to, otherwise it returns false. The address must be one returned from wrk.lookup().
–测试与给定的服务器地址信息是否可以成功创建连接

高级使用场景

  1. 发送get请求

    一般get请求url中参数固定的情况下,不需要修改脚本文件,如果需要构造特殊的请求则需要创建脚本文件,
    场景一,参数格式如:/1?arg=1, /2?arg=2, /3?arg=3……
    进入scripts目录下,新建http_get.lua文件,修改内容如下:
    进入scripts目录下,新建http_get.lua文件,修改内容如下:

    counter = 0
    num=0
    request = function()
       path = "/" .. counter .."?arg=" ..num
       counter = counter + 1
       num = num+1
       return wrk.format("", path)
    end
    	
    执行脚本 wrk -t 2 -c50 -d 15s -R2000 --latency "http://IP:port/uri" --script=http_get.lua
    

    场景二、参数嵌套,比如json格式的参数
    {“query”: {“multi_match”: { “query”: “AABBCCDD”, “fields”: [ “address”, “address-aaa” ] }}}
    进入到scripts目录下,新建一个lua文件,作为使用post方法的接口文件,将http 方法置为GET,修改内容如下:

    wrk.method = "GET"
    wrk.body='{"query": {"multi_match": { "query": "北京 AABBCCDDEEFFF", "fields": [ "address", "address-jdidx" ] }}}'
    wrk.headers["Content-Type"] ="application/json"
    
    执行脚本 wrk -t 2 -c50 -d 15s -R2000 --latency "http://IP:port/uri" --script=get_matche.lua
    
  2. 使用POST 方法

    进入到scripts目录下,新建一个lua文件,作为使用post方法的接口文件,修改内容如下:

    wrk.method = "POST"
    wrk.body='{"KeyId":10}'
    wrk.headers["Content-Type"] ="application/json"
    		
    执行脚本  wrk -t 2 -c50 -d 15s -R2000 --latency "http://IP:port/uri?key=value" --script=post.lua
    
  3. 文件中指定uri

    测试场景:http连接的url存在文件中,此种情况下,在init阶段将uri读取到wrk table中,requests只需引用即可,可提高性能。比如存在uri.txt /a.txt /b.txt /c.txt /d.txt
    创建lua脚本文件,file_uri.lua
    –uri.txt /a.txt /b.txt /c.txt /d.txt

    urimap={}
    counter = 0
    function init(args)
       for line in io.lines("uri.txt") do
            print(line)
            urimap[counter] = line
            counter=counter+1
       end
       count =0
    end
    
    request = function()
       counter = counter +1
       path = urimap[counter % table.getn(urimap) +1]
       return wrk.format(nil, path)
    end
    
    执行脚本 wrk -t 2 -c50 -d 15s -R2000 --latency "http://IP:port/uri" --script=file_uri.lua
    

猜你喜欢

转载自blog.csdn.net/ccccsy99/article/details/106355347
wrk