使用 WRK 压力测试工具对 ASP.NET Core 的接口进行压力测试

0. 简要介绍

WRK 是一款轻量且易用的 HTTP 压力测试工具,通过该工具我们可以方便地对我们所开发的 WebAPI 项目进行压力测试,并且针对测试的情况返回结果。

PS:Wrk 并不能针对测试的结果生成动态的图表,如果有这种需要,可以尝试使用另一款工具 Vegeta。该项目使用的 Golang 进行编写,其 GitHub 地址为:https://github.com/tsenart/vegeta

下面的内容就是一个标准的测试结果信息:

Copy

# 针对 127.0.0.1:8080 进行压力测试wrk -t12 -c400 -d30s http://127.0.0.1:8080/index.html

Copy

# 这里是测试结果Running 30s test @ http://127.0.0.1:8080/index.html  12 threads and 400 connections  Thread Stats   Avg      Stdev     Max   +/- Stdev    Latency   635.91us    0.89ms  12.92ms   93.69%    Req/Sec    56.20k     8.07k   62.00k    86.54%  22464657 requests in 30.00s, 17.76GB read Requests/sec: 748868.53 Transfer/sec:    606.33MB

1. 安装

关于 OS X 与 Windows 的安装可以参考 Wrk 官方 WIKI 进行操作,本文主要讲解一下 CentOS 7.x 下如果进行编译。

Copy

sudo yum groupinstall 'Development Tools' sudo yum install -y openssl-devel git git clone https://github.com/wg/wrk.git wrk cd wrk make

编译之后,你会得到如下结果:

640?wx_fmt=png

可以看到生成了一个 wrk 的可执行文件,你可以将其添加到环境变量的 PATH 当中,这里就不再赘述,我们等会儿使用的时候直接 ./wrk 使用。

2. 命令说明

Copy

./wrk -H "Authorization: Bearer TokenValue" -t 2 -c 50 -d 10s --latency --timeout 1s "http://"

上面的命令就是一个典型的压力测试命令,关于参数的含义请看下表。

执行命令时的参数含义示例
-c与 HTTP 保持连接的连接数,最终每个线程能够处理的为 连接数/线程数。-c 50
-d指定压力测试的时间有多长。-d 10s,其他单位有 2s,2m,2h
如果不带单位的话,默认为秒。
-t压力测试时所使用的线程数目,最好为你 CPU 核心的数量。-t 4
-s指定要执行的 Lua 脚本-s ./post.lua
-H执行请求的时候所附带的 Header 组。-H "User-Agent: wrk"
--latency打印详细的统计信息。--latency
--timeout每次请求所返回响应体的时间,如果超过了配置的时间,则视为请求超时。--timeout 1s

3. 开始压力测试

640?wx_fmt=png

执行了上述代码之后我们可以看到很直观的信息,第一个就是 20s 的时间内完成了 2887 次请求,一共接受到了 2.46MB 的数据。在 Socket errors 里面我们可以看到有 35 个请求产生了超时的情况,每秒执行的请求大概为 144.20 个,每秒的数据传输大概为 125.75 KB。

除此之外,还说明了平均每次请求所消耗的时间为 338.44 ms,最极端的情况为 994.27ms。

4. LUA 脚本

在第三节我们可以看到一些标准的 GET 请求我们可以直接通过指定命令来进行测试,即便该接口有授权验证,我们可以通过 -H 参数来指定 Authorization 头来实现权限验证。
但是针对一些复杂的情况,我们就需要编写 LUA 脚本来实现压力测试了。

官方编写了很多的 LUA 脚本 DEMO ,存放在 GitHub 上面,其地址为:https://github.com/wg/wrk/tree/master/scripts。

这里我们以实现 POST 请求为例:

Copy

wrk.method = "POST"wrk.body   = '{"username":"admin","password":"123qwe","rememberClient":true}'wrk.headers["Content-Type"] = "application/json"

这里我们的接口地址更改了一下,改变成了 Login 接口,该接口需要传入用户名与密码,并且其 Method 为 POST。

将上述 LUA 脚本保存为 post.lua 文件,然后通过 -s 参数指定 LUA 脚本的路径并执行。

640?wx_fmt=png

5. LUA 脚本相关详解

WRK 中执行 HTTP 请求的时候,调用 Lua 分为 3 个阶段,setuprunningdone,每个 WRK 线程中都有独立的脚本环境。

640?wx_fmt=other

5.1 WRK 的全局属性

Copy

wrk = {  scheme  = "http",  host    = "localhost",  port    = nil,  method  = "GET",  path    = "/",  headers = {},  body    = nil,  thread  = <userdata>, }

5.2 WRK 的全局方法

Copy

-- 生成整个request的string,例如:返回-- GET / HTTP/1.1-- Host: tool.lufunction wrk.format(method, path, headers, body)-- 获取域名的IP和端口,返回table,例如:返回 `{127.0.0.1:80}`function wrk.lookup(host, service)-- 判断addr是否能连接,例如:`127.0.0.1:80`,返回 true 或 falsefunction wrk.connect(addr)

5.3 Setup 阶段

setup() 方法是在线程创建之后,启动之前。

Copy

function setup(thread)-- thread提供了1个属性,3个方法-- thread.addr 设置请求需要打到的ip-- thread:get(name) 获取线程全局变量-- thread:set(name, value) 设置线程全局变量-- thread:stop() 终止线程

5.4 Running 阶段

Copy

function init(args)-- 每个线程仅调用1次,args 用于获取命令行中传入的参数, 例如 --env=prefunction delay()-- 每个线程调用多次,发送下一个请求之前的延迟, 单位为msfunction request()-- 每个线程调用多次,返回http请求function response(status, headers, body)-- 每个线程调用多次,返回http响应

5.5 Done 阶段

可以用于自定义结果报表,整个过程中只执行一次。

Copy

function done(summary, latency, requests)latency.min              -- minimum value seenlatency.max              -- maximum value seenlatency.mean             -- average value seenlatency.stdev            -- standard deviationlatency:percentile(99.0) -- 99th percentile valuelatency(i)               -- raw value and countsummary = {  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  } }

而官方的 setup.lua 脚本则是重载这些方法并使用的一个 DEMO:

Copy

-- example script that demonstrates use of setup() to pass-- data to and from the threadslocal counter = 1local threads = {}function setup(thread)   thread:set("id", counter)   table.insert(threads, thread)   counter = counter + 1endfunction init(args)   requests  = 0   responses = 0   local msg = "thread %d created"   print(msg:format(id))endfunction request()   requests = requests + 1   return wrk.request()endfunction response(status, headers, body)   responses = responses + 1endfunction 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))   endend

6. 参考资料

wrk中的lua脚本:https://type.so/linux/lua-script-in-wrk.html

http 性能测试 wrk使用教程:https://juejin.im/post/5a59e74f5188257353008fea

原文地址:https://www.cnblogs.com/myzony/p/9798116.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318028.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[TJOI2019]唱、跳、rap和篮球(指数型生成函数+NTT+卷积)

文章目录题目题解code1&#xff08;NTT&#xff09;code2&#xff08;EGF卷积&#xff09;题目 大中锋的学院要组织学生参观博物馆&#xff0c;要求学生们在博物馆中排成一队进行参观。他的同学可以分为四类&#xff1a;一部分最喜欢唱、一部分最喜欢跳、一部分最喜欢rap&…

Sum of Paths CodeForces - 1467D

Sum of Paths CodeForces - 1467D Tagscombinatorics dp math *2200 题意&#xff1a; 定义一条好的路径&#xff0c;当且仅当从任意点出发之后恰好经过了 k 次移动&#xff0c;定义这条路径的权值为经过点权值的总和(可重)&#xff0c;进行 q 次修改&#xff0c;每次将ak 改…

[矩阵乘法/快速幂专题]Arc of Dream,Recursive sequence,233 Matrix,Training little cats

矩阵快速幂习题复习矩阵乘法及快速幂模板乘法模板快速幂模板T1&#xff1a;Arc of Dream题目题解codeT2&#xff1a;Recursive sequence题目题解codeT3&#xff1a;233 Matrix题目题解codeT4&#xff1a;Training little cats题目题解code做题的时候后悔没有保存过模板&#xf…

你准备好了在云中工作吗?

前几天写了一篇文章 《云时代的.NET》&#xff0c;今天继续这个话题聊下云时代的技能。无服务器计算&#xff0c;容器化&#xff0c;云原生应用&#xff0c;DevOps&#xff0c;人工智能&#xff0c;机器学习以及混合云和多云解决方案等IT趋势正在成为主流或“新常态”。所有大小…

最长公共上升子序列(LCIS)

题意&#xff1a; 求最长公共上升子序列 题解&#xff1a; 最长公共上升子序列 最长公共子序列&#xff08;LCS&#xff09;与最长上升子序列&#xff08;LIS&#xff09; LCS核心代码&#xff1a; for(int i1;i<n;i){for(int j1;j<m;j){if(a[i]b[j])dp[i][j]max(dp[…

[高斯消元及理论]线性方程组整数/浮点数,模线性方程组,异或方程组模板

文章目录理论线性方程组整数类型解线性方程组浮点类型解模线性方程组异或方程组高斯约旦消元约旦消元无解无穷解唯一解理论 高斯消元法&#xff0c;是线性代数规划中的一个算法&#xff0c;可用来为线性方程组求解。但其算法十分复杂&#xff0c;不常用于加减消元法&#xff0c…

eShopOnContainers 知多少[7]:Basket microservice

引言Basket microservice&#xff08;购物车微服务&#xff09;主要用于处理购物车的业务逻辑&#xff0c;包括&#xff1a;购物车商品的CRUD订阅商品价格更新事件&#xff0c;进行购物车商品同步处理购物车结算事件发布订阅订单成功创建事件&#xff0c;进行购物车的清空操作架…

后缀数组 SA

后缀数组 SA 后缀树组(SA&#xff0c;suffix array)&#xff0c;用于处理字符串子串形成的结构。 处理子串的结构主要方式有&#xff1a;后缀数组 SA&#xff0c;后缀自动机 SAM&#xff0c;后缀树 ST。 后缀树和后缀自动机暂时决定咕咕咕&#xff0c;以后学习可以参考ix35 的字…

微软热门开源项目及代码库地址

点击蓝字关注我这几年来&#xff0c;微软在开源与社区方向的努力与成就是全世界有目共睹的。微软的开源项目超过2000多个&#xff0c;挑了一些比较火热的给大家整理了一下。欢迎补充~Visual Studio Code非常流行的跨平台代码编辑器&#xff0c;提供全面的编辑和调试支持、可扩展…

[树链剖分][SDOI 2011]染色,Housewife Wind

文章目录T1&#xff1a;Housewife Wind题目题解codeT2&#xff1a;染色题目题解code今天选择写这篇博客主要是为了告诉大家一个道理&#xff0c;数组比vectorvectorvector快太多了&#xff0c;我这两道题第一次都因为vectorvectorvector&#xff0c;TTT到飞起 T1&#xff1a;…

ASP.NET Core 网站运行时修改设置如何自动生效

点击蓝字关注我在ASP.NET Core中&#xff0c;如果修改了appsettings.json中的设置&#xff0c;那么默认情况下就得重启网站才能生效。有没有办法在修改设置后自动刷新并应用呢&#xff1f;背景首先&#xff0c;我们看看默认模板建出来的 ASP.NET Core 网站&#xff0c;配置文件…

1022. 宠物小精灵之收服

1022. 宠物小精灵之收服 题意&#xff1a; 现在有n个胶囊&#xff0c;m个生命值&#xff0c;k个怪物&#xff0c;每个怪物需要a[i]个胶囊&#xff0c;且会造成b[i]个伤害后才能捕获&#xff0c;问在活着的前提下&#xff0c;最多捕获多少怪物&#xff0c;在怪物最多的情况下剩…

【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列

文章目录T1&#xff1a;单峰排列题目题解codeT2&#xff1a;历史研究题目题解codeT3&#xff1a;大魔法师题目题解code我可能这辈子都更不出来狂欢赛5了&#xff0c;先咕咕 T1&#xff1a;单峰排列 题目 一个n的全排列A[i]是单峰的&#xff0c;当且仅当存在某个x使得A[1]<…

YBTOJ:圈套问题(分治法、鸽笼原理)

文章目录题目描述数据范围解析代码图片转载自&#xff1a; https://blog.csdn.net/weixin_43346722/article/details/118435430题目描述 平面上有 n个点&#xff0c;用n个大小相同的圆分别将一个点作为圆心&#xff0c;同时满足圆圈不相交&#xff0c;求圆的最大半径。 数据范…

ASP.NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

一、前言在项目开发中&#xff0c;日志系统是系统的一个重要组成模块&#xff0c;通过在程序中记录运行日志、错误日志&#xff0c;可以让我们对于系统的运行情况做到很好的掌控。同时&#xff0c;收集日志不仅仅可以用于诊断排查错误&#xff0c;由于日志同样也是大量的数据&a…

[学习笔记] 伸展树splay详解+全套模板+例题[Luogu P3369 【模板】普通平衡树]

文章目录引入概念全套模板变量声明updaterotate旋转splay操作insert插入delete删除查找x的位置查找第k大前驱/后继极小值-inf和极大值inf的作用例题&#xff1a;P3369 【模板】普通平衡树题目code声明一下&#xff0c;许多代码的注解都在模板代码里面写了的&#xff0c;所以正文…

手写AspNetCore 认证授权代码

在普通的MVC项目中 我们普遍的使用Cookie来作为认证授权方式&#xff0c;使用简单。登录成功后将用户信息写入Cookie&#xff1b;但当我们做WebApi的时候显然Cookie这种方式就有点不适用了。在dotnet core 中 WebApi中目前比较流行的认证授权方式是Jwt (Json Web Token) 技术。…

YBTOJ:采矿战略(线段树维护dp、树链剖分)

文章目录题目描述解析代码题目描述 所谓线段树维护dp&#xff0c;就是在线段树上维护dp &#xff08;逃&#xff09; 解析 把树剖一下后就变成了区间问题 考虑建一棵线段树&#xff0c;每一个结点都是一个背包 这样就能区间查询&#xff0c;也能带修了 这种做法复杂度其实并不…

【用皇宫三十六计生存法则带你走进LCT(动态树)】LCT概念+模板+例题【洛谷P3690 Link Cut Tree(动态树)】

文章目录LCT概念模板rotatoisrootsplayaccessmakerootsplitfindrootlinkcut封装版例题题目code普通版code封装版这篇博客主要是帮助大家理解各个模板及LCTLCTLCT的意思&#xff0c;方便理解&#xff0c;模板写法的理解在代码里有注释详解&#xff0c;如果要看原理的话&#xff…

迈向现代化的 .Net 配置指北

1. 欢呼 .NET Standard 时代我现在已不大提 .Net Core&#xff0c;对于我来说&#xff0c;未来的开发将是基于 .NET Standard&#xff0c;不仅仅是 面向未来 &#xff0c;也是 面向过去&#xff1b;不只是 .Net Core 可以享受便利&#xff0c; .NET Framework 不升级一样能享受…