堪比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
安装命令:
dotnet tool update Microsoft.Crank.Controller --version "0.2.0-alpha.21567.1" --global
验证命令:
crank
- 打开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. 启动任务
启动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. 堪比JMeter的.Net压测工具 - Crank 入门篇
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
- 2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
- 3. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识bombardier
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
- 4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
- 5. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 接口以及场景压测
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
- 6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
- 7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么
目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...
- HTTP 2.0 之压测工具 Jmeter
年后,德国总部工业平台要做中国本地化,德国的同事过来给我们展示日志的时候,无意间看到了他们应用日志里的 HTTP/2,下意识到,原来他们都已经提供Http 2.0的服务了. 那么问题来了,除了h2lo ...
- [SCF+wetest+jmeter]简单云性能压测工具使用方案
前言 压测太难?局域网压力无法判断服务器网络指标?无法产生非常大的并发量?云性能太贵? 也许我们可以把各种简单的工具拼起来进行压力测试! 准备 https://cloud.tencent.com/pr ...
随机推荐
- JS异步加载AMD和CMD
CommonJS 是个规范,主要用于js后端,var foo = require("./foo");foo("Hi"); AMD前置加载 require.jsr ...
- STL中的隐性性能开销与副作用
1 隐性性能开销 1.1 STL容器的clear的时间复杂度不是O(1) 很多人潜意识认为STL容器中clear()成员函数的时间复杂度为常量时间复杂度O(1).原因是大家觉得对于vector而言,c ...
- bom-页面加载事件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Callable接口及Futrue接口详解
Callable接口 有两种创建线程的方法-一种是通过创建Thread类,另一种是通过使用Runnable创建线程.但是,Runnable缺少的一项功能是,当线程终止时(即run()完成时),我们无法 ...
- Linux添加用户组和添加用户
1.用户组 添加组:groupadd 组名 [root@Server-n93yom ~]# groupadd dev [root@Server-n93yom ~]# cat /etc/group | ...
- ajax、axios、fetch区别及优缺点
将jQuery的ajax.axios和fetch做个简单的比较,所谓仁者见仁智者见智,最终使用哪个还是自行斟酌 1.jQuery ajax $.ajax({ type: 'POST', url: ur ...
- Volatile关键字和ThreadLocal变量的简单使用
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11812459.html package thread; /** * volatile关键字和T ...
- cell重用
少数几个cell可不重用 NSString *CellIdentifier = [NSString stringWithFormat:@"MyCellID_%d",indexPat ...
- JSP页面乱码解决
1. tomcat 设置端口处加上 URIEncoding="UTF-8" 2. tomcat 的bin文件夹下的catalina.bat中如下位置加上如下编码:-Dfile.en ...
- k8s之Pod基础概念
1. 资源限制 Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象.一个Pod代表着集群中运行的一个进程.kubernetes中其他大多数组件都是围绕着Pod来 ...