wrk 压测工具

wrk 压测工具wrk 压测工具安装 gitclonehttp github com wg wrk gitcdwrkmake 常用参数类型 Usage wrk options url Options c connections N Connectionst d duration T Durationofte e g 2s 2m 2h T N url options

wrk 压测工具

安装

git clone https://github.com/wg/wrk.git cd wrk make 

常用参数类型

Usage: wrk <options> <url> Options: -c, --connections <N> Connections to keep open -d, --duration <T> Duration of test, e.g. 2s, 2m, 2h -t, --threads <N> Number of threads to use -s, --script <S> Load Lua script file -H, --header <H> Add header to request, e.g. "User-Agent: wrk" --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可以结合lua来做,通过wrk提供的几个lua函数来对请求进行修改,结果输出、设置延迟等操作。下面来看看wrk提供的几个lua函数:

lua声明周期

共有三个阶段,启动阶段,运行阶段,结束阶段。wrk支持在这三个阶段对压测进行个性化。

启动阶段
setup 函数
运行阶段
init 函数

setup方法中可操作该thread对象,获取信息、存储信息、甚至关闭该线程。

thread.addr - get or set the thread's server address thread:get(name) - get the value of a global in the thread's env thread:set(name, value) - set the value of a global in the thread's env thread:stop() - stop the thread 
delay函数

这个函数返回一个数值, 在这次请求执行完以后延迟多长时间执行下一个请求. 可以对应 thinking time 的场景.

request函数

通过这个函数可以每次请求之前修改本次请求的属性. 返回一个字符串. 这个函数要慎用, 会影响测试端性能.

request = function() wrk.method = "GET" wrk.headers["Host"] = "www.test.com" wrk.headers["x-header-trace"] = "all" return wrk.format("GET", wrk.path) end 
response函数

每次请求返回以后被调用. 可以根据响应内容做特殊处理, 比如遇到特殊响应停止执行测试, 或输出到控制台等等.

function response(status, headers, body) if status ~= 200 then print(body) wrk.thread:stop() end end 
结束阶段
done函数

在所有请求执行完以后调用, 一般用于自定义统计结果.

done = function(summary, latency, requests) io.write("------------------------------\n") for _, p in pairs({ 
    50, 90, 99, 99.999 }) do n = latency:percentile(p) io.write(string.format("%g%%,%d\n", p, n)) end end 
wrk官网提供的setup.lua实例
-- example script that demonstrates use of setup() to pass -- data to and from the threads local counter = 1 local threads = { 
   } function setup(thread) thread:set("id", counter) table.insert(threads, thread) counter = counter + 1 end function init(args) requests = 0 responses = 0 local msg = "thread %d created" print(msg:format(id)) end function request() requests = requests + 1 return wrk.request() end function response(status, headers, body) responses = responses + 1 end function done(summary, latency, requests) for index, thread in ipairs(threads) do local id = thread:get("id") local requests = thread:get("requests") local responses = thread:get("responses") local msg = "thread %d made %d requests and got %d responses" print(msg:format(id, requests, responses)) end end 

使用setup.lua:

[root@jerrik wrk]# wrk -t 4 -c 100 -d 20s --latency -s scripts/setup.lua https://www.baidu.com thread 1 created thread 2 created thread 3 created thread 4 created Running 20s test @ https://www.baidu.com 4 threads and 100 connections Thread Stats Avg Stdev Max +/- Stdev Latency 251.75ms 336.19ms 2.00s 86.89% Req/Sec 138.51 69.90 690.00 71.23% Latency Distribution 50% 215.74ms 75% 401.87ms 90% 664.84ms 99% 1.54s 11021 requests in 20.02s, 162.82MB read Socket errors: connect 0, read 3, write 0, timeout 50 Requests/sec: 550.62 Transfer/sec: 8.13MB thread 1 made 2945 requests and got 2919 responses thread 2 made 2831 requests and got 2807 responses thread 3 made 2772 requests and got 2747 responses thread 4 made 2573 requests and got 2548 responses [root@jerrik wrk]#  

将每个线程的请求数和响应数输出来了。其它更多使用可以参考github script目录下的lua脚本。

方法

wrk.fomat wrk.lookup wrk.connect

function wrk.format(method, path, headers, body) --根据参数和全局变量wrk,生成一个HTTP rquest string。 function wrk.lookup(host, service) --给定host和service(port/well known service name),返回所有可用的服务器地址信息。 function wrk.connect(addr) --测试与给定的服务器地址信息是否可以成功创建连接 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232046.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java实战——图书管理系统

    因为这个写的比较完整,所以简单说明一下过程中使用的EJB和RMI两个东西。EJB实现原理:就是把原来放到客户端实现的代码放到服务器端,并依靠RMI进行通信。RMI实现原理:就是通过Java对象可序列化机制实现分布计算。好了,没了,就这么简单…想稍微深入了解一下的看一下这个好了,我就不再赘述。https://blog.csdn.net/lovechuanyu/article/…

    2022年4月12日
    40
  • vue 父组件调用子组件的方法_vue子组件修改父组件值

    vue 父组件调用子组件的方法_vue子组件修改父组件值我们都知道通过$ref可以获取到某个DOM,但是它也可以用来获取子组件的实例,调用子组件的方法例:子组件:&amp;lt;template&amp;gt;&amp;lt;div&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/template&amp;gt;&amp;lt;script&amp;gt;exportdefault{methods:{c

    2022年10月2日
    3
  • vbnet怎么连接access数据库(VB·Net视频)

    在向大家详细介绍VB.NETAccess数据库连接之前,首先让大家了解下VB.NET的简介,然后全面介绍VB.NETAccess数据库连接。VisualBasic.NET是从VisualBasic语言演变而来vb.net教程的,是一种为高效地生成类型安全和面向对象的应用程序而设计的语言。VisualBasic允许开发人员开发面向Windows、Web和移动设备的程序。与所有面向Microsoft.NETFramework的语言一样,使用VisualBasic编写的程序

    2022年4月16日
    171
  • PHP feof() 函数

    PHP feof() 函数

    2021年11月10日
    43
  • java数组反转Reverse

    java数组反转Reverse三种反转数组的方法:publicclassReverseArray{publicvoidreverse(int[]arr){for(inti=0;i

    2022年6月9日
    204
  • 数据库设计 ER图

    数据库设计 ER图一、ER图简介ER图,简单来说,E是实体,实体有一组属性;R是关系。找打系统中的实体以及实体关系就可以绘制出ER图了。例如,下图是网上找到的ER图,矩形的是实体,椭圆是属性,实体何实体时间的关系用菱形,关系也有熟悉,例如,学生选修课程,有成绩属性,当然如果系统需要,也可以记录选修的时间等属性信息。认真看下,你会发现ER图理解起来还是比较容易的二、ER图绘制常见问题但是真的落实到自己绘制,很多同学就会遇到困难。下面我们通过反例来学习ER图1.反例1区分功能和关系.

    2022年6月21日
    40

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号