目录

  1. 堪比JMeter的.Net压测工具 - Crank 入门篇
  2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml
  3. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识bombardier
  4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2
  5. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 接口以及场景压测
  6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈
  7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - 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

安装命令:

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: server
load:
job: bombardier
variables:
serverPort: 5000
path: / 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 information These 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/crank
branchOrCommit: main #远程源执行任务的分支
project: samples/hello/hello.csproj #要构建的 .NET 项目的文件名,格式:相对根的相对路径+项目名.csproj
readyStateText: 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.yml jobs:
server:
source:
repository: https://github.com/doddgu/crank
branchOrCommit: sample
project: samples/hello/hello.csproj
readyStateText: Application started. scenarios:
hello:
application:
job: server
load:
job: bombardier
variables:
serverPort: 5000
path: / profiles:
local:
variables:
serverAddress: localhost
jobs:
application:
endpoints:
- http://localhost:5010
load:
endpoints:
- http://localhost:5010

5.3. 启动任务

打开shell输入:

crank --config hello.benchmarks.yml --scenario hello --profile local

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

| 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

参考链接:

开源地址

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,欢迎联系我们

1. 堪比JMeter的.Net压测工具 - Crank 入门篇的更多相关文章

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

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

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

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

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

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

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

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  5. 5. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 接口以及场景压测

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

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

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

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

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  8. jmeter的dubbo压测,依赖jar包要放到执行机的lib/ext下

    对于jmeter的dubbo压测场景的master-slave结构: 即master的jmeter进行任务的下发和报告的生成,slave进行任务的执行 因为dubbo压测需要依赖很多三方jar包,那么 ...

  9. HTTP 2.0 之压测工具 Jmeter

    年后,德国总部工业平台要做中国本地化,德国的同事过来给我们展示日志的时候,无意间看到了他们应用日志里的 HTTP/2,下意识到,原来他们都已经提供Http 2.0的服务了. 那么问题来了,除了h2lo ...

随机推荐

  1. CTF中的变量覆盖问题

    0x00 前言 最近在干代码审计,于是就把之前学习的CTF题目中有关变量覆盖的题目结合下进一步研究. 通常将可以用自定义的参数值替换原有变量值的情况称为变量覆盖漏洞.经常导致变量覆盖漏洞场景有:$$使 ...

  2. 《手把手教你》系列技巧篇(五十六)-java+ selenium自动化测试-下载文件-上篇(详细教程)

    1.简介 前边几篇文章讲解完如何上传文件,既然有上传,那么就可能会有下载文件.因此宏哥就接着讲解和分享一下:自动化测试下载文件.可能有的小伙伴或者童鞋们会觉得这不是很简单吗,还用你介绍和讲解啊,不说就 ...

  3. 在Linux系统(centos7)中,安装VScode,并在VScode上编写HTML网页

    [实验目的] 在Linux系统中,搭建编写HTML网页的环境.在VS code官网上,下载VS code安装程序,进行安装.在VS code软件中编写HTML页面,并正确运行. [实验步骤] 1)   ...

  4. 切换不同的echarts时,出现图标缩小,报警告,Can’t get dom width or height!

    出现这样的原因是因为,在切换的时候,图表所对应的标签还没有显示出来,最好将代码放在$nextick里面执行,并且,采用使用v-if进行切换 转载:https://www.pianshen.com/ar ...

  5. 科技爱好者周刊(第 176 期):中国法院承认 GPL 吗?

    这里记录每周值得分享的科技内容,周五发布. 本杂志开源(GitHub: ruanyf/weekly),欢迎提交 issue,投稿或推荐科技内容. 周刊讨论区的帖子<谁在招人?>,提供大量程 ...

  6. rsync实时备份监控命令(详细大全)

    目录 一:rsync介绍 1.rsync简介 2.rsync特性 3.rsync应用场景 4.rsync的传输方式 5.Rsync传输模式 二:RSYNC使用参数 三:参数使用案例 一:rsync介绍 ...

  7. RMAN-20201: datafile not found in the recovery catalog

    oracle恢复报错如下: Recovery Manager: Release 10.2.0.4.0 - Production on Fri Aug 28 14:31:31 2015 Copyrigh ...

  8. 使用Canny+hough实现钱币检测

    目录 Canny边缘提取算法实现 霍夫变换实现 参考 这个是北京邮电大学<计算机视觉>的一门作业: Canny边缘提取算法实现 首先定义一个Canny类 其init函数是: class C ...

  9. 利用application在页面中显示访问次数

    在jsp页面中实现. <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  10. Java线程池实现原理及其在美团业务中的实践(转)

    转自美团技术团队:https://tech.meituan.com/2020/04/02/java-pooling-pratice-in-meituan.html 随着计算机行业的飞速发展,摩尔定律逐 ...