目录

  1. 堪比JMeter的.Net压测工具 - Crank 入门篇
  2. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml
  3. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识bombardier
  4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2
  5. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 接口以及场景压测
  6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈
  7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么

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. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml的更多相关文章

  1. 3. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识bombardier

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  2. 4. 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识wrk、wrk2

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

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

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  4. 5. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 接口以及场景压测

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  5. 6. 堪比JMeter的.Net压测工具 - Crank 实战篇 - 收集诊断跟踪信息与如何分析瓶颈

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

  6. 7. 堪比JMeter的.Net压测工具 - Crank 总结篇 - crank带来了什么

    目录 堪比JMeter的.Net压测工具 - Crank 入门篇 堪比JMeter的.Net压测工具 - Crank 进阶篇 - 认识yml 堪比JMeter的.Net压测工具 - Crank 进阶篇 ...

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

    1. 前言 Crank 是.NET 团队用来运行基准测试的基准测试基础架构,包括(但不限于)来自TechEmpower Web 框架基准测试的场景,是2021年.NET Conf 大会上介绍的一项新的 ...

  8. jmeter的dubbo压测,依赖jar包要放到执行机的lib/ext下

    对于jmeter的dubbo压测场景的master-slave结构: 即master的jmeter进行任务的下发和报告的生成,slave进行任务的执行 因为dubbo压测需要依赖很多三方jar包,那么 ...

  9. HTTP 2.0 之压测工具 Jmeter

    年后,德国总部工业平台要做中国本地化,德国的同事过来给我们展示日志的时候,无意间看到了他们应用日志里的 HTTP/2,下意识到,原来他们都已经提供Http 2.0的服务了. 那么问题来了,除了h2lo ...

随机推荐

  1. Termux劣质的入门指南

    直入主题: 1.1 下载安装 Google下载(有条件的用!) F-droid下载(建议使用!) 也可以去酷安下载! 1.2 配置 apt update && apt upgrade ...

  2. 记一次oom问题排查

    大家好,我是大彬~ 今天给大家分享最近出现的OOM问题. 上周五早上,测试同学反馈测试环境的子系统服务一直超时,请求没有响应. 收到这个问题之后,我有点纳闷,最近这个系统也没有改动代码逻辑,怎么会突然 ...

  3. 小记录:flask的DEBUG开关

    请求站点的如下位置: http://www.ahfu.com/ahfuzhang/?debugger=yes&cmd=resource&f=style.css 居然正常范围了CSS文件 ...

  4. SQL查询字段,起别名,列参与数学运算

    13.简单查询 13.1.查询一个字段? select 字段名 from 表名: 其中要注意: select和from都是关键字 字段名和表名都是标识符. 强调: 对于SQL语句说,是通用的 所有的S ...

  5. java-异常-自定义异常异常类的抛出throws

    1 package p1.exception; 2 /* 3 * 对于角标是整数不存在,可以用角标越界表示, 4 * 对于负数为角标的情况,准备用负数角标异常来表示. 5 * 6 * 负数角标这种异常 ...

  6. /etc/crontab和crontab -e的区别

    (1) /etc/crontab是系统级别的crontab,系统的设置等,这种方法只有root用户能用 crontab -e是用户级的crontab,会被写到 /var/spool/cron 目录下, ...

  7. l线程池抓取lianjia

    1. 线程池 的应用 from multiprocessing.dummy import Pool import requests from lxml import etree url="h ...

  8. 利用application在页面中显示访问次数

    在jsp页面中实现. <%@ page language="java" contentType="text/html; charset=UTF-8" pa ...

  9. c#开方,平方,sin函数计算

    平方运算 private double m; private double n=Math.Pow(m,2.0); 开平方运算 System.Math.Sqrt(数字); double保留两位小数 Ma ...

  10. CF888F Connecting Vertices

    首先可以发现的是,因为两条线段不能在除了端点处相交,因此整个多边形最终一定会被连接成最上方由若干条线段在端点处相交连成,每条线段下方又是一个子结构. 因此你会发现,每个合法的状态都能被分成两个合法的子 ...