4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2

1. 前言

上一篇文章我们了解了bombardier,并知道了bombardier.yml与开源项目bombardier的关系,接下来的文章我们了解一下wrk、wrk2,并对比一下它们与bombardier的关系

2. 认识wrk

wrk是一种现代 HTTP 基准测试工具,能够在单个多核 CPU 上运行时产生大量负载。它结合了多线程设计和可扩展的事件通知系统,例如 epoll 和 kqueue。

其支持参数:

-c, --connections: total number of HTTP connections to keep open witheach thread handling N = connections/threads-d, --duration:    duration of the test, e.g. 2s, 2m, 2h-t, --threads:     total number of threads to use-s, --script:      LuaJIT script, see SCRIPTING-H, --header:      HTTP header to add to request, e.g. "User-Agent: wrk"--latency:     print detailed latency statistics--timeout:     record a timeout if a response is not received withinthis amount of time.

基础用法:

运行了30秒的基准测试, 使用2个线程、100个http连接:

wrk -t2 -c100 -d30s http://127.0.0.1:8080/index.html

进阶用法:

每次发送三个http请求:

wrk -t2 -c100 -d30s --script ./pipeline.lua http://127.0.0.1:8080

新建pipeline.lua

-- example script demonstrating HTTP pipelininginit = function(args)local r = {}r[1] = wrk.format(nil, "/?foo")r[2] = wrk.format(nil, "/?bar")r[3] = wrk.format(nil, "/?baz")req = table.concat(r)
endrequest = function()return req
end

3. 认识wrk2

wrk2是一个主要基于 wrk 的 HTTP 基准测试工具。是一个被 wrk 修改以产生恒定的吞吐量负载,并将延迟细节精确到高 9s(即当运行足够长的时间时可以产生准确的 99.9999%'ile)。除了 wrk 的参数之外,wrk2 通过 --rate 或 -R 参数(默认为 1000)采用吞吐量参数(每秒总请求数)

除支持wrk的参数之外,还支持参数:

-R, --rate: 采用吞吐量参数(每秒总请求数),默认为1000

基础用法:

运行了30秒的基准测试, 使用2个线程、100个http连接、并保持每秒2000个请求的恒定吞吐量:

wrk -t2 -c100 -d30s -R2000 http://127.0.0.1:8080/index.html

高级用法与wrk一致,此处忽略不写

我们使用wrk2测试一下百度的压测情况

安装:

sudo apt install wget
sudo wget https://aspnetbenchmarks.blob.core.windows.net/tools/wrk2

运行:

./wrk2 -d 3s -c 200 -t 200 -R 10 -L https://www.baidu.com

f60ddc8b3cb498020ef5fc93b967a4db.png

输出了本次请求每秒请求次数、吞吐量以及详细情况:

  • Requests/sec: 每秒请求次数

  • Transfer/sec: 每秒吞吐量

4. 了解Microsoft.Crank.Jobs.Wrk

在Microsoft.Crank.Jobs.Wrk项目中Program.cs

  1. 检查平台是否是64位的Linux系统、并检查参数是否满足要求

  2. 通过HttpClient发送请求,并记录第一次发送请求所消耗的时间

  3. 下载wrk,并设置wrk是可执行的

  4. 通过yml传递过来的参数构建完整的wrk命令

  5. 将输出的结果使用追加到stringBuilder上,再赋值给output,

  6. 通过正则匹配结果,最后通过BenchmarksEventSource存储并输出到控制台或数据库、csv、json中

其中:

  • connections: 每个线程处理时保持打开的 HTTP 连接总数 N = 连接数/线程数

  • serverUri: 自定义url,如果此参数存在,则请求地址为: {serverUri}:{serverPort}{path}

  • serverPort: 服务端口

  • serverScheme: 服务的Scheme,默认http、支持http、https两种

  • serverAddress: 服务地址、不包含http、例如: www.baidu.com,如果serverUri存在,此配置无效,如果不存在,请求格式为: {serverScheme}://{serverAddress}:{serverPort}{path}

  • path: 服务接口地址,不包含域,例如: /api/check/healthy

  • warmup: 预热时间,默认15s,与执行duration类似,而并非压测次数

    • 当warmup > 0时,会先预热warmup秒后再执行一次压测,第二次的压测才是最后返回的结果

    • 当warmup = 0时,不进行预热,直接开始压测

  • duration: 测试时长,默认15s

  • threads: 线程数、默认:32

  • customHeaders: 自定义headers,如果预设headers中没有需要的header,则通过重写customHeaders,以完成自定义header的目的

  • pipeline: 管道数量,默认为1,当大于1时,支持同时发送多个请求

  • script: 如果pipeline不大于1时,支持自定义lua脚本以及lua参数{scriptArguments}

5. 总结

优势:

  • 支持lua脚本,支持动态参数或者更改请求等复杂操作

  • 使用C语言开发、性能高

劣势:

  • lua脚本存在学习成本

wrk.yml的存在是为Microsoft.Crank.Jobs.Wrk提供配置参数,Microsoft.Crank.Jobs.Wrk通过调用开源项目wrk实现压测,并将压测结果通过BenchmarksEventSource存储并输出到控制台或数据库、csv、json中

wrk2是基于wrk二次开发,拥有所有wrk的配置,并且支持吞吐量限制,bombardier、wrk、wrk2都是http基准测试工具,丰富了crank对于Http的基准测试能力,三者之间并无优劣之分,根据三者之间的优劣势自行选择适合自己的即可

源码地址:https://github.com/doddgu/crank/tree/sample

开源地址

MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks

MASA.Contrib:https://github.com/masastack/MASA.Contrib

MASA.Utils:https://github.com/masastack/MASA.Utils

MASA.EShop:https://github.com/masalabs/MASA.EShop

MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor

如果你对我们的 MASA Framework 感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们

b0522ed5f57456682f8c1087f1f2bb80.png

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

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

相关文章

dispatchTouchEvent onInterceptTouchEvent onTouchEvent区分

1. dispatchTouchEvent 是处理触摸事件分发,执行super.dispatchTouchEvent(ev),事件向下分发。 2. onInterceptTouchEvent是ViewGroup提供的方法,默认返回false,返回true表示拦截。 3. onTouchEvent是View中提供的方法,ViewGroup也…

Avalonia跨平台入门第二十篇之语音播放问题

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放;今晚加个班来解决…

递归算法浅谈

递归算法 程序调用自身的编程技巧称为递归( recursion)。   一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题类似的规模较小的问题来求解,递归策略仅仅需少量…

ThoughtWorks技术雷达专区

作为一家服务于全球不同类型的IT专业服务公司,ThoughtWorks从未停止过对卓越技术的追求,为此,ThoughtWorks的全球技术委员会(TAB)会定期讨论技术战略,并将其绘制成一份能够体现技术趋势的雷达图,它相当于当下技术领域的…

腾讯视频VIP周卡深圳地区免费领!附非深圳免费领腾讯视频会员攻略

深圳今天开始,暂停了所有公共交通,小区开始封闭管理,大家都居家办公,腾讯官方今天给深圳地区用户免费发放7天腾讯视频VIP会员,居家期间,可以追剧了!这是腾讯官方给深圳地区的抗疫福利&#xff0…

SQL Server 权限的分类

SQL Server 的权限可以分三类 第一类 server 层面上的: select * from sys.fn_builtin_permissions(default) where class_desc like server; 第二类 database 层面: select * from sys.fn_builtin_permissions(default)    where class_desc like d…

Redis集群监控RedisClusterManager

Redis集群监控RedisClusterManagerRedisClusterManager监控Redis集群1234环境要求:Java8jdk配置这里略过RedisClusterManager 下载地址:https://git.oschina.net/yanfanVIP/RedisClusterManager/releases1234567891011121314151617181920212223242526272…

Visual Studio怎么使用中文帮助文档

今天给大家带来vs中怎么使用帮助文档?事情起因是这样的,上周有个哥们问我问题,字符串怎么分割啊,我当时有点忙,我就说你去看看帮助文档。然后过了三十秒 我看见他打开了百度。。。。。。我郁闷了 ,我说你直…

王道408数据结构——第六章 图

文章目录一、图的基本概念二、图的储存邻接矩阵邻接表十字链表邻接多重表三、图的基本操作四、图的遍历广度优先搜索(BFS)深度优先搜索(DFS)图的遍历和图的连通性五、最小生成树Prim算法Kruskal算法六、最短路径Dijkstra求单源最短…

使用 python 的 urllib2和 urllib模块爆破 form 表单的简易脚本

python 的 http 中 urllib2和 urllib模块在web 表单爆破的使用方法脚本中还增加了 urllib2和 urllib模块如何添加代理的方法# -*- coding: utf-8 -*- import urllib2 import urllib import timedef brute_force(user, password):#strip() 方法用于移除字符串头尾指定的字符&…

如何在 ASP.NET Core 中为同一接口配置不同的实现

前言通常&#xff0c;我们使用依赖注入时&#xff0c;一个接口仅对应一种实现&#xff0c;使用时可以直接得到实现类的实例&#xff0c;类似这样&#xff1a;services.AddScoped<IServiceA,ServiceA>();public WeatherForecastController(IServiceA service) { }但是&…

分析windows宿主机Ping不通linux虚拟机的其中一种情况

ping不通的情况是由于设置网络选项的时候&#xff0c;可以看到界面名称的选择如下(当前选择的是无线网卡驱动): ping得通的情况是由于设置网络选项的时候&#xff0c;可以看到界面名称的选择如下(当前选择的是有线网卡驱动): 分析原因是由于电脑有两个网卡驱动&#xff0c;一个…

同事都说有SQL注入风险,我非说没有

前言现在的项目&#xff0c;在操作数据库的时候&#xff0c;我都喜欢用ORM框架&#xff0c;其中EF是一直以来用的比较多的&#xff1b;EF 的封装的确让小伙伴一心注重业务逻辑就行了&#xff0c;不用过多的关注操作数据库的具体细节。但是在某些场景会选择执行SQL语句&#xff…

​【v2.x OGE-example 第二节】 实体参数

【v2.x OGE-example 第二节】 实体参数1. 位置&#xff1a;Drawing_example --> SpriteParameters2. 类名&#xff1a;SpriteParameters(1)旋转精灵&#xff1a;sprite.setRotation(float pRotation) 设置旋转角度sprite.setRotationCenter(float pRotationCenterX, float p…

王道408数据结构——第七章 查找

文章目录一、基本概念二、顺序查找&#xff08;线性查找&#xff09;一般线性表的顺序查找有序表的顺序查找二、折半查找&#xff08;二分查找&#xff09;三、分块查找&#xff08;索引顺序查找&#xff09;四、B树五、B树六、散列表构造散列函数1. 直接定址法2. 除留取余法3.…

设置utf8编码问题

注意&#xff1a;乱码和request的具体实现类有关&#xff0c;现在已经查到的是RequestDispatcher.forward调用前使用的是org.apache.catalina.connector.RequestFacade类而RequestDispatcher.forward调用后使用的是org.apache.catalina.core.ApplicationHttpRequest&#xff0c…

王道408数据结构——第八章 排序

文章目录一、排序定义二、插入排序——直接插入排序1. 描述2. 代码和示例3. 空间效率4. 时间效率5. 稳定性6. 适用性三、插入排序——折半插入排序1. 描述2. 时间效率3. 稳定性四、插入排序——希尔排序&#xff08;缩小增量排序&#xff09;1. 描述2. 代码和示例3. 空间效率4.…

Avalonia跨平台入门第二十一篇之玩耍CEF

在前面分享的几篇中咱已经玩耍了Popup、ListBox多选、Grid动态分、RadioButton模板、控件的拖放效果、控件的置顶和置底、控件的锁定、自定义Window样式、动画效果、Expander控件、ListBox折叠列表、聊天窗口、ListBox图片消息、窗口抖动、语音发送、语音播放、语音播放问题;今…

golang实现自定义驱动的Cache

近期在写 ActivedRouter项目的时候需求一个缓存模型&#xff0c;要求缓存模型支持不同驱动,例如:memory、file、redis、mysql&#xff0c;实现思路代码如下: cache.go文件,定义缓存对外接口 //ActivedRouter //Author:usher.yue //Amail:usher.yuegmail.com //TencentQQ:422366…

【自定义控件】c#winform自定义控件实现标签控件

介绍首先我们设计这个控件的时候要明白控件是怎样交互的&#xff0c; 熟悉b站的小伙伴应该知道 &#xff0c;我们上传视频的时候会去选择标签 &#xff0c;我们输入标签文本 按下回车就代表该标签已经添加成功了&#xff0c;效果图如下&#xff01;控件拆分我们首先拆分一下该控…