乐趣区

关于.net:堪比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. 筹备工作

  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.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/cra…

参考链接:

  • https://github.com/dotnet/crank
  • https://github.com/aspnet/Ben…
  • https://www.youtube.com/watch…

开源地址

MASA.BuildingBlocks:https://github.com/masastack/…

MASA.Contrib:https://github.com/masastack/…

MASA.Utils:https://github.com/masastack/…

MASA.EShop:https://github.com/masalabs/M…

MASA.Blazor:https://github.com/BlazorComp…

如果你对咱们的 MASA Framework 感兴趣,无论是代码奉献、应用、提 Issue,欢送分割咱们

退出移动版