堪比 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. 准备工作
安装 .NET 5.0.
打开 shell:安装 Crank Controller
安装命令:
验证命令:
打开 shell: 安装 Crank Agent
安装命令:
验证命令:
3.2. 小结
为方便阅读、文章中 Crank Controller 简称 Crank,Crank Agent 简称 Agent
Agent 以及 Crank 需要根据实际情况安装,可分以下几种情况:
只是为了学习 Crank,没有单独的测试环境,则需要分别安装 Agent、Controller
Agent 有单独提供测试环境,则本地不需要安装 Agent,只安装 Controller 即可
Agent 有单独提供测试环境,且压测任务由 ci 来触发执行,则本地不需要安装任何配置,通过构建 ci 任务完成压力计划即可
打开 shell:查看 Agent、Controller 版本
4. 基础知识
4.1. variables: 参数
variables 分为局部参数与全局参数两种类型,在根节点的为全局参数,在其他节点下的是局部参数。
例:
hello.benchmarks.yml > scenarios > hello-load > variables 节点下的 serverPort 以及 path 以及 profiles>local>variables 节点下的 serverAddress 是局部参数
bombardier.yml > variables > headers 为全局参数
4.2. profiles: 配置
profiles 其实就是配置文件信息,profiles 允许被多次使用,这点在可以在文档中找到对应介绍。
命名规则: 建议 *.profiles.yml
4.3. jobs: 任务
将我们要做的事定义为一个 job。方便之后重用。此处的事指的是一类事,而不是指特定的某件事。
例如:微软内置定义的 bombardier 就是一个 job,这个 job 是通过bombardier对其进行基准测试,并将结果记录并输出,而具体针对哪个接口进行基准测试其实并不关心。
job 根据应用程序源有分为远程、本地两种。
本地源:
本地源 localFolder 针对当前运行 crank --config 执行命令所在的相对路径即可,任务开始后会将本地的项目发送到 agent 后再执行任务。
远程源
远程源会将仓库信息发送到 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
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
5.3. 启动任务
启动 agent(打开放在一边):
启动任务(另起一个新的 Shell):
然后我们等待片刻会输出以下结果
crank-agent:
crank:
当你能输出以上信息的时候,证明了你已经成功跑通了整个流程
在上面我们可以很清楚的看到场景 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,欢迎联系我们
版权声明: 本文为 InfoQ 作者【MASA技术团队】的原创文章。
原文链接:【http://xie.infoq.cn/article/60bb1b58d05135fd9c38b89b2】。文章转载请联系作者。
评论