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

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

可以看到生成了一个 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. 开始压力测试

执行了上述代码之后我们可以看到很直观的信息,第一个就是 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 脚本的路径并执行。

5. LUA 脚本相关详解

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

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

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

  1. asp.net core系列 67 Web压力测试工具WCAT

    asp.net core系列 67 Web压力测试工具WCAT 原文:asp.net core系列 67 Web压力测试工具WCAT 一.介绍 最近搭建了一套CQRS框架,需要在投入开发前,进行必要的 ...

  2. android手机版tcp或者udp通讯测试工具,可以用于工业设备或者系统开发时间测试tcp或是udp连接通讯是否正常工作

    TUtool 介绍 由于工作需要一款安卓的tcp udp测试工具,而市场里没有或者不好用,或者都是广告,现在个人开发者又不让发布应用了,小巧好用不收集用户信息的不收费没有广告的小工具只能自己用,哈哈. ...

  3. 免费的系统压力测试方法/工具有哪些?企业如何做好软件压力测试

    对于很多企业测试人员来说,在做软件压力测试工作时,压力测试方法/工具不在乎多与少,而在于是否能够满足自己的产品检测需求,能够派上用处的压力测试工具就是好工具.那么好用的压力测试方法/工具有哪些,企业如 ...

  4. 微信html5测试工具,腾讯优测推出微信内H5测试工具 10分钟完成检测

    原标题:腾讯优测推出微信内H5测试工具 10分钟完成检测 腾讯优测推出微信内H5测试工具 12月21日消息,微信做为H5应用最常见的传播阵地,非常需要有一个全面可靠并且有针对性的测试工具.昨日晚些时候 ...

  5. android 测试工具,Android开源项目第四篇:开发及测试工具篇

    本文为那些不错的Android开源项目第四篇--开发工具篇,**主要介绍Android开发工具和测试工具相关的开源项目**. Android开源项目系列汇总已完成,包括: 1.Buck faceboo ...

  6. TechEmpower 13轮测试中的ASP.NET Core性能测试

    应用性能直接影响到托管服务的成本,因此公司在开发应用时需要格外注意应用所使用的Web框架,初创公司尤其如此.此外,糟糕的应用性能也会影响到用户体验,甚至会因此受到相关搜索引擎的降级处罚.在选择框架时, ...

  7. wsl 上使用docker_首先通过在WSL和Docker中进行测试,将ASP.NET Core从Windows上的Azure应用服务迁移到Linux

    wsl 上使用docker I updated one of my websites from ASP.NET Core 2.2 to the latest LTS (Long Term Suppor ...

  8. U盘测试、磁盘测试工具-使用于ROM类型存储器,U盘测试,SD卡测试

    项目中需要用到SD卡,买了SD卡后,想测试下看读写速度性能,在网上找了半天感觉没什么好用的工具,而且还怕有病毒.所以就自己动手写了一个磁盘测试工具,这里分享给大家使用~~~ 特点: 能真实的反应磁盘在 ...

  9. Asp.NET Core 一个接口的多个实现如何通过 DI 注册?

    咨询区 LP13 我有三个 Service 类实现了同一个接口,参考代码如下: public interface IService { } public class ServiceA : IServi ...

最新文章

  1. debian java 安装路径_Debian安装JAVA环境(转载)
  2. 牛客华为机试第6题python
  3. 看看阿里是如何做软件集成发布的
  4. iview中的Col在vue/html-self-closing中识别错误
  5. 精确通知,顺序访问——Lock锁比synchronized锁的优势之处
  6. DDD理论学习系列(10)-- 聚合
  7. HTML+CSS+JS实现 ❤️年年有鱼祝福背景特效❤️
  8. 特征图注意力_CV注意力机制论文阅读笔记
  9. 关于URL大小写问题
  10. (转)向浑水(Muddy Waters Research)学习如何调查公司
  11. 金蝶K3 Wise单据导入导出工具使用说明
  12. Oracle Solaris系统,诺禾
  13. 音乐播放器app android,mp3音乐播放器
  14. 数学第一单元计算机思维导图,七年级下册数学第一单元思维导图图片
  15. 猿如意开发工具|python3.7
  16. 使用 flying-saucer-pdf 实现html转换pdf补充
  17. tq2440 lcd 移植
  18. 读“驾奴驾奴你的“职场布朗运动””有感而发
  19. Excel2010数据透视表1
  20. win11剪贴板数据如何删除 Windows清空剪贴板数据的步骤方法

热门文章

  1. 把angular(vue等)项目部署在局域网上
  2. OpenGL® ES 3.0 Programming Guide - Book Website
  3. ARP-Address Resolution Protocol-地址解析协议
  4. 经典语句,看看让心灵宁静
  5. 2013-10-10
  6. 第二十五章补充内容 5 不能为0的变量
  7. YARP+AgileConfig 5分钟实现一个支持配置热更新的代理网关
  8. ASP.NET Core官方文档+源码,这样学效率高10倍!
  9. 我用段子讲.NET之依赖注入(一)
  10. foreach和IEnumerable+yield和IEnumerator