Crank 是微软新出的一个性能测试框架,集成了多种基准测试工具,如bombardier、wrk等。
Crank通过统一的配置,可以转换成不同基准测试工具命令进行测试。可参考Bombardier Job实现。
安装Crank
运行如下两个命令分别安装Crank的cli(Controller)和Agent。
- dotnettoolupdateMicrosoft.Crank.Controller–version"0.2.0-*"–global
- dotnettoolupdateMicrosoft.Crank.Agent–version"0.2.0-*"–global
需要.Net SDK 5.0环境
安装完成后执行命令crank,会打印出如下可以配置的参数和介绍,或者github查看相关参数介绍。
- PSC:\\Users\\Stack\\Desktop>crank
- CrankBenchmarksController
- TheCrankcontrollerorchestratesbenchmarkjobsonCrankagents.
- Usage:Crank[command][options]
- Options:
- -?|-h|–helpShowhelpinformation
- -c|–configConfigurationfileorurl
- -s|–scenarioScenariotoexecute
- -j|–jobNameofjobtodefine
- –profileProfilename
- –scriptExecuteanamedscriptavailableintheconfigurationfiles.Canbeusedmultipletimes.
- -j|–jsonSavestheresultsasjsoninthespecifiedfile.
- –csvSavestheresultsascsvinthespecifiedfile.
- –compareAnoptionalfilenametocomparetheresultsto.Canbeusedmultipletimes.
- –variableVariable
- –sqlConnectionstringoftheSQLServerDatabasetostoreresultsin
- –tableTablenameoftheSQLDatabasetostoreresultsin
- –sessionAlogicalidentifiertogrouprelatedjobs.
- –descriptionAstringdescribingthejob.
- -p|–propertySomecustomkey/valuethatwillbeaddedtotheresults,.e.g.–propertyarch=arm–property
- os=linux
执行crank-agent,启动基准测试所需的代理服务。github查看相关参数介绍。
- PSC:\\Users\\Stack\\Desktop>crank-agent
- Hostingenvironment:Production
- Contentrootpath: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\\
- Nowlisteningon: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: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:BombardierClient
- waitForExit:true
- variables:
- connections:256#设置连接数
- warmup:15#设置测试预热次数
- duration:15#设置测试时间
- requests:0#设置测试请求实例数
- rate:0#设置每秒请求频率
- transport:fasthttp#|http1|http2设置使用golang的fasthttp库发送http请求
- serverScheme:http
- serverAddress:localhost
- serverPort:5000
- path:
- bodyFile:#pathorurlforafiletouseasthebodycontent
- verb:#GETwhennothingisspecified
- customHeaders:[]#listofheaderswiththeformat:'<name1>:<value1>',e.g.['content-type:application/json']
- arguments:"-c{{connections}}-w{{warmup}}-d{{duration}}-n{{requests}}–insecure-l{%ifrate!=0%}–rate{{rate}}{%endif%}{%iftransport%}–{{transport}}{%endif%}{{headers[presetHeaders]}}{%forhincustomHeaders%}{%assigns=h|split:':'%}–header\\"{{s[0]}}:{{s[1]|strip}}\\"{%endfor%}{%ifserverUri==blankorserverUri==empty%}{{serverScheme}}://{{serverAddress}}:{{serverPort}}{{path}}{%else%}{{serverUri}}:{{serverPort}}{{path}}{%endif%}{%ifbodyFile!=blankandbodyFile!=empty%}-f{{bodyFile}}{%endif%}{%ifverb!=blankandverb!=empty%}-m{{verb}}{%endif%}"
- onConfigure:
- #-job.timeout=Number(job.variables.duration)+Number(job.variables.warmup)+10;
- server:
- source:#指定需要测试的项目,本文直接使用本地路径
- localFolder:.
- project:crank_demo.csproj
- readyStateText:Applicationstarted.
- #source:指定测试项目的远程仓库地址,并通过branchOrCommit指定分支
- #repository:https://github.com/dotnet/crank
- #branchOrCommit:main
- #project:samples/hello/hello.csproj
- #readyStateText:Applicationstarted.
- scenarios:#配置基准测试场景
- crank_demo:#定义方案名,执行crank命令时指定该名称
- application:
- job:server#指定测试项目为上面定义的server
- load:
- job:bombardier#指定测试工具bombardier
- variables:
- serverPort:5000#配置http服务端口
- path:/#配置http服务地址
- profiles:
- local:
- variables:
- serverAddress:localhost
- jobs:
- application:
- endpoints:
- -http://localhost:5010
- load:
- 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]Creatingcustomglobal.json
- [09:29:05.266]Desktop:6.0.0(Current)
- [09:29:05.266]InstallingSDK'6.0.100'…
所以启动agent时多指定一个dotnethome参数,避免重复安装sdk。
- crank-agent–dotnethome'C:\\ProgramFiles\\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||
- |———————|————-|
- |CPUUsage(%)|56|
- |Coresusage(%)|447|
- |WorkingSet(MB)|140|
- |PrivateMemory(MB)|157|
- |BuildTime(ms)|7,232|
- |StartTime(ms)|501|
- |PublishedSize(KB)|91,292|
- |.NETCoreSDKVersion|6.0.100|
- |ASP.NETCoreVersion|6.0.0+ae1a6cb|
- |.NETRuntimeVersion|6.0.0+4822e3c|
- |load||
- |———————|————–|
- |CPUUsage(%)|46|
- |Coresusage(%)|370|
- |WorkingSet(MB)|29|
- |PrivateMemory(MB)|30|
- |BuildTime(ms)|11,891|
- |StartTime(ms)|226|
- |PublishedSize(KB)|68,228|
- |.NETCoreSDKVersion|3.1.415|
- |ASP.NETCoreVersion|3.1.21+458d974|
- |.NETRuntimeVersion|3.1.21+df8abc0|
- |FirstRequest(ms)|185|
- |Requests|912,005|
- |Badresponses|0|
- |Meanlatency(us)|4,207|
- |Maxlatency(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
原文链接:https://mp.weixin.qq.com/s/gkgTvC2q3ovGh7o2TpO6NA