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

安装命令:

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

验证命令:

crank
  1. 打开shell: 安装Crank Agent

安装命令:

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

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:

crank:

| 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 Framework 感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们

堪比JMeter的.Net压测工具 - Crank 入门篇相关推荐

  1. 7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么

    1. 前言 通过上面的学习,我们已经了解清楚crank的职责以及作用,那么我们重新回来思考一下,crank能为我们带来什么? 2. Crank带来了什么? 为分布式压测提供了解决方案.可以模拟更高强度 ...

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

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

  3. 6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈

    1. 前言 上面我们已经做到了接口以及场景压测,通过控制台输出结果,我们只需要将结果收集整理下来,最后汇总到excel上,此次压测报告就可以完成了,但收集报告也挺麻烦的,交给谁呢-- 找了一圈.没找到 ...

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

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

  5. 常用的HTTP服务压测工具

    文章目录 一.压测介绍 1.简介 2.压测相关术语 3.压测常用工具 二.压测工具介绍 1.ab压测 1.1 介绍 1.2 ab压测使用 2.wrk压测 2.1 介绍 2.2 安装 2.3 wrk压测 ...

  6. jmeter constant timer 如何添加_阿里巴巴在开源压测工具 JMeter 上的实践和优化

    Apache JMeter 是 Apache 旗下的开源压测工具,创建于 1999 年初,迄今已有超过 20 年历史.JMeter 功能丰富,社区(用户群体)庞大,是主流开源压测工具之一. 性能测试通 ...

  7. 压测工具Jmeter入门使用

    一.创建一个基础的Web测试 1. 测试内容 模拟五个用户请求2次指定的http接口,并且重复2次. 也就是总共请求有5 * 2 * 2 = 20 次 要构建本次内容需要用到Jmeter的元素:线程组 ...

  8. jmeter,TCPCopy,loadrunner 等测试压测工具使用教程

    2.JMeter环境设置 – Jmeter中文网 Apache JMeter - User's Manual: Getting Started JMeter学习(一)工具简单介绍 - 阳光温暖了心情 ...

  9. Jmeter压测工具详解

    Jmeter压测工具详解 1. Jmeter概述 1.1 Jmeter简介 1.2 Jmeter适用场景 2. Jmeter安装配置 2.1 下载安装 2.2 环境配置(可不配) 2.3 Jmeter ...

最新文章

  1. Codeforces 1408 D. Searchlights(优化DP、思维)
  2. 丹麦见闻(转自王重合原创)
  3. STL中算法锦集(四)
  4. 原生JS字符串操作方法汇总
  5. android引入开源项目方法,和解决android-support-v4.jar冲突问题
  6. javascript Date对象
  7. geotools 读取shp属性过滤_Flink进阶之使用布隆过滤器实现UV统计
  8. OpenCV中的级联分类器Cascade Classifier(面部识别)
  9. python华为认证_HCIA-AI华为认证AI工程师在线课程题目及参考答案
  10. 物料编码在PDM与ERP集成中的应用研究
  11. Godot3游戏引擎入门之十:介绍一些常用的节点并开发一个小游戏(中)
  12. 当不知轴承型号时如何寻找轴承故障频率_专家总结的齿轮箱滚动轴承故障诊断方法,值得收藏!...
  13. c语言 long double输出,printf和long double
  14. android实现一键锁屏
  15. Cadence Vitruoso Layout绘制版图
  16. laragon 更换php的版本
  17. 初学Vue(全家桶)-第16天(vue2):插槽
  18. 我是如何从功能测试成功转型自动化测试人员的?
  19. 发现个下载Sailfish OS源码的地方
  20. 【Python+Pycharm】单词底部有波浪线,提示typo in word时

热门文章

  1. Qt经验积累:常见的驱动打包处理方法
  2. 全球五大顶级域名一周统计:7月第三周新增超9万个
  3. java中自定义表单和流程_让驰骋工作流程引擎 ccbpm使用自定义表单来实现自己的业务逻辑....
  4. 黑马C++设计模式2
  5. 003Java语言环境搭建
  6. vmware 克隆后Linux没有eth网卡只有lo
  7. 02 JRE与JDK
  8. Android:源码环境编译自定义的APP到ROM(System Image)中
  9. hdu 1460 完数
  10. 关于Tomcat5.5中EL表达式无效的解决办法