堪比JMeter的.Net压测工具 - Crank 入门篇

1. 前言

Crank 是.NET 团队用来运行基准测试的基准测试基础架构,包括(但不限于)来自TechEmpower Web 框架基准测试的场景,是2021年.NET Conf 大会上介绍的一项新的项目,其前身是Benchmarks。

Crank目标之一是为开发人员提供一种工具,让他们能够非常轻松地处理性能并衡量潜在的改进。其中一些功能是:

  • 部署和基准测试基于 .NET 或 Docker 容器的多层应用程序

通过指定.Net项目(本地路径或git远程仓库地址),支持直接部署或通过Docker部署应用程序,用于基准测试)

  • 通过Yml配置,不仅仅支持结果存储在 JSON 、SQL Server 中还支持存储到csv文件中以用于图表

目前有小伙伴已经在提议将支持存储在es

  • 支持更改自定义应用程序的Franework环境,测试在不同环境下的性能
  • 收集诊断跟踪信息

2. 核心组成

Crank由Agent、Controller两部分组成

Controller是任务的调度者,可以调度负载任务以及输出结果

Agent是基准代理,任务的实际执行者,接收来自Controller的任务并执行。

3. 安装

欲先工其善 必先利其器,我们先学习下如何安装crank,以及如何验证是否安装成功

3.1. 准备工作

  1. 安装 .NET 5.0.

  2. 打开shell:安装Crank Controller

asciicast

安装命令:

dotnet tool update Microsoft.Crank.Controller --version "0.2.0-alpha.21567.1" --global

验证命令:

crank

  1. 打开shell: 安装Crank Agent

asciicast

安装命令:

dotnet tool update Microsoft.Crank.Agent --version "0.2.0-alpha.21567.1" --global

验证命令:

crank-agent

3.2. 小结

为方便阅读、文章中Crank Controller简称Crank,Crank Agent简称Agent

Agent以及Crank需要根据实际情况安装,可分以下几种情况:

  • 只是为了学习Crank,没有单独的测试环境,则需要分别安装Agent、Controller

  • Agent有单独提供测试环境,则本地不需要安装Agent,只安装Controller即可

  • Agent有单独提供测试环境,且压测任务由ci来触发执行,则本地不需要安装任何配置,通过构建ci任务完成压力计划即可

打开shell:查看Agent、Controller版本

dotnet tool list -g

4. 基础知识

4.1. variables: 参数

variables分为局部参数与全局参数两种类型,在根节点的为全局参数,在其他节点下的是局部参数。

例:

hello.benchmarks.yml > scenarios > hello-load > variables节点下的serverPort以及path以及profiles>local>variables节点下的serverAddress是局部参数

scenarios:hello:application:job: serverload:job: bombardiervariables:serverPort: 5000path: /profiles:local:variables:serverAddress: localhost

bombardier.yml > variables > headers为全局参数

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"'---------------------------------------------------------------------

4.2. profiles: 配置

profiles其实就是配置文件信息,profiles允许被多次使用,这点在可以在文档中找到对应介绍。

Usage: crank [options]Options:-?|-h|--help                       Show help informationThese options are not specific to a Job------------------------------------------------------------------------profile <profile>                Profiles to apply. Can be used multiple times.

命名规则: 建议 *.profiles.yml

4.3. jobs: 任务

将我们要做的事定义为一个job。方便之后重用。此处的事指的是一类事,而不是指特定的某件事。

例如:微软内置定义的bombardier就是一个job,这个job是通过bombardier对其进行基准测试,并将结果记录并输出,而具体针对哪个接口进行基准测试其实并不关心。

job根据应用程序源有分为远程、本地两种。

本地源:

jobs:server: #任务名称,可根据任务作用自行命名source: #任务源localFolder: ../hello project: hello.csproj #要构建的 .NET 项目的文件名readyStateText: Application started. #控制台中通知服务器它已启动的文本

本地源localFolder针对当前运行crank --config执行命令所在的相对路径即可,任务开始后会将本地的项目发送到agent后再执行任务。

远程源

jobs:server:source:repository: https://github.com/dotnet/crankbranchOrCommit: main #远程源执行任务的分支project: samples/hello/hello.csproj #要构建的 .NET 项目的文件名,格式:相对根的相对路径+项目名.csprojreadyStateText: Application started.

远程源会将仓库信息发送到Agent,Agent会先将仓库下载下来并切换到指定的分支后再执行构建任务启动项目

4.4. scenarios: 场景

job关心的是一类事,而特定的事情并不关心,那具体的事是谁比较关心呢,没错那就是场景,也就是scenarios,scenarios通过多个job来完成对指定场景的基准测试,做的是具体任务的编排

4.5. imports: 导入

imports为我们提供了yml重用的可能,因为有imports的支持,我们才可以将公共的yml提取到一个单独的yml中,通过imports将使用到的yml导入即可,与js、css的导入有异曲同工之妙

4.6. 小结

在crank中,variables、profiles都不是必须的,但因为它们的存在,才使得我们可以以面向对象的思想开发,可以通过新增变量或指定配置完成基准测试,这块后面的实战中会有详细解释

5. 入门

经过之前的学习,我们对crank的基本配置也有了一定的了解,那接下来的时间,我们先试着学习下官方已经给我们准备好的Sample,下面的教程也会详细讲解一下各个配置的作用,希望能通过下面的学习了解到Crank的工作基本原理

5.1. 启动Agent

asciicast

crank-agent --dotnethome "/home/{your-account}/dotnet"

5.1.0.1. 启动Agent并指定dotnet环境

  • 格式:crank-agent –dotnethome “dotnet安装地址”

  • crank-agent --dotnethome “C:\Program Files\dotnet” (windows)

  • crank-agent --dotnethome “/usr/share/dotnet” (Linux)

  • 在启动agent时,强烈建议大家增加dotnethome 配置,为agent运行指定环境,以免运行任务时由于环境问题而卡在install sdk这里

  • 因演示机器本地dotnet的使用的是安装路径为/home/gushoudao/dotnet,所以视频中运行的命令有所不同,这块还需要根据本地的实际情况自行调整路径即可 (因视频录制原因,在录制结束后会停止agent,我们真实使用中启动后不需要退出,一旦退出agent,就无法执行任务)

5.1.0.2. 启动Agent并指定不清理临时文件

  • crank-agen --no-cleanup (指定不清理临时文件)

默认agent执行任务结束后会删除当前任务执行过程中产生的临时文件

5.1.0.3. 启动Agent并指定构建任务的最大持续时间

  • crank-agent --build-timeout

默认构建任务的最大持续时间为10 minutes

更多配置点击查看

5.2. 新建hello.benchmarks.yml配置

配置文件源码来自hello.benchmarks.yml

imports:- https://raw.githubusercontent.com/doddgu/crank/sample/src/Microsoft.Crank.Jobs.Bombardier/bombardier.ymljobs:server:source:repository: https://github.com/doddgu/crankbranchOrCommit: sampleproject: samples/hello/hello.csprojreadyStateText: Application started.scenarios:hello:application:job: serverload:job: bombardiervariables:serverPort: 5000path: /profiles:local:variables:serverAddress: localhostjobs: application:endpoints: - http://localhost:5010load:endpoints: - http://localhost:5010

5.3. 启动任务

启动agent(打开放在一边):

crank-agent --dotnethome "/usr/share/dotnet"

启动任务(另起一个新的Shell):

git clone https://github.com/doddgu/crank.git
cd crank
git checkout sample
crank --config ./samples/hello/hello.original.benchmarks.yml --scenario hello --load.framework net5.0 --application.framework net5.0

然后我们等待片刻会输出以下结果

crank-agent:

asciicast

crank:

asciicast

| load                  |                |
| --------------------- | -------------- |
| CPU Usage (%)         | 39             |  CPU使用率
| Cores usage (%)       | 631            |  多核CPU使用率
| Working Set (MB)      | 35             |  内存使用率
| Private Memory (MB)   | 35             |  进程使用的私有内存量
| Build Time (ms)       | 4,853          |  构建应用程序需要多长时间(毫秒)
| Start Time (ms)       | 386            |  启动应用程序需要多长时间(毫秒)
| Published Size (KB)   | 66,731         |  已发布应用程序的大小 (KB)
| .NET Core SDK Version | 5.0.403        |  .Net Core SDK 版本
| ASP.NET Core Version  | 5.0.12+0bc3c37 |  .Net Core版本
| .NET Runtime Version  | 5.0.12+7211aa0 |  .Net运行时版本
| First Request (ms)    | 172            |  第一个请求耗时(这里请求是Get)
| Requests              | 2,086,594      |  总发送请求数
| Bad responses         | 0              |  糟糕请求数(响应状态码不是2**也不是3**)
| Mean latency (us)     | 1,833          |  平均延迟时间
| Max latency (us)      | 89,001         |  最大延迟时间
| Requests/sec          | 138,067        |  每秒支持请求数
| Requests/sec (max)    | 255,442        |  每秒最大支持请求数

当你能输出以上信息的时候,证明了你已经成功跑通了整个流程

在上面我们可以很清楚的看到场景hello下的测试结果,其中包含CPU使用率、多核CPU的使用率、内存使用率以及每秒执行的请求数等等指标

在这一刻是不是突然觉得这个crank挺强大的,虽然还不清楚具体是咋做到的,但是真的很赞!!在这一刻是不是对它来了兴趣,想知道它到底可以做什么,为什么可以输出以上的结果?

6. 结尾

为确保后续不会因更新导致按照文档操作不可用,源码从官方源Fork了一份,其中绝大多数来自官方提供的Sample、部分文件为了更好的满足个人习惯,会在一定程度上进行调整。

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

参考链接:

  • https://github.com/dotnet/crank
  • https://github.com/aspnet/Benchmarks
  • https://www.youtube.com/watch?v=2IgfrnG-128

开源地址

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 team
来源:CSDN
原文:https://blog.csdn.net/MASAteam/article/details/123352810
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

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

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

相关文章

【GlobalMapper精品教程】016:按照指定字段批量生成不同用地类型的矢量图层

Globalmapper中可以很方便的根据指定的字段,对矢量数据进行批量提取,生成不同类型的多个矢量数据,本文以土地利用现状数据为例,基于DLMC,提取出不同用地类型的矢量图层。 参考阅读:【ArcGIS遇上Python】ArcGIS Python按照指定字段批量筛选不同类型的图斑(以土地利用数据…

javascript闭包—围观大神如何解释闭包

闭包的概念已经出来很长时间了&#xff0c;网上资源一大把&#xff0c;本着拿来主意的方法来看看。 这一篇文章 学习Javascript闭包&#xff08;Closure&#xff09; 是大神阮一峰的博文&#xff0c;作者循序渐进&#xff0c;讲的很透彻。下面一一剖析。 1.变量的作用域 变量的…

298. Binary Tree Longest Consecutive Sequence

题目&#xff1a;Given a binary tree, find the length of the longest consecutive sequence path. The path refers to any sequence of nodes from some starting node to any node in the tree along the parent-child connections. The longest consecutive path need to…

Educational Codeforces Round 37 (Rated for Div. 2)

Educational Codeforces Round 37 (Rated for Div. 2) A.Water The Garden 题意&#xff1a;Max想给花园浇水。花园可被视为长度为n的花园床&#xff0c;花园内共有k个水龙头&#xff0c;分别在花园的xi&#xff08;0≤xi<n&#xff09;处&#xff0c;在j秒内花园的[xi-(j-1…

详解 .Net6 Minimal API 的使用方式

随着 .Net6 的发布&#xff0c;微软也改进了对之前 ASP.NET Core 构建方式&#xff0c;使用了新的 Minimal API 模式。以前默认的方式是需要在 Startup 中注册 IOC 和中间件相关&#xff0c;但是在 Minimal API 模式下你只需要简单的写几行代码就可以构建一个 ASP.NET Core的We…

.NET 20周年专访 - 张善友:.NET 技术是如何赋能并改变世界的

点击蓝字关注我们今年是 .NET 发布20周年&#xff0c;值此20周年之际&#xff0c;微软 Reactor 特别策划了 .NET 20周年系列主题专访。我们邀请了数位中国 .NET 领域的技术专家以及社区名人&#xff0c;来聊聊他们与 .NET 的情缘、认识 .NET 的契机、选择 .NET 的理由&#xff…

【ArcGIS错误异常100问】之005:ArcGIS字段计算器python中文编码问题解决

问题描述&#xff1a; 现因工作的需要&#xff0c;对照2017最新版&#xff1a;《土地利用现状分类》&#xff08;GBT 21010-2017&#xff09;&#xff0c;需根据DLMC对DLBM进行批量修改&#xff0c;如旱地是0103&#xff0c;其他林地是0307等&#xff0c;共计19种用地类型。 问…

【ArcGIS微课1000例】0055:根据图层创建自定义图例符号案例教程

在利用ArcGIS作图时,有时候需要根据线状或面状图层自己的矢量形状去创建图例项目符号,本文讲解根据图层创建自定义图例符号。 本实验使用的数据为配套案例数据包中的0055.rar中的水库数据。 文章目录 1. 添加“新建图例图面形状”工具2. 根据图层形状创建符号3. 绘制形状符号…

jQuery 3.3.1已经发布,开发团队正在准备4.0版本

\看新闻很累&#xff1f;看技术新闻更累&#xff1f;试试下载InfoQ手机客户端&#xff0c;每天上下班路上听新闻&#xff0c;有趣还有料&#xff01;\\\jQuery 3.3.1已经发布&#xff0c;其中包含了许多新特性也提出要移除几个之前的特性&#xff0c;移除一些特性是为了jQuery …

C#.NET版本、Visual Studio版本对应关系

C#版本.NET版本Visual Studio版本发布日期特性C# 1.0.NET Framework 1.0Visual Studio .NET 20022002-02-13委托、事件C# 1.1.NET Framework 1.1Visual Studio .NET 20032003-04-24APM&#xff08;异步编程模型&#xff09;C# 2.0.NET Framework 2.0Visual Studio 20052005-11-…

真魔法!图形化管理 Kafka 超轻量的自动化工具

Kafka Magic[1] 是一个用于处理 Apache Kafka 集群的 GUI 工具。它可以查找和显示消息、在 Topic 之间转换和移动消息、查看和更新模式、管理 Topic 以及自动化复杂任务。Kafka Magic 通过方便的用户界面促进 Topic 管理、QA 和集成测试。Kafka Magic Community Edition 可免费…

前端工程构建工具——Yeoman

一、Yeoman 简介 通常在开发新项目时我们都需要配置工程环境&#xff0c;开发目录&#xff0c;需要下载一些库、框架文件&#xff08;如 jQuery、Backbone 等&#xff09;&#xff0c;配置编译环境&#xff08;Less、Sass、Coffeescript等&#xff09;&#xff0c;甚至还要配置…

【FME实战教程】001:FME2020中文安装图文教程(附安装包下载)

文章目录1. 安装license2. 安装FME Desktop3. 安装中文语言4. FME软件下载地址1. 安装license 打开软件安装包中的fme-flexnet-win-x64.msi&#xff0c;如下图所示&#xff1a; 点击Next。 点击Next。 单击install。 点击finish&#xff0c;完成。 &#xff08;1&#xff09;修…

算法导论 第三部分——基本数据结构——第14章:数据结构的扩张

本章通过扩张红黑树构造出两种数据结构&#xff1a;动态顺序统计和区间树。 1、动态顺序统计&#xff1a;查找倒数第i小的数据 复杂度为 lg(n) 为什么是扩张红黑树而不是搜索二叉树或者二叉树&#xff1f; 相对于搜索二叉树&#xff0c;红黑树的平衡性更好&#xff0c;高度在l…

/hgfs下无共享文件夹?/mnt下没有hgfs文件夹?vmhgfs-fuse:找不到命令?

前言&#xff1a;最近在使用linux的过程中&#xff0c;需要在宿主操作系统与客户操作系统间建立共享文件夹&#xff0c;遇到了些许问题&#xff0c;在网上参考了许多文章与各种尝试后&#xff0c;现得以解决&#xff0c;分享如下。1、系统环境&#xff1a;宿主操作系统&#xf…

GraphQL入门有

本文将从GraphQL是什么&#xff0c;为什么要使用GraphQL&#xff0c;使用GraphQL创建简单例子&#xff0c;以及GraphQL实战&#xff0c;四个方面对GraphQL进行阐述。说得不对的地方&#xff0c;希望大家指出斧正。 github项目地址&#xff1a;https://github.com/Charming2015/…

对话庄表伟:开源第一课

庄表伟目前就职于华为的开源管理中心。自2014年开源社成立之初&#xff0c;他便友情参与了开源社的筹办工作。2017年&#xff0c;开源社转型为完全由个人成员组成的组织&#xff0c;庄表伟就以个人身份加入了开源社。作为开源社理事&#xff0c;当被问到“为什么要参选”时&…

【FME实战教程】002:FME完美实现CAD数据转shp案例教程(以三调土地利用现状数据为例)

FME完美实现CAD数据转shp案例教程&#xff08;以三调土地利用数据为例&#xff09; 文章目录1. cad数据预览2. 转换过程3. shp数据预览1. cad数据预览 2. 转换过程 &#xff08;1&#xff09;打开FME Desktop2020中文软件&#xff0c;点击【新建】。 &#xff08;2&#xff09…

Linux学习之01_基础命令介绍

初学Linux&#xff0c;还在摸索中&#xff0c;在这个过程中希望能记录下学习到的东西&#xff0c;参考的的书籍为《鸟哥的Linux私房菜》 在这里学到的主要命令有这几个&#xff1a; data cal bc man shutdown sync 1、基础命令操作 data----显示日期与实践的命令 cal----显示日…

穷举算法实例

public static void main(String[] args) {Scanner scnew Scanner(System.in);System.out.println("输入头的个数:");int headsc.nextInt();System.out.println("输入腿的个数:");int footsc.nextInt();for(int i0;i<head;i){//假设兔子的数量为iint jh…