Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 6 additions & 3 deletions build/crossgen2-scenarios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,12 @@ parameters:
- displayName: Default
arguments: --property profile=default
condition: 'true'
# Disabled: consistently fails with ILCompiler.CodeGenerationFailedException (IndexOutOfRangeException
# in CorInfoImpl.HandleToModuleToken) during the crossgen2 composite publish, and on Windows runs has
# caused crank to hang, blocking the rest of the jobs in the pipeline.
# Disabled: fails with ILCompiler.CodeGenerationFailedException (IndexOutOfRangeException
# in CorInfoImpl.HandleToModuleToken) during the crossgen2 composite publish, and on
# Windows runs causes crank to hang, blocking the rest of the jobs in the pipeline.
# Root cause fixed by dotnet/runtime#129053 (composite R2R token corruption for
# devirtualized async-variant callees, merged 2026-06-06). Re-enable once that fix
# flows into the .NET 11 SDK consumed by the benchmark agents.
- displayName: CG2 composite # since 6.0-preview4 CG2 is the default when PublishReadyToRun=true is set
arguments: --property profile=composite --application.buildArguments \"/p:PublishReadyToRun=true /p:PublishReadyToRunComposite=true /p:PublishReadyToRunUseCrossgen2=true \"
condition: 'false'
Expand Down
2 changes: 1 addition & 1 deletion build/dependencies.props
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@

<DapperVersion>2.1.66</DapperVersion>
<DapperAotVersion>1.0.48</DapperAotVersion>
<RazorSlicesVersion>0.10.1</RazorSlicesVersion>
<RazorSlicesVersion>0.11.1</RazorSlicesVersion>
<SystemCommandLineVersion>2.0.0-beta4.22272.1</SystemCommandLineVersion>
<MicrosoftCrankEventSourcesVersion>0.2.0-alpha.24114.2</MicrosoftCrankEventSourcesVersion>
<OpenTelemetryVersion>1.9.0</OpenTelemetryVersion>
Expand Down
13 changes: 10 additions & 3 deletions build/nativeaot-scenarios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,10 @@ parameters:

- displayName: Goldilocks Stage 1 (CoreCLR - Trim R2R SingleFile)
arguments: --scenario basicminimalapipublishtrimr2rsinglefile $(goldilocksJobs) --property scenario=Stage1TrimR2RSingleFile --property publish=coreclr --application.environmentVariables DOTNET_GCDynamicAdaptationMode=1
condition: 'true'
# Disabled: hits dotnet/runtime crossgen2 composite R2R bug on async-variant callees
# (Kestrel Http1ChunkedEncodingMessageBody.PumpAsync). Re-enable once
# https://github.com/dotnet/runtime/pull/129053 flows into the .NET 11 SDK.
condition: 'false'

- displayName: Goldilocks Stage 1 (NativeAOT)
# workaround https://github.com/dotnet/runtime/issues/81382 by explicitly referencing a Microsoft.DotNet.ILCompiler version
Expand Down Expand Up @@ -70,7 +73,9 @@ parameters:

- displayName: Goldilocks Stage 2 (CoreCLR - Trim R2R SingleFile)
arguments: --scenario todosapipublishtrimr2rsinglefile $(goldilocksJobs) --property scenario=Stage2TrimR2RSingleFile --property publish=coreclr --application.environmentVariables DOTNET_GCDynamicAdaptationMode=1
condition: 'true'
# Disabled: see note on "Goldilocks Stage 1 (CoreCLR - Trim R2R SingleFile)" above.
# Re-enable once https://github.com/dotnet/runtime/pull/129053 flows into the .NET 11 SDK.
condition: 'false'

- displayName: Goldilocks Stage 2 (NativeAOT)
# workaround https://github.com/dotnet/runtime/issues/81382 by explicitly referencing a Microsoft.DotNet.ILCompiler version
Expand Down Expand Up @@ -106,7 +111,9 @@ parameters:

- displayName: Goldilocks gRPC Stage 1 (CoreCLR - Trim R2R SingleFile)
arguments: --scenario basicgrpcpublishtrimr2rsinglefile $(goldilocksJobs) --property scenario=Stage1GrpcTrimR2RSingleFile --property publish=coreclr --application.environmentVariables DOTNET_GCDynamicAdaptationMode=1
condition: 'true'
# Disabled: see note on "Goldilocks Stage 1 (CoreCLR - Trim R2R SingleFile)" above.
# Re-enable once https://github.com/dotnet/runtime/pull/129053 flows into the .NET 11 SDK.
condition: 'false'

- displayName: Goldilocks gRPC Stage 1 (NativeAOT)
# workaround https://github.com/dotnet/runtime/issues/81382 by explicitly referencing a Microsoft.DotNet.ILCompiler version
Expand Down
15 changes: 14 additions & 1 deletion build/singlefile-scenarios.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,17 +32,30 @@ parameters:

- displayName: Self-contained
arguments: --application.buildArguments \"/p:PublishReadyToRun=true /p:PublishSingleFile=false\" --property mode=SelfContained
condition: 'true'
# Disabled: hangs / fails with ILCompiler.CodeGenerationFailedException
# (IndexOutOfRangeException in CorInfoImpl.HandleToModuleToken) during the
# crossgen2 composite publish on .NET 11 preview SDKs predating
# dotnet/runtime#129053 ("Fix composite R2R token corruption for devirtualized
# async-variant callees", merged 2026-06-06). Re-enable once that fix flows
# into the SDK consumed by the benchmark agents.
- displayName: Single-file
arguments: --application.buildArguments \"/p:PublishReadyToRun=true /p:PublishSingleFile=true\" --property mode=SingleFile
condition: 'false'
- displayName: Trimmed
arguments: --application.buildArguments \"/p:PublishReadyToRun=true /p:PublishSingleFile=true /p:PublishTrimmed=true\" --property mode=Trimmed
condition: 'false'
- displayName: AOT
# workaround https://github.com/dotnet/runtime/issues/81382 by explicitly referencing a Microsoft.DotNet.ILCompiler version
arguments: --application.buildArguments \"/p:PublishAot=true /p:StripSymbols=true\" --property mode=Aot --application.packageReferences \"Microsoft.DotNet.ILCompiler=$(MicrosoftNETCoreAppPackageVersion)\"
condition: 'true'
# Disabled: see note on "Single-file" above (dotnet/runtime#129053).
- displayName: R2RComposite-Windows
arguments: --application.buildArguments \"/p:PublishReadyToRun=true /p:PublishReadyToRunComposite=true /p:PublishSingleFile=true /p:RuntimeIdentifier=win-x64\" --property mode=R2RComposite --property rid=win-x64 --application.options.requiredOperatingSystem windows
condition: 'false'
- displayName: R2RComposite-Linux
arguments: --application.buildArguments \"/p:PublishReadyToRun=true /p:PublishReadyToRunComposite=true /p:PublishSingleFile=true /p:RuntimeIdentifier=linux-x64\" --property mode=R2RComposite --property rid=linux-x64 --application.options.requiredOperatingSystem linux
condition: 'false'

steps:
- ${{ each s in parameters.scenarios }}:
Expand All @@ -60,6 +73,6 @@ steps:
messageBody: |
{
"name": "crank",
"condition": "(${{ parameters.condition }})",
"condition": "(${{ parameters.condition }}) && (${{ mode.condition }})",
"args": [ "${{ s.arguments }} ${{ mode.arguments }} ${{ parameters.arguments }} --application.framework net11.0 --application.options.collectCounters true --no-metadata --no-measurements --load.options.reuseBuild true --session $(session) --description \"${{ s.displayName }} ${{ mode.displayName }} $(System.JobDisplayName)\" --property buildId=\"$(buildId)\" --property buildNumber=\"$(buildNumber)\" --command-line-property --table SingleFileBenchmarks --sql SQL_CONNECTION_STRING --cert-tenant-id SQL_SERVER_TENANTID --cert-client-id SQL_SERVER_CLIENTID --cert-path SQL_SERVER_CERT_PATH --cert-sni --chart" ]
}
44 changes: 20 additions & 24 deletions scenarios/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,8 @@ Each profile defines a set of machines, private IPs and ports that are used to r
| Profile | Arch | OS | Proc |
| :------------- | :----------: | :----------- | :----------- |
| `local` | (local machine) | (local machine) | (local machine) |
| `aspnet-perf-lin` | INTEL, 12 logical cores, 1 socket, 32GB | Ubuntu 22.04, Kernel 5.15.0 | Intel(R) Xeon(R) E-2336 CPU @ 2.90GHz |
| `aspnet-perf-win` | INTEL, 12 logical cores, 1 socket, 32GB | Windows Server 2022 | Intel(R) Xeon(R) E-2336 CPU @ 2.90GHz |
| `aspnet-citrine-lin` | INTEL, logical 28 cores, 1 socket, 32GB | Ubuntu 20.04, Kernel 5.4.0 | Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz |
| `aspnet-citrine-win` | INTEL, logical 28 cores, 1 socket, 32GB | Windows Server 2022 | Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz |
| `aspnet-citrine-amd2` | AMD, logical 48 cores, 1 socket, 64GB, 4 NUMA | Ubuntu 20.04, Kernel 5.4.0 | AMD EPYC 7402P 24-Core Processor |
| `aspnet-citrine-arm-lin` | ARM64, 80 logical cores, 1 socket, 1 NUMA, 128 GB | Ubuntu 20.04, Kernel 5.4.0 | Neoverse-N1 |
| `aspnet-citrine-arm-win` | ARM64, 80 logical cores, 1 socket, 1 NUMA, 128 GB | Windows Server 2022 | Neoverse-N1 |
| `aspnet-gold-lin` | INTEL, 56 logical cores, 1 socket, 1 NUMA, 64 GB | Ubuntu 22.04, Kernel 6.8.0-45-generic | Intel(R) Xeon(R) Gold 6330 CPU @ 2.00GHz |
| `aspnet-gold-win` | INTEL, 56 logical cores, 1 socket, 1 NUMA, 64 GB | Windows Server 2022 | Intel(R) Xeon(R) Gold 6330 CPU @ 2.00GHz |

Expand All @@ -55,7 +51,7 @@ These scenarios return a "Hello World" string and the client uses HTTP pipelinin
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/plaintext.benchmarks.yml --scenario plaintext --profile aspnet-perf-lin
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/plaintext.benchmarks.yml --scenario plaintext --profile aspnet-gold-lin
```

### Available scenarios
Expand All @@ -78,7 +74,7 @@ The serialization is done with `System.Text.Json`.
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/json.benchmarks.yml --scenario json --profile aspnet-perf-lin
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/json.benchmarks.yml --scenario json --profile aspnet-gold-lin
```

### Available scenarios
Expand All @@ -98,7 +94,7 @@ The database server is PostgresQL.
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/database.benchmarks.yml --scenario fortunes --profile aspnet-perf-lin
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/database.benchmarks.yml --scenario fortunes --profile aspnet-gold-lin
```

### Available scenarios
Expand Down Expand Up @@ -138,7 +134,7 @@ The database server is PostgresQL.
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/platform.benchmarks.yml --scenario fortunes --profile aspnet-perf-lin
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/platform.benchmarks.yml --scenario fortunes --profile aspnet-gold-lin
```

### Available scenarios
Expand All @@ -162,7 +158,7 @@ The downstream service returns a variable size content. By default the result is
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/proxy.benchmarks.yml --scenario proxy-httpclient --profile aspnet-perf-lin
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/proxy.benchmarks.yml --scenario proxy-httpclient --profile aspnet-gold-lin
```

### Available scenarios
Expand Down Expand Up @@ -237,7 +233,7 @@ These scenarios measure the performance of different other frameworks
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/te.benchmarks.yml --scenario plaintext_nodejs --profile aspnet-perf-lin
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/te.benchmarks.yml --scenario plaintext_nodejs --profile aspnet-gold-lin
```

### Available scenarios
Expand Down Expand Up @@ -266,7 +262,7 @@ These scenarios measure the performance of different Grpc server and clients im
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/grpc.benchmarks.yml --scenario grpcaspnetcoreserver-grpcnetclient --profile aspnet-perf-lin --variable streams=70 --variable connections=1
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/grpc.benchmarks.yml --scenario grpcaspnetcoreserver-grpcnetclient --profile aspnet-gold-lin --variable streams=70 --variable connections=1
```

### Available scenarios
Expand Down Expand Up @@ -308,7 +304,7 @@ Middleware based application that serve static files of any size.
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/staticfiles.benchmarks.yml --scenario static --profile aspnet-perf-lin
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/staticfiles.benchmarks.yml --scenario static --profile aspnet-gold-lin
```

### Available scenarios
Expand All @@ -335,7 +331,7 @@ These scenarios are running various SignalR benchmarks. The transport and serial
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/signalr.benchmarks.yml --scenario signalr --profile aspnet-perf-lin --variable scenario=echo --variable transport=websockets --variable protocol=messagepack
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/signalr.benchmarks.yml --scenario signalr --profile aspnet-gold-lin --variable scenario=echo --variable transport=websockets --variable protocol=messagepack
```

### Available scenarios
Expand Down Expand Up @@ -365,7 +361,7 @@ These scenarios are running various WebSockets benchmarks.
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/websocket.benchmarks.yml --scenario websocket --profile aspnet-perf-lin --variable scenario=echo
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/websocket.benchmarks.yml --scenario websocket --profile aspnet-gold-lin --variable scenario=echo
```

### Available scenarios
Expand All @@ -384,7 +380,7 @@ These scenarios are running various Orchard Core CMS benchmarks with either Sqli
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/orchard.benchmarks.yml --scenario about-sqlite --profile aspnet-perf-win
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/orchard.benchmarks.yml --scenario about-sqlite --profile aspnet-gold-win
```

### Available scenarios
Expand All @@ -402,7 +398,7 @@ argument choosing a key randomly. The HTTP response won't contain the cache entr
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/redis.benchmarks.yml --scenario redis --profile aspnet-perf-lin
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/redis.benchmarks.yml --scenario redis --profile aspnet-gold-lin
```

### Available scenarios
Expand Down Expand Up @@ -430,7 +426,7 @@ These scenarios provide benchmarks to help improve the Native AOT performance.
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/goldilocks.benchmarks.yml --scenario basicminimalapipublishaot --profile aspnet-perf-lin
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/goldilocks.benchmarks.yml --scenario basicminimalapipublishaot --profile aspnet-gold-lin
```
### Available scenarios

Expand All @@ -446,7 +442,7 @@ These scenarios are running various HTTP client benchmarks.
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/httpclient.benchmarks.yml --scenario httpclient-kestrel-get --profile aspnet-perf-lin --variable concurrencyPerHttpClient=200
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/httpclient.benchmarks.yml --scenario httpclient-kestrel-get --profile aspnet-gold-lin --variable concurrencyPerHttpClient=200
```

### Available scenarios
Expand Down Expand Up @@ -531,7 +527,7 @@ These scenarios provide benchmarks for Blazor.
### Sample

```
crank --config https://raw.githubusercontent.com/dotnet/performance/main/src/benchmarks/gc/scenarios/CrankConfiguration.yaml --scenario ssr --profile aspnet-perf-lin
crank --config https://raw.githubusercontent.com/dotnet/performance/main/src/benchmarks/gc/scenarios/CrankConfiguration.yaml --scenario ssr --profile aspnet-gold-lin
```

## GC benchmarks
Expand All @@ -540,7 +536,7 @@ These scenarios provide benchmarks to help improve the performance of the .NET G
### Sample

```
crank --config https://raw.githubusercontent.com/dotnet/performance/main/src/benchmarks/gc/scenarios/CrankConfiguration.yaml --scenario 2gb-pinning --profile aspnet-citrine-win --application.framework net10.0
crank --config https://raw.githubusercontent.com/dotnet/performance/main/src/benchmarks/gc/scenarios/CrankConfiguration.yaml --scenario 2gb-pinning --profile aspnet-gold-win --application.framework net10.0
```
### Available scenarios

Expand All @@ -560,7 +556,7 @@ These scenarios are running [dotnet micro benchmarks](https://github.com/dotnet/
### Sample

```
crank --config https://raw.githubusercontent.com/aspnet/benchmarks/main/scenarios/dotnet.benchmarks.yml --scenario linq --profile aspnet-perf-win
crank --config https://raw.githubusercontent.com/aspnet/benchmarks/main/scenarios/dotnet.benchmarks.yml --scenario linq --profile aspnet-gold-win
```

### Available scenarios
Expand All @@ -571,7 +567,7 @@ crank --config https://raw.githubusercontent.com/aspnet/benchmarks/main/scenario
The scenario named `custom` can be used to pass any custom filter variable like so:

```
crank --config https://raw.githubusercontent.com/aspnet/benchmarks/main/scenarios/dotnet.benchmarks.yml --scenario custom --profile aspnet-perf-win --variable filter=*LinqBenchmarks*
crank --config https://raw.githubusercontent.com/aspnet/benchmarks/main/scenarios/dotnet.benchmarks.yml --scenario custom --profile aspnet-gold-win --variable filter=*LinqBenchmarks*
```

## FAQ
Expand Down Expand Up @@ -640,7 +636,7 @@ Most pages in the Power BI dashboard list the crank command lines that were used

Here is how to do it with crank and download the crash dump automatically.
```console
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/plaintext.benchmarks.yml --scenario plaintext --profile aspnet-perf-lin --application.environmentVariables DOTNET_DbgEnableMiniDump=1 --application.environmentVariables DOTNET_DbgMiniDumpType=4 --application.environmentVariables DOTNET_DbgMiniDumpName=mydump --application.environmentVariables DOTNET_CreateDumpVerboseDiagnostics=1 --application.options.downloadfiles mydump
crank --config https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/plaintext.benchmarks.yml --scenario plaintext --profile aspnet-gold-lin --application.environmentVariables DOTNET_DbgEnableMiniDump=1 --application.environmentVariables DOTNET_DbgMiniDumpType=4 --application.environmentVariables DOTNET_DbgMiniDumpName=mydump --application.environmentVariables DOTNET_CreateDumpVerboseDiagnostics=1 --application.options.downloadfiles mydump
```

Note that these ENVs could be set for all runs and crank will run just fine if it can't download the file because no crash happened.
Expand Down
Loading