写点什么

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

  • 2022 年 3 月 17 日
  • 本文字数:3338 字

    阅读完需:约 11 分钟

1. 前言

入门篇我们已经成功运行 hello.benchmarks.yml 并输出测试结果,本篇我们就 hello.benchmarks.yml、以及运行的 shell 脚本详细解读下其中的含义


2. 剖析 hello.benchmarks.yml

2.1. job

  • 在 hello.benchmarks.yml 中我们定义了一个新的 job: server,并指定了仓库信息 ( 远程仓库 ):


    repository:https://github.com/doddgu/crank.git # 仓库源    branchOrCommit:sample # 分支    project: samples/hello/hello.csproj # 项目
复制代码


  • 并通过 import 导入了 bombardier.yml,其中定义了另外一个 job: bombardier,并指定了仓库信息 ( 远程仓库 ):


      repository: https://github.com/doddgu/crank.git      branchOrCommit: sample      project: src/Microsoft.Crank.Jobs.Bombardier/Microsoft.Crank.Jobs.Bombardier.csproj      sourceKey: bombardier # 服务器使用它来重用相同的源文件夹。      noBuild: true # 定义 SourceKey时,指示是否仍应进行构建
复制代码

2.2. scenarios

  • 在 hello.benchmarks.yml 中我们定义了场景: hello,并为此场景指定了两个任务:

  • 第一个任务名为 application,使用的是项目 server

  • 第二个任务名为 load,并指定使用项目 bombardier

2.3. variables 变量

  • 在 bombardier.yml 中

  • 定义了全局变量: headers、presetHeaders(预设 header)

  • 定义了局部变量: connections、warmup、duration、requests、rate、transport、serverScheme 等等

  • 在 hello.benchmarks.yml 中为 load 定义了局部变量 serverPort、path

2.4. profiles 配置

  • 在 hello.benchmarks.yml 中我们

  • 定义了配置 local

  • 并指定了局部变量: serverAddress = localhost

  • 为任务 application、load 指定了部署作业的 endpoint 是 http://localhost:5010 (指定执行任务的 Agent 地址)

2.5. arguments 参数

  • 在 bombardier.yml 中与 variables 同级的配置: arguments,此参数是在启动 job 后传递的参数,其中定义的全局参数、局部参数信息也都是为构建完整的参数做准备,bombardier 真实的参数信息是:


-c {{connections}} -w {{warmup}} -d {{duration}} -n {{requests}} --insecure -l {% if rate != 0 %} --rate {{ rate }} {% endif %} {% if transport %} --{{ transport}} {% endif %} {{headers[presetHeaders]}} {% for h in customHeaders %}{% assign s = h | split : ':' %}--header \"{{ s[0] }}: {{ s[1] | strip }}\" {% endfor %} {% if serverUri == blank or serverUri == empty %} {{serverScheme}}://{{serverAddress}}:{{serverPort}}{{path}} {% else %} {{serverUri}}:{{serverPort}}{{path}} {% endif %} {% if bodyFile != blank and bodyFile != empty %} -f {{bodyFile}} {% endif %}  {% if verb != blank and verb != empty %} -m {{verb}} {% endif %}
复制代码

3. 改造 hello.benchmarks.yml

改造 hello.benchmarks.yml,不考虑重用,最原始的代码如下


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"'  presetHeaders: none
jobs: bombardier: source: repository: https://github.com/dotnet/crank.git branchOrCommit: main project: src/Microsoft.Crank.Jobs.Bombardier/Microsoft.Crank.Jobs.Bombardier.csproj sourceKey: bombardier noBuild: true readyStateText: Bombardier Client waitForExit: true variables: connections: 256 warmup: 15 duration: 15 requests: 0 rate: 0 transport: fasthttp # | http1 | http2 serverScheme: http serverAddress: localhost serverPort: 5000 path: bodyFile: # path or url for a file to use as the body content verb: # GET when nothing is specified customHeaders: [ ] # list of headers with the format: '<name1>: <value1>', e.g. [ 'content-type: application/json' ] arguments: "-c {{connections}} -w {{warmup}} -d {{duration}} -n {{requests}} --insecure -l {% if rate != 0 %} --rate {{ rate }} {% endif %} {% if transport %} --{{ transport}} {% endif %} {{headers[presetHeaders]}} {% for h in customHeaders %}{% assign s = h | split : ':' %}--header \"{{ s[0] }}: {{ s[1] | strip }}\" {% endfor %} {% if serverUri == blank or serverUri == empty %} {{serverScheme}}://{{serverAddress}}:{{serverPort}}{{path}} {% else %} {{serverUri}}:{{serverPort}}{{path}} {% endif %} {% if bodyFile != blank and bodyFile != empty %} -f {{bodyFile}} {% endif %} {% if verb != blank and verb != empty %} -m {{verb}} {% endif %}" onConfigure: # - job.timeout = Number(job.variables.duration) + Number(job.variables.warmup) + 10; endpoints: - http://localhost:5010 server: source: repository: https://github.com/doddgu/crank branchOrCommit: sample project: samples/hello/hello.csproj readyStateText: Application started. endpoints: - http://localhost:5010
scenarios: hello: application: job: server load: job: bombardier variables: serverPort: 5000 path: /
复制代码

4. 解读 crank shell

之前我们通过 shell 执行:


  • crank --config hello.benchmarks.yml --scenario hello --profile local --load.framework net5.0 --application.framework net5.0

  • 其中 crank 是固定的、代表:Crank Controller

  • --config:固定的配置,指执行哪个 yml 配置,每次仅能指定一个 yml 配置

  • --scenario:固定的配置,设置场景是 hello

  • --profile:固定的配置,非必选,可多次设置,指定当前 Crank 命令申请的配置是 local,使用 local 下配置的所有信息

  • --load.framework: 格式:<任务名>.framework,为任务 load 指定 framework 的运行框架版本是 net5.0、--application.framework 同理

  • 改造 hello.benchmarks.yml,因为移除了 profile,所以执行: crank --config hello.yml --scenario hello --load.framework net5.0 --application.framework net5.0 即可


查看crank更多文档

5. 疑问

  • 为什么启动 crank 时要增加--application.framework net5.0?

  • 安装 crank 要求必须有 net5.0 的环境,所以指定 net5.0 不需要再单独安装框架环境

  • 为什么启动 crank 时不指定 framework 时默认是 netcore3.1 呢?

  • 使用记事本打开 hello.csproj、Microsoft.Crank.Jobs.Bombardier.csproj 即可了解

  • scenarios 节点下 application 以及 load 两个节点名称可以更换吗?只能有两个节点?

  • 节点名称不固定,可以更换,也没有限制必须是两个节点,具体多少个节点根据自己的需要来

6. 结尾

通过上面的学习,我们也已经完全的了解了各配置的作用,但对 bombardier.yml 与开源项目 bombardier 存在什么样的联系还不清楚,以及为什么叫做 bombardier.yml 而不是其他名字,并且是如何实现性能指标的输出,接下来就会讲到 bombardier.yml 与开源项目 bombardier 的关系,以及 wrk.yml 与 wrk 的关系


源码地址: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,欢迎联系我们



发布于: 刚刚阅读数: 2
用户头像

还未添加个人签名 2021.10.26 加入

还未添加个人简介

评论

发布
暂无评论
2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml_MASA技术团队_InfoQ写作平台