Crank 是微软新出的一个性能测试框架,集成了多种基准测试工具,如bombardier、wrk等。
Crank通过统一的配置,可以转换成不同基准测试工具命令进行测试。可参考Bombardier Job实现。

安装Crank

运行如下两个命令分别安装Crank的cli(Controller)和Agent。
dotnet tool update Microsoft.Crank.Controller --version "0.2.0-*" --global
dotnet tool update Microsoft.Crank.Agent--version "0.2.0-*" --global

需要.Net SDK 5.0环境

安装完成后执行命令crank,会打印出如下可以配置的参数和介绍,或者github查看相关参数介绍。

PS C:\Users\Stack\Desktop> crank
Crank Benchmarks ControllerThe Crank controller orchestrates benchmark jobs on Crank agents.Usage: Crank [command] [options]Options:-?|-h|--help         Show help information-c|--config          Configuration file or url-s|--scenario        Scenario to execute-j|--job             Name of job to define--profile            Profile name--script             Execute a named script available in the configuration files. Can be used multiple times.-j|--json            Saves the results as json in the specified file.--csv                Saves the results as csv in the specified file.--compare            An optional filename to compare the results to. Can be used multiple times.--variable           Variable--sql                Connection string of the SQL Server Database to store results in--table              Table name of the SQL Database to store results in--session            A logical identifier to group related jobs.--description        A string describing the job.-p|--property        Some custom key/value that will be added to the results, .e.g. --property arch=arm --propertyos=linux

执行crank-agent,启动基准测试所需的代理服务。github查看相关参数介绍。

PS C:\Users\Stack\Desktop> crank-agent
Hosting environment: Production
Content root path: C:\Users\Stack\.dotnet\tools\.store\microsoft.crank.agent\0.2.0-alpha.21567.1\microsoft.crank.agent\0.2.0-alpha.21567.1\tools\net5.0\any\
Now listening on: http://[::]:5010

创建Crank配置文件

配置文件参考官方hello.benchmarks.yml示例
示例文件中引入了bombardier.yml,由于大环境对githubusercontent.com域名不太友好,可以考虑将bombardier.yml下载到本地,imports引入本地路径或者直接将文件内容加入到新建的配置文件。

imports:-https://raw.githubusercontent.com/dotnet/crank/main/src/Microsoft.Crank.Jobs.Bombardier/bombardier.yml

生产中使用推荐imports文件的方式,crank配置文件中做少量配置就可以完成基准测试,并且可以引入不同的Microsoft.Crank.Jobs.XXX/XXX.yml,基于不同的基准测试工具进行测试。
其他测试工具配置文件都在https://github.com/dotnet/crank/blob/main/src/Microsoft.Crank.XXX下。

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: nonejobs:bombardier:source:repository: https://github.com/dotnet/crank.gitbranchOrCommit: mainproject: src/Microsoft.Crank.Jobs.Bombardier/Microsoft.Crank.Jobs.Bombardier.csprojsourceKey: bombardiernoBuild: truereadyStateText: Bombardier ClientwaitForExit: truevariables:connections: 256 #设置连接数warmup: 15 #设置测试预热次数duration: 15 #设置测试时间requests: 0 #设置测试请求实例数rate: 0 #设置每秒请求频率transport: fasthttp # | http1 | http2  设置使用golang的fasthttp库发送http请求serverScheme: httpserverAddress: localhostserverPort: 5000path: bodyFile: # path or url for a file to use as the body contentverb: # GET when nothing is specifiedcustomHeaders: [ ] # 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;server:source: #指定需要测试的项目,本文直接使用本地路径localFolder: .project: crank_demo.csprojreadyStateText: Application started.# source: 指定测试项目的远程仓库地址,并通过branchOrCommit指定分支#   repository: https://github.com/dotnet/crank#   branchOrCommit: main#   project: samples/hello/hello.csproj# readyStateText: Application started.scenarios: #配置基准测试场景crank_demo: #定义方案名,执行crank命令时指定该名称application: job: server # 指定测试项目为上面定义的serverload:job: bombardier # 指定测试工具bombardiervariables:serverPort: 5000 #配置http服务端口path: / #配置http服务地址profiles:local:variables:serverAddress: localhostjobs: application:endpoints: - http://localhost:5010load:endpoints: - http://localhost:5010

启动Crank-Agent

启动agent后执行crank,会有一个如下安装sdk的动作

[09:29:05.261] Runtime: 6.0.0 (Current)
[09:29:05.262] SDK: 6.0.100 (Current)
[09:29:05.263] ASP.NET: 6.0.0 (Current)
[09:29:05.265] Creating custom global.json
[09:29:05.266] Desktop: 6.0.0 (Current)
[09:29:05.266] Installing SDK '6.0.100' ...

所以启动agent时多指定一个dotnethome参数,避免重复安装sdk。

crank-agent --dotnethome 'C:\Program Files\dotnet'

启动Crank

crank --config .\demo.benchmarks.yml --scenario crank_demo --profile local

--scenario crank_demo: 指定定义的测试场景
--profile local :设置输出结果到本地,即控制台输出

可以通过参数指定结果输出到本地json文件(--output results.json )或者数据库(--sql [connection-string] --table [table-name])

结果输出

这里省略压测期间的日志输出,直接列出结果。

| application           |               |
| --------------------- | ------------- |
| CPU Usage (%)         | 56            |
| Cores usage (%)       | 447           |
| Working Set (MB)      | 140           |
| Private Memory (MB)   | 157           |
| Build Time (ms)       | 7,232         |
| Start Time (ms)       | 501           |
| Published Size (KB)   | 91,292        |
| .NET Core SDK Version | 6.0.100       |
| ASP.NET Core Version  | 6.0.0+ae1a6cb |
| .NET Runtime Version  | 6.0.0+4822e3c || load                  |                |
| --------------------- | -------------- |
| CPU Usage (%)         | 46             |
| Cores usage (%)       | 370            |
| Working Set (MB)      | 29             |
| Private Memory (MB)   | 30             |
| Build Time (ms)       | 11,891         |
| Start Time (ms)       | 226            |
| Published Size (KB)   | 68,228         |
| .NET Core SDK Version | 3.1.415        |
| ASP.NET Core Version  | 3.1.21+458d974 |
| .NET Runtime Version  | 3.1.21+df8abc0 |
| First Request (ms)    | 185            |
| Requests              | 912,005        |
| Bad responses         | 0              |
| Mean latency (us)     | 4,207          |
| Max latency (us)      | 138,999        |
| Requests/sec          | 60,305         |
| Requests/sec (max)    | 128,523        |

更多

crank readme:https://github.com/dotnet/crank/blob/main/docs/README.md

Benchmarks crank为Benchmarks重构版本
本文示例代码:https://github.com/MayueCif/crank_demo

.Net Crank性能测试入门相关推荐

  1. Jmeter性能测试 入门

    Jmeter性能测试 入门 原文:Jmeter性能测试 入门 Jmeter是一款优秀的开源测试工具, 是每个资深测试工程师,必须掌握的测试工具,熟练使用Jmeter能大大提高工作效率. 熟练使用Jme ...

  2. Jmeter Web 性能测试入门 (六):Jmeter 解析 response 并传递 value

    解析response中的内容,并把获取到的value传递到后续的request中,常用的方法就是在想要解析response的request上添加后置处理器 本章介绍两种常用的组件 BeanShell ...

  3. 同软件多个线程设置不同ip_软件测试如何自学?收下这份《2020千锋性能测试入门视频教程》...

    萧亚轩在吐槽大会上说:"我只是天赋异禀,一个平平无奇的恋爱小天才."讲真,小千是百分百赞同,毕竟谁不是在平平无奇的生活里悄咪咪的给自己加持各种装备,偶尔一个大招适时放出,真的能够亮 ...

  4. 使用Jmeter对mysql进行性能测试入门

    使用Jmeter对mysql进行性能测试入门 第一步:测试环境准备: 1).mysql> select version(); +-----------+ | version() | +----- ...

  5. Jmeter Web 性能测试入门 (四):一个小实例带你学会 Jmeter 脚本编写

    测试场景: 模拟并发100个user,在TesterHome 站内搜索VV00CC 添加线程组 添加HTTP信息头管理器 添加HTTP Sampler 填写HTTP Sampler中的信息 添加监听器 ...

  6. 大型IT系统性能测试入门经典-系统性能测试基础

    本文摘自陈绍英老师<大型IT系统性能测试入门经典>一书. 第一章 系统性能测试基础 下面是很多公司常见的和性能测试相关的工作安排: 预计有3000人使用系统,去测一下系统1000个用户的并 ...

  7. jmeter性能测试入门简介

    Apache JMeter是一款纯java编写负载功能测试和性能测试开源工具软件.相比Loadrunner而言,JMeter小巧轻便且免费,逐渐成为了主流的性能测试工具,是每个测试人员都必须要掌握的工 ...

  8. 性能测试入门,其实很简单,看看这篇,好好学习

    注:性能测试,入门简单,深入难.经常有同学问,建议看看这篇 . 为了帮助大家快速的入门性能测试,接下来文章将从以下几个方面进行展开: 一.赶鸭子上架要我搞性能测试,怎么办? 二.想搞性能测试,要学什么 ...

  9. 柠檬班学习性能测试day2_性能测试入门(0519)

    性能测试知识入门 思维差异 a.功能测试.自动化测试: 输出:找bug 预期结果与实际结果进行比较 隐藏的前提:模拟的都是1个用户的操作 b.性能测试: 不是模拟1个人-模拟多个人同时 关注:多个人操 ...

最新文章

  1. 抛物面天线的工作原理是什么?
  2. 史上最丧心病狂的商品定价套路:如何从数学角度,榨干你身上的每一分钱
  3. 什么时候使用Apache Camel?
  4. word可以直接导入mysql嘛_如何把word文档导入到数据库中——java POI
  5. java商城_java网上商城系统怎么样?优势又有哪些?
  6. Java代码块的基本使用
  7. beautifulsoup_BeautifulSoup爬虫了解一下
  8. 测试 MathJax 排版功效
  9. 回归模型的score得分为负_逻辑回归评分卡实现和评估
  10. ARM通用寄存器和特殊寄存器
  11. 项目经理在项目各阶段的工作重点-更新版
  12. JavaScript高级教程——(19)构造函数、原型、原型链、继承
  13. 数据库之DB2数据库备份
  14. 集成电路模拟版图入门-版图基础学习笔记(四)
  15. 瑞幸在前 Manner在后 资本吹不熟的咖啡赛道迎来新变局
  16. 鲸会务手把手教您线上年会抽奖怎么玩
  17. 信息搜集方法总结与思路整合
  18. java 万年历绪论_基于安卓Android的万年历的设计与开发(含录像)
  19. 微信小程序——三角形面积计算
  20. Java泛型详解:<T>和Class<T>的使用。泛型类,泛型方法的详细使用实例

热门文章

  1. 1.8-zabbix服务端安装
  2. MVC 扩展方法特点
  3. 第二天:装饰模式及面向对象设计原则4则
  4. linux进程通讯-纯文本文件
  5. IT学习--学习不一定要用在现实工作中
  6. IDEA开发工具的学习
  7. 使用命令导入、导出mysql数据
  8. 安卓虚拟机与Hyper-V冲突
  9. nmap脚本使用总结
  10. 现代计算机密码学阶段主要有两个方向,密码学技术读书笔记