好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

.Net Crank性能测试入门

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 Controller    The 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 --property                          os=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: 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  设置使用golang的fasthttp库发送http请求        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;      server:      source: #指定需要测试的项目,本文直接使用本地路径        localFolder: .        project: crank_demo.csproj      readyStateText: 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 # 指定测试项目为上面定义的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] 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

原文链接:https://mp.weixin.qq.com/s/gkgTvC2q3ovGh7o2TpO6NA

查看更多关于.Net Crank性能测试入门的详细内容...

  阅读:55次