Skip to content

Commit a8b9483

Browse files
authored
Adding support for collecting cross-platform perf traces and generating PGO JIT traces (#11066)
* Adding support for collecting cross-platform perf traces and generating PGO JIT traces. * Consolidated runtime provider keywords for trace collection. * PR feedback on pwshell script
1 parent db59336 commit a8b9483

File tree

12 files changed

+543
-95
lines changed

12 files changed

+543
-95
lines changed

eng/ci/host.coldstart.yml

Lines changed: 155 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,35 @@ schedules:
1313
always: true
1414

1515
parameters:
16+
17+
# Function apps to include in the run.
18+
- name: includeHelloHttpNet9
19+
displayName: Include HelloHttpNet9 (.NET9 Web Application)
20+
type: boolean
21+
default: true
22+
- name: includeHelloHttpNet9NoProxy
23+
displayName: Include HelloHttpNet9NoProxy (.NET9 Worker Application)
24+
type: boolean
25+
default: true
26+
- name: includeHelloHttpNode
27+
displayName: Include HelloHttpNode (Node Application)
28+
type: boolean
29+
default: false
30+
31+
# Dotnet trace profile collection & jit trace generation.
32+
- name: collectNetTrace
33+
displayName: Collect DotNet trace
34+
type: boolean
35+
default: false
36+
- name: netTraceCollectArguments
37+
displayName: DotNet trace profile collection arguments (Valid only if "Collect DotNet trace" is true)). Example `-n Microsoft.Azure.WebJobs.Script.WebHost --profile cpu-sampling --duration 00:00:00:10`
38+
type: string
39+
default: '-n Microsoft.Azure.WebJobs.Script.WebHost --providers Microsoft-Diagnostics-DiagnosticSource:0xfffffffffffff7ff:5,Microsoft-Windows-DotNETRuntime:0xC0001801F9:5,FunctionsSystemLogsEventSource:0xFFFFFFFFFFFFFFFF:5 --stopping-event-provider-name Microsoft-Diagnostics-DiagnosticSource --stopping-event-event-name Activity1/Stop'
40+
- name: createJitTrace
41+
displayName: Create Jit trace (Ensure "Collect DotNet trace" is set to true)
42+
type: boolean
43+
default: false
44+
1645
- name: collectPerfViewProfileOnWindows
1746
displayName: Collect PerfView Profile (on Windows)
1847
type: boolean
@@ -50,72 +79,151 @@ extends:
5079
displayName: Record latency(Windows)
5180
jobs:
5281
- ${{ each appId in split(variables.runInstances, ',') }}:
53-
- template: /eng/ci/templates/official/jobs/run-coldstart.yml@self
54-
parameters:
55-
description: .NET9 Web Application
56-
functionAppName: HelloHttpNet9
57-
instanceId: ${{ appId }}
58-
collectPerfViewProfileOnWindows: ${{ parameters.collectPerfViewProfileOnWindows }}
59-
perfViewCollectArguments: ${{ parameters.perfViewCollectArguments }}
60-
- template: /eng/ci/templates/official/jobs/run-coldstart.yml@self
61-
parameters:
62-
description: .NET9 Worker Application
63-
functionAppName: HelloHttpNet9NoProxy
64-
instanceId: ${{ appId }}
65-
collectPerfViewProfileOnWindows: ${{ parameters.collectPerfViewProfileOnWindows }}
66-
perfViewCollectArguments: ${{ parameters.perfViewCollectArguments }}
82+
- ${{ if eq(parameters.includeHelloHttpNet9, true) }}:
83+
- template: /eng/ci/templates/official/jobs/run-coldstart.yml@self
84+
parameters:
85+
description: .NET9 Web Application
86+
functionAppName: HelloHttpNet9
87+
instanceId: ${{ appId }}
88+
collectPerfViewProfileOnWindows: ${{ parameters.collectPerfViewProfileOnWindows }}
89+
perfViewCollectArguments: ${{ parameters.perfViewCollectArguments }}
90+
netTraceCollectArguments: ${{ parameters.netTraceCollectArguments }}
91+
collectNetTrace: ${{ parameters.collectNetTrace }}
92+
createJitTrace: ${{ parameters.createJitTrace }}
93+
- ${{ if eq(parameters.includeHelloHttpNet9NoProxy, true) }}:
94+
- template: /eng/ci/templates/official/jobs/run-coldstart.yml@self
95+
parameters:
96+
description: .NET9 Worker Application
97+
functionAppName: HelloHttpNet9NoProxy
98+
instanceId: ${{ appId }}
99+
collectPerfViewProfileOnWindows: ${{ parameters.collectPerfViewProfileOnWindows }}
100+
perfViewCollectArguments: ${{ parameters.perfViewCollectArguments }}
101+
netTraceCollectArguments: ${{ parameters.netTraceCollectArguments }}
102+
collectNetTrace: ${{ parameters.collectNetTrace }}
103+
createJitTrace: ${{ parameters.createJitTrace }}
104+
- ${{ if eq(parameters.includeHelloHttpNode, true) }}:
105+
- template: /eng/ci/templates/official/jobs/run-coldstart.yml@self
106+
parameters:
107+
description: Node Application
108+
functionAppName: HelloHttpNode
109+
instanceId: ${{ appId }}
110+
collectPerfViewProfileOnWindows: ${{ parameters.collectPerfViewProfileOnWindows }}
111+
perfViewCollectArguments: ${{ parameters.perfViewCollectArguments }}
112+
netTraceCollectArguments: ${{ parameters.netTraceCollectArguments }}
113+
collectNetTrace: ${{ parameters.collectNetTrace }}
114+
createJitTrace: ${{ parameters.createJitTrace }}
67115

68116
- stage: CalculateWindows
69117
displayName: Process results(Windows)
70118
dependsOn: RunWindows
119+
condition: always()
71120
jobs:
72-
- template: /eng/ci/templates/official/jobs/process-coldstart.yml@self
73-
parameters:
74-
functionAppName: HelloHttpNet9
75-
description: .NET9 Web Application
76-
runInstances:
77-
items: ${{ split(variables.runInstances, ',') }}
78-
- template: /eng/ci/templates/official/jobs/process-coldstart.yml@self
79-
parameters:
80-
functionAppName: HelloHttpNet9NoProxy
81-
description: .NET9 Worker Application
82-
runInstances:
83-
items: ${{ split(variables.runInstances, ',') }}
121+
- ${{ if eq(parameters.includeHelloHttpNet9, true) }}:
122+
- template: /eng/ci/templates/official/jobs/process-coldstart.yml@self
123+
parameters:
124+
functionAppName: HelloHttpNet9
125+
description: .NET9 Web Application
126+
runInstances:
127+
items: ${{ split(variables.runInstances, ',') }}
128+
- ${{ if eq(parameters.includeHelloHttpNet9NoProxy, true) }}:
129+
- template: /eng/ci/templates/official/jobs/process-coldstart.yml@self
130+
parameters:
131+
functionAppName: HelloHttpNet9NoProxy
132+
description: .NET9 Worker Application
133+
runInstances:
134+
items: ${{ split(variables.runInstances, ',') }}
135+
- ${{ if eq(parameters.includeHelloHttpNode, true) }}:
136+
- template: /eng/ci/templates/official/jobs/process-coldstart.yml@self
137+
parameters:
138+
functionAppName: HelloHttpNode
139+
description: Node Application
140+
runInstances:
141+
items: ${{ split(variables.runInstances, ',') }}
84142

85143
# # LINUX
86144
- stage: RunLinux
87145
dependsOn: []
88146
displayName: Record latency(Linux)
89147
jobs:
90148
- ${{ each appId in split(variables.runInstances, ',') }}:
91-
- template: /eng/ci/templates/official/jobs/run-coldstart.yml@self
149+
- ${{ if eq(parameters.includeHelloHttpNet9, true) }}:
150+
- template: /eng/ci/templates/official/jobs/run-coldstart.yml@self
151+
parameters:
152+
description: .NET9 Web Application
153+
functionAppName: HelloHttpNet9
154+
instanceId: ${{ appId }}
155+
os: Linux
156+
collectNetTrace: ${{ parameters.collectNetTrace }}
157+
netTraceCollectArguments: ${{ parameters.netTraceCollectArguments }}
158+
createJitTrace: ${{ parameters.createJitTrace }}
159+
- ${{ if eq(parameters.includeHelloHttpNet9NoProxy, true) }}:
160+
- template: /eng/ci/templates/official/jobs/run-coldstart.yml@self
161+
parameters:
162+
description: .NET9 Worker Application
163+
functionAppName: HelloHttpNet9NoProxy
164+
instanceId: ${{ appId }}
165+
os: Linux
166+
collectNetTrace: ${{ parameters.collectNetTrace }}
167+
netTraceCollectArguments: ${{ parameters.netTraceCollectArguments }}
168+
createJitTrace: ${{ parameters.createJitTrace }}
169+
- ${{ if eq(parameters.includeHelloHttpNode, true) }}:
170+
- template: /eng/ci/templates/official/jobs/run-coldstart.yml@self
171+
parameters:
172+
description: Node Application
173+
functionAppName: HelloHttpNode
174+
instanceId: ${{ appId }}
175+
os: Linux
176+
collectNetTrace: ${{ parameters.collectNetTrace }}
177+
netTraceCollectArguments: ${{ parameters.netTraceCollectArguments }}
178+
createJitTrace: ${{ parameters.createJitTrace }}
179+
180+
- stage: CalculateLinux
181+
displayName: Process results(Linux)
182+
dependsOn: RunLinux
183+
condition: always()
184+
jobs:
185+
- ${{ if eq(parameters.includeHelloHttpNet9, true) }}:
186+
- template: /eng/ci/templates/official/jobs/process-coldstart.yml@self
92187
parameters:
93-
description: .NET9 Web Application
94188
functionAppName: HelloHttpNet9
95-
instanceId: ${{ appId }}
189+
description: .NET9 Web Application
96190
os: Linux
97-
- template: /eng/ci/templates/official/jobs/run-coldstart.yml@self
191+
runInstances:
192+
items: ${{ split(variables.runInstances, ',') }}
193+
- ${{ if eq(parameters.includeHelloHttpNet9NoProxy, true) }}:
194+
- template: /eng/ci/templates/official/jobs/process-coldstart.yml@self
98195
parameters:
99-
description: .NET9 Worker Application
100196
functionAppName: HelloHttpNet9NoProxy
101-
instanceId: ${{ appId }}
197+
description: .NET9 Worker Application
102198
os: Linux
103-
104-
- stage: CalculateLinux
105-
displayName: Process results(Linux)
106-
dependsOn: RunLinux
199+
runInstances:
200+
items: ${{ split(variables.runInstances, ',') }}
201+
- ${{ if eq(parameters.includeHelloHttpNode, true) }}:
202+
- template: /eng/ci/templates/official/jobs/process-coldstart.yml@self
203+
parameters:
204+
functionAppName: HelloHttpNode
205+
description: Node Application
206+
os: Linux
207+
runInstances:
208+
items: ${{ split(variables.runInstances, ',') }}
209+
210+
# Merge JIT traces from different function apps and dedupe.
211+
- stage: MergeWindowsJitTraceFiles
212+
displayName: Create jit trace(Windows)
213+
condition: and(succeeded(), eq('${{ parameters.createJitTrace }}', true))
214+
dependsOn:
215+
- CalculateWindows
107216
jobs:
108-
- template: /eng/ci/templates/official/jobs/process-coldstart.yml@self
217+
- template: /eng/ci/templates/official/jobs/merge-jittrace.yml@self
109218
parameters:
110-
functionAppName: HelloHttpNet9
111-
description: .NET9 Web Application
112-
os: Linux
113-
runInstances:
114-
items: ${{ split(variables.runInstances, ',') }}
115-
- template: /eng/ci/templates/official/jobs/process-coldstart.yml@self
219+
os: Windows
220+
221+
- stage: MergeLinuxJitTraceFiles
222+
displayName: Create jit trace(Linux)
223+
condition: and(succeeded(), eq('${{ parameters.createJitTrace }}', true))
224+
dependsOn:
225+
- CalculateLinux
226+
jobs:
227+
- template: /eng/ci/templates/official/jobs/merge-jittrace.yml@self
116228
parameters:
117-
functionAppName: HelloHttpNet9NoProxy
118-
description: .NET9 Worker Application
119229
os: Linux
120-
runInstances:
121-
items: ${{ split(variables.runInstances, ',') }}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
parameters:
2+
- name: os
3+
type: string
4+
default: Windows
5+
values:
6+
- Windows
7+
- Linux
8+
- name: functionAppNames
9+
type: object
10+
default:
11+
- HelloHttpNet9
12+
- HelloHttpNet9NoProxy
13+
- HelloHttpNode
14+
15+
jobs:
16+
- job: ${{ parameters.os }}
17+
pool:
18+
name: 1es-pool-azfunc-benchmarking-large
19+
image: 1es-windows-2022-benchmark-runner-vanilla
20+
os: windows
21+
22+
variables:
23+
mergedJitTraceOutputDirectory: $(Build.ArtifactStagingDirectory)/MergedJitTraces
24+
mergedJitTraceFilePath: $(mergedJitTraceOutputDirectory)/$(Build.BuildNumber)_${{ parameters.os }}_coldstart.jittrace
25+
26+
templateContext:
27+
outputParentDirectory: $(Build.ArtifactStagingDirectory)
28+
outputs:
29+
- output: pipelineArtifact
30+
displayName: Publish benchmark results
31+
path: $(mergedJitTraceFilePath)
32+
artifact: Functions_JitTrace_${{ parameters.os }}
33+
34+
steps:
35+
- pwsh: |
36+
New-Item -ItemType Directory -Path $(mergedJitTraceOutputDirectory)
37+
displayName: Create directories
38+
39+
- ${{ each functionApp in parameters.functionAppNames }}:
40+
- task: DownloadPipelineArtifact@2
41+
displayName: Download PerfTraceData artifacts for ${{ parameters.os }} ${{ functionApp }}
42+
inputs:
43+
artifact: AzFunc_${{ parameters.os }}_${{ functionApp }}
44+
patterns: '**/*.jittrace'
45+
path: '$(Pipeline.Workspace)/${{ parameters.os }}_jittrace/${{ functionApp }}'
46+
continueOnError: true
47+
48+
- pwsh: |
49+
$output = "$(mergedJitTraceFilePath)"
50+
$files = Get-ChildItem -Path "$(Pipeline.Workspace)/${{ parameters.os }}_jittrace" -Recurse -Filter *.jittrace
51+
Write-Host "Merging the following .jittrace files:"
52+
$files | ForEach-Object { Write-Host $_.FullName }
53+
$files | Get-Content | Sort-Object -Unique | Set-Content $output
54+
$lineCount = (Get-Content $output | Measure-Object -Line).Lines
55+
Write-Host "Final merged file line count: $lineCount"
56+
displayName: Merge all .jittrace files ${{ parameters.os }}

0 commit comments

Comments
 (0)