2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml

1. 前言

入门篇我们已经成功运行hello.benchmarks.yml并输出测试结果,本篇我们就hello.benchmarks.yml、以及运行的shell脚本详细解读下其中的含义

2. 剖析hello.benchmarks.yml

2.1. job

  • 在hello.benchmarks.yml中我们定义了一个新的job: server,并指定了仓库信息 ( 远程仓库 ):

repository:https://github.com/doddgu/crank.git # 仓库源branchOrCommit:sample # 分支project: samples/hello/hello.csproj # 项目
  • 并通过import导入了bombardier.yml,其中定义了另外一个job: bombardier,并指定了仓库信息 ( 远程仓库 ):

repository: https://github.com/doddgu/crank.gitbranchOrCommit: sampleproject: src/Microsoft.Crank.Jobs.Bombardier/Microsoft.Crank.Jobs.Bombardier.csprojsourceKey: bombardier # 服务器使用它来重用相同的源文件夹。noBuild: true # 定义 SourceKey时,指示是否仍应进行构建

2.2. scenarios

  • 在hello.benchmarks.yml中我们定义了场景: hello,并为此场景指定了两个任务:

    • 第一个任务名为application,使用的是项目server

    • 第二个任务名为load,并指定使用项目bombardier

2.3. variables 变量

  • 在bombardier.yml中

    • 定义了全局变量: headers、presetHeaders(预设header)

    • 定义了局部变量: connections、warmup、duration、requests、rate、transport、serverScheme等等

  • 在hello.benchmarks.yml中为load定义了局部变量serverPort、path

2.4. profiles 配置

  • 在hello.benchmarks.yml中我们

    • 定义了配置local

    • 并指定了局部变量: serverAddress = localhost

    • 为任务application、load指定了部署作业的endpoint 是 http://localhost:5010 (指定执行任务的Agent地址)

2.5. arguments 参数

  • 在bombardier.yml中与variables同级的配置: arguments,此参数是在启动job后传递的参数,其中定义的全局参数、局部参数信息也都是为构建完整的参数做准备,bombardier真实的参数信息是:

-c {{connections}} -w {{warmup}} -d {{duration}} -n {{requests}} --insecure -l {% if rate != 0 %} --rate {{ rate }} {% endif %} {% if transport %} --{{ transport}} {% endif %} {{headers[presetHeaders]}} {% for h in customHeaders %}{% assign s = h | split : ':' %}--header \"{{ s[0] }}: {{ s[1] | strip }}\" {% endfor %} {% if serverUri == blank or serverUri == empty %} {{serverScheme}}://{{serverAddress}}:{{serverPort}}{{path}} {% else %} {{serverUri}}:{{serverPort}}{{path}} {% endif %} {% if bodyFile != blank and bodyFile != empty %} -f {{bodyFile}} {% endif %}  {% if verb != blank and verb != empty %} -m {{verb}} {% endif %}

3. 改造hello.benchmarks.yml

改造hello.benchmarks.yml,不考虑重用,最原始的代码如下

variables:headers:none: ''plaintext: '--header "Accept: text/plain,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,*/*;q=0.7" --header "Connection: keep-alive"'html: '--header "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" --header "Connection: keep-alive"'json: '--header "Accept: application/json,text/html;q=0.9,application/xhtml+xml;q=0.9,application/xml;q=0.8,*/*;q=0.7" --header "Connection: keep-alive"'connectionclose: '--header "Connection: close"'presetHeaders: nonejobs:bombardier:source:repository: https://github.com/dotnet/crank.gitbranchOrCommit: mainproject: src/Microsoft.Crank.Jobs.Bombardier/Microsoft.Crank.Jobs.Bombardier.csprojsourceKey: bombardiernoBuild: truereadyStateText: Bombardier ClientwaitForExit: truevariables:connections: 256warmup: 15duration: 15requests: 0rate: 0transport: fasthttp # | http1 | http2serverScheme: httpserverAddress: localhostserverPort: 5000path: bodyFile: # path or url for a file to use as the body contentverb: # GET when nothing is specifiedcustomHeaders: [ ] # list of headers with the format: '<name1>: <value1>', e.g. [ 'content-type: application/json' ]arguments: "-c {{connections}} -w {{warmup}} -d {{duration}} -n {{requests}} --insecure -l {% if rate != 0 %} --rate {{ rate }} {% endif %} {% if transport %} --{{ transport}} {% endif %} {{headers[presetHeaders]}} {% for h in customHeaders %}{% assign s = h | split : ':' %}--header \"{{ s[0] }}: {{ s[1] | strip }}\" {% endfor %} {% if serverUri == blank or serverUri == empty %} {{serverScheme}}://{{serverAddress}}:{{serverPort}}{{path}} {% else %} {{serverUri}}:{{serverPort}}{{path}} {% endif %} {% if bodyFile != blank and bodyFile != empty %} -f {{bodyFile}} {% endif %}  {% if verb != blank and verb != empty %} -m {{verb}} {% endif %}"onConfigure: # - job.timeout = Number(job.variables.duration) + Number(job.variables.warmup) + 10;    endpoints: - http://localhost:5010server:source:repository: https://github.com/doddgu/crankbranchOrCommit: sampleproject: samples/hello/hello.csprojreadyStateText: Application started.endpoints: - http://localhost:5010scenarios:hello:application:job: serverload:job: bombardiervariables:serverPort: 5000path: /

4. 解读crank shell

之前我们通过shell执行:

  • crank --config hello.benchmarks.yml --scenario hello --profile local --load.framework net5.0 --application.framework net5.0

    • 其中crank 是固定的、代表:Crank Controller

    • --config:固定的配置,指执行哪个yml配置,每次仅能指定一个yml配置

    • --scenario:固定的配置,设置场景是hello

    • --profile:固定的配置,非必选,可多次设置,指定当前Crank命令申请的配置是local,使用local下配置的所有信息

    • --load.framework: 格式:<任务名>.framework,为任务load指定framework的运行框架版本是net5.0、--application.framework同理

  • 改造hello.benchmarks.yml,因为移除了profile,所以执行: crank --config hello.yml --scenario hello --load.framework net5.0 --application.framework net5.0 即可

查看crank更多文档

5. 疑问

  • 为什么启动crank时要增加--application.framework net5.0?

    • 安装crank要求必须有net5.0的环境,所以指定net5.0不需要再单独安装框架环境

  • 为什么启动crank时不指定framework时默认是netcore3.1呢?

    • 使用记事本打开hello.csproj、Microsoft.Crank.Jobs.Bombardier.csproj 即可了解

  • scenarios节点下application以及load两个节点名称可以更换吗?只能有两个节点?

    • 节点名称不固定,可以更换,也没有限制必须是两个节点,具体多少个节点根据自己的需要来

6. 结尾

通过上面的学习,我们也已经完全的了解了各配置的作用,但对bombardier.yml与开源项目bombardier存在什么样的联系还不清楚,以及为什么叫做bombardier.yml而不是其他名字,并且是如何实现性能指标的输出,接下来就会讲到bombardier.yml与开源项目bombardier的关系,以及wrk.yml与wrk的关系

源码地址: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,欢迎联系我们

c83e4ba9d9e88e5f52e2b16c47bf1b5b.png

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

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

相关文章

计算机应用问题,计算机应用的现状与发展的问题

计算机应用的现状与发展的问题来源&#xff1a;职称阁时间&#xff1a;2018-07-27 11:59热度&#xff1a;这篇论文主要介绍的是计算机应用的现状与发展的问题的相关内容&#xff0c;本文作者就是通过对计算机的应用现状等内容做出详细的阐述与介绍&#xff0c;特推荐这篇优秀的…

(2)从实际项目谈起,基于MEF的插件框架之总体设计

文章版权由作者李晓晖和博客园共有&#xff0c;若转载请于明显处标明出处&#xff1a;http://www.cnblogs.com/naaoveGIS/。 1.MEF框架简介 MEF的全称是Managed Extensibility Framework&#xff08;MEF&#xff09;&#xff0c;其是.net4.0的组成部分&#xff0c;在3.5上也可以…

Avalonia跨平台入门第四篇之Popup在uos下问题

上一篇简单玩耍了Popup,这不正当我洋洋自得的时候前线传来战报:你家伙做的效果在UOS下面有问题;然后直接发来一张捷报:明明在乌班图和优麒麟都没啥问题,单单就你这个UOS牛,结果发现个神奇的特效:开启神奇的特效,果然神奇:来看看最终实现的效果:最终简单的效果先这样吧;以后有时…

C++之用std::nothrow分配内存失败不抛异常

1、std::nothrow介绍 1&#xff09;.malloc分配时&#xff0c;如果内存耗尽分配不出来&#xff0c;会直接返回NULL&#xff1b; 2.&#xff09;早期C版本&#xff0c;new分配时&#xff0c;如果内存耗尽分配不出来&#xff0c;也会直接返回NULL&#xff1b; 我们可以使用关键…

理科都要学大学计算机吗,女生不适合学理科专业?报考这些理科专业,一毕业就会遭到疯抢!...

男学理&#xff0c;女学文&#xff0c;似乎一直以来都是考生们报考专业时所“遵循”的一个主流&#xff0c;因为无论是专业学习知识理论的侧重点&#xff0c;还是未来就业的偏向性&#xff0c;文理科专业都呈现出非常大的差异。女生们或许更适合文科类专业的学习和就业&#xf…

8个使用JavaScript展示图片解决方案

1. JonDesign’s SmoothGallery 2.0 SmoothGallery demo 2. (E)2 Photo Gallery (E)2 Photo Gallery demo 3. jQuery Gallery 4. MooPix 5. Highslide JS Highslide JS demo 6. Flickrshow 7. Galleria Galleria demo 1 - Galleria demo 2 8. LightWindow v2.0

Avalonia跨平台入门第三篇之Popup

前面已经分享了二篇关于Avalonia入门的文章,今天接着去摸索关于Popup的知识点;你还别说一上来就遇到坑了(后台定义的Popup直接黑框):然而在WPF中没有出现这个Bug:最后只能默默的再前台进行定义了:来看看最终实现的效果:后台打开无非就是Open方法就行,最后先来预告下一篇的效果滑…

Swift和Objective-C混编

Swift中调用Objective-C文件 1.新建Swift文件SwiftViewController.swift 2.因为工程为OC编写,第一次创建会提示需要创建"桥接文件" 3.此时的工程会有SwiftViewController.swift文件和HelloWorld-Bridging-Header.h桥接文件 4.检查桥接文件HelloWorld-Bridging-Header…

Java的LockSupport.park()实现分析

LockSupport类是Java6(JSR166-JUC)引入的一个类&#xff0c;提供了基本的线程同步原语。LockSupport实际上是调用了Unsafe类里的函数&#xff0c;归结到Unsafe里&#xff0c;只有两个函数&#xff1a; park&#xff1a;阻塞当前线程(Block current thread),字面理解park&#x…

Avalonia跨平台入门第二篇

前面一篇简单的弄了个Demo去玩耍了一下Avalonia;你还别说效还挺有意思,这不咱们今天接着更深一步的去了解他,来看看效果:在统信UOS下运行效果:环境搭建在统信UOS(多一步开启开发模式):使用开源的PanAndZoom控件&#xff1a;继承Canvas自定义控件,进行网格绘制&#xff1a;最终简…

Performance Metrics(性能指标1)

Performance Metrics(性能指标) 在我们开始旅行本书之前&#xff0c;我必须先了解本书的性能指标和希望优化后的结果&#xff0c;在第二章中&#xff0c;我们探索更多的性能检测工具和性能指标&#xff0c;可是&#xff0c;您得会使用这些工具和明白这些性能指标的意义。 由于业…

可能是.NET领域性能最好的对象映射框架——Mapster

我之前文章提到过 MediatR 的作者 Jimmy Bogard&#xff0c;他也是大名鼎鼎的对象映射框架 AutoMapper 的作者。AutoMapper 的功能强大&#xff0c;在 .NET 领域的开发者中有非常高的知名度和使用率。而今天老衣要提的是另外一款高性能对象映射框架&#xff1a;Mapster——它轻…

Avalonia跨平台入门第一篇

作为一枚屌丝程序员来说最大的爱好就是撸代码,有时候根本停不下来(沉迷工作,无法自拔);因为一直都是WPF开发,后面也摸索了一下Xamarin的东西;这不又看到其他人又在搞什么跨平台;我也是手也很痒痒;就像刚开始摸索Xamarin一样,想又不知如何下手;这不再次迈出了第一步去摸索Avalon…

三角形带优化库nvtrisrip的使用

nvtrisrip是NVIDIA提供的一个开源优化库&#xff0c;这个库可以将三角形顶点索引数组转换为三角形带索引数组。可以极大的提高渲染速度。NVIDIA这个库的官方地址是&#xff1a;http://www.nvidia.com/object/nvtristrip_library.html不过这里代码不全也不够新&#xff0c;推荐从…

angular-ui-tab-scroll

2019独角兽企业重金招聘Python工程师标准>>> A scrollable tab plugin intended for scrolling UI Bootstrap tabset. 功能介绍&#xff1a;http://npm.taobao.org/package/angular-ui-tab-scroll 下载地址&#xff1a;https://github.com/VersifitTechnologies/ang…

为什么?

为什么80%的码农都做不了架构师&#xff1f;>>> 为什么总有那么多的难以忘怀&#xff1f;或许这是前世我们欠下的债吧为什么总觉得别人家的好&#xff1f;却忽视了身边最真实的温暖为什么总是固执的坚持着虚幻的前景&#xff1f;因为就算再小的梦想也有实现的权利为…

抽象类和接口类的区别

2019独角兽企业重金招聘Python工程师标准>>> 一、 抽象类abstract class 1 &#xff0e;抽象类是指在 class 前加了 abstract 关键字且存在抽象方法&#xff08;在类方法 function 关键字前加了 abstract 关键字&#xff09;的类。 2 &#xff0e;抽象类不能被直接实…

浅谈C#字符串构建利器StringBuilder

前言在日常的开发中StringBuilder大家肯定都有用过&#xff0c;甚至用的很多。毕竟大家都知道一个不成文的规范&#xff0c;当需要高频的大量的构建字符串的时候StringBuilder的性能是要高于直接对字符串进行拼接的&#xff0c;因为直接使用或都会产生一个新的String实例&#…

linux之如何在任意目录执行我常用的脚本文件

1、问题 比如我们在ubuntu上开发Android的时候&#xff0c;经常会用到jadx、 pidcat.py ,但是我们希望在任何目录都能执行这些命令&#xff0c; 如果不知道pidcat.py是什么东西的&#xff0c;可以先百度 2、解决方式 1)如果是一个脚本文件&#xff0c;比如pidcat.py这个脚本&…

RTMPdump(libRTMP) 源代码分析 10: 处理各种消息(Message)

2019独角兽企业重金招聘Python工程师标准>>> 注&#xff1a;此前写了一些列的分析RTMPdump&#xff08;libRTMP&#xff09;源代码的文章&#xff0c;在此列一个列表&#xff1a;RTMPdump 源代码分析 1&#xff1a; main()函数RTMPDump&#xff08;libRTMP&#xff…