写点什么

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

  • 2022 年 3 月 08 日
  • 本文字数:4591 字

    阅读完需:约 15 分钟

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. 启动任务

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


crank-agent --dotnethome "/usr/share/dotnet"
复制代码


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


git clone https://github.com/doddgu/crank.gitcd crankgit checkout samplecrank --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,欢迎联系我们



发布于: 4 小时前阅读数: 6
用户头像

还未添加个人签名 2021.10.26 加入

还未添加个人简介

评论

发布
暂无评论
堪比JMeter的.Net压测工具 - Crank 入门篇_C#_MASA技术团队_InfoQ写作平台