Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate - #127292

Merged
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate
Apr 29, 2026
Merged

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate#127292
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 22, 2026

Copy link
Copy Markdown
Member

Summary

This change introduces a new DOTNET_EventPipeThreadSamplingRate environment variable that allows overriding the default EventPipe CPU sample profiler interval.

The default 1ms is too quick for WASM/browser.

This split from #126324 for smaller code review.

Changes

New config: DOTNET_EventPipeThreadSamplingRate

  • src/coreclr/inc/clrconfigvalues.h — Register the new INTERNAL_EventPipeThreadSamplingRate DWORD config (default 0).
  • src/native/eventpipe/ep-rt.h — Declare ep_rt_config_value_get_sampling_rate() in the shared EventPipe runtime abstraction header.
  • src/native/eventpipe/ep.c — In ep_init(), read the configured rate and convert from milliseconds to nanoseconds. Falls back to the per-platform default when the value is 0.

Per-runtime implementations of ep_rt_config_value_get_sampling_rate

  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h — CoreCLR: reads via CLRConfig::GetConfigValue.
  • src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h — NativeAOT: reads via RhConfig::Environment::TryGetIntegerValue.
  • src/mono/mono/eventpipe/ep-rt-mono.h — Mono: reads via g_getenv("DOTNET_EventPipeThreadSamplingRate").

Blazor/Browser WASM build integration

  • src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
    • Gate _AddWasmDiagnosticPortsEnvironmentVariable target on EnableDiagnostics=true.
    • Parse WasmPerformanceInstrumentation to extract an optional ,interval=<ms> suffix.
    • Pass the filter portion as DOTNET_WasmPerformanceInstrumentation and the interval (if present) as DOTNET_EventPipeThreadSamplingRate.

Miscellaneous fixes

  • src/native/eventpipe/ds-ipc-pal-websocket.h

    • Wrap websocket extern declarations in extern "C" to prevent C++ name mangling (needed for JS interop in browser WASM).
    • Fix ds_rt_websocket_recv signature: remove incorrect const from the receive buffer parameter.
  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h

    • Add PROFILING_SUPPORTED preprocessor guard around ep_rt_notify_profiler_provider_created body.
    • Update #endif comments for clarity.
  • src/native/eventpipe/ep-session.c

    • Add EP_ASSERT(session->buffer_manager != NULL) invariant check in the streaming loop shutdown path.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 22, 2026
@pavelsavarapavelsavara self-assigned this Apr 22, 2026
CopilotAI review requested due to automatic review settings April 22, 2026 17:55
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @dotnet/area-system-diagnostics
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new runtime-configurable knob (DOTNET_EventPipeCpuSamplingRate) to override EventPipe CPU sample-profiler interval (intended to allow slower sampling on WASM/browser), and wires it through CoreCLR/NativeAOT/Mono plus browser WASM build plumbing.

Changes:

  • Introduce EventPipeCpuSamplingRate config/env var and consume it in EventPipe init (ms → ns conversion, 0 = default).
  • Implement ep_rt_config_value_get_sampling_rate() for CoreCLR, NativeAOT, and Mono runtime layers.
  • Update browser WASM SDK targets to pass DOTNET_EventPipeCpuSamplingRate (and related instrumentation env vars) and adjust websocket interop declarations.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/eventpipe/ep.cReads configurable sampling interval and applies it during ep_init().
src/native/eventpipe/ep-session.cAdds an assert in the no-threads streaming loop shutdown path.
src/native/eventpipe/ep-rt.hAdds runtime abstraction API for sampling-rate config retrieval.
src/native/eventpipe/ds-ipc-pal-websocket.hAdjusts websocket externs for C++/interop and fixes recv buffer constness.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsAdds EnableDiagnostics gating and parses WasmPerformanceInstrumentation for optional interval.
src/mono/mono/eventpipe/ep-rt-mono.hMono implementation of sampling-rate config getter via env var.
src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.hCoreCLR implementation of sampling-rate config getter; minor preprocessor cleanup.
src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.hNativeAOT implementation of sampling-rate config getter.
src/coreclr/inc/clrconfigvalues.hRegisters new CoreCLR config knob INTERNAL_EventPipeCpuSamplingRate.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 22, 2026 18:31
…oft.NET.Sdk.WebAssembly.Browser.targets
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
CopilotAI review requested due to automatic review settings April 23, 2026 21:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
CopilotAI review requested due to automatic review settings April 24, 2026 09:19

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/eventpipe/ep.c Outdated
Comment threadsrc/native/eventpipe/ep.c Outdated

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@jkotas

Copy link
Copy Markdown
Member

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me modulo comments inline.

Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
# Conflicts:
#	src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
CopilotAI review requested due to automatic review settings April 27, 2026 17:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/eventpipe/ep.c
Comment threadsrc/coreclr/inc/clrconfigvalues.h
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h
Comment threadsrc/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h
@pavelsavarapavelsavara changed the title Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeCpuSamplingRateAdd configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRateApr 27, 2026
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@pavelsavara
pavelsavara merged commit 4e8ab2d into dotnet:mainApr 29, 2026
158 of 160 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_sample_rate branch April 29, 2026 07:15
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 29, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pavelsavara@jkotas@noahfalk@maraf@lateralusX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate - #127292

Merged
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate
Apr 29, 2026
Merged

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate#127292
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 22, 2026

Copy link
Copy Markdown
Member

Summary

This change introduces a new DOTNET_EventPipeThreadSamplingRate environment variable that allows overriding the default EventPipe CPU sample profiler interval.

The default 1ms is too quick for WASM/browser.

This split from #126324 for smaller code review.

Changes

New config: DOTNET_EventPipeThreadSamplingRate

  • src/coreclr/inc/clrconfigvalues.h — Register the new INTERNAL_EventPipeThreadSamplingRate DWORD config (default 0).
  • src/native/eventpipe/ep-rt.h — Declare ep_rt_config_value_get_sampling_rate() in the shared EventPipe runtime abstraction header.
  • src/native/eventpipe/ep.c — In ep_init(), read the configured rate and convert from milliseconds to nanoseconds. Falls back to the per-platform default when the value is 0.

Per-runtime implementations of ep_rt_config_value_get_sampling_rate

  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h — CoreCLR: reads via CLRConfig::GetConfigValue.
  • src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h — NativeAOT: reads via RhConfig::Environment::TryGetIntegerValue.
  • src/mono/mono/eventpipe/ep-rt-mono.h — Mono: reads via g_getenv("DOTNET_EventPipeThreadSamplingRate").

Blazor/Browser WASM build integration

  • src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
    • Gate _AddWasmDiagnosticPortsEnvironmentVariable target on EnableDiagnostics=true.
    • Parse WasmPerformanceInstrumentation to extract an optional ,interval=<ms> suffix.
    • Pass the filter portion as DOTNET_WasmPerformanceInstrumentation and the interval (if present) as DOTNET_EventPipeThreadSamplingRate.

Miscellaneous fixes

  • src/native/eventpipe/ds-ipc-pal-websocket.h

    • Wrap websocket extern declarations in extern "C" to prevent C++ name mangling (needed for JS interop in browser WASM).
    • Fix ds_rt_websocket_recv signature: remove incorrect const from the receive buffer parameter.
  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h

    • Add PROFILING_SUPPORTED preprocessor guard around ep_rt_notify_profiler_provider_created body.
    • Update #endif comments for clarity.
  • src/native/eventpipe/ep-session.c

    • Add EP_ASSERT(session->buffer_manager != NULL) invariant check in the streaming loop shutdown path.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 22, 2026
@pavelsavarapavelsavara self-assigned this Apr 22, 2026
CopilotAI review requested due to automatic review settings April 22, 2026 17:55
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @dotnet/area-system-diagnostics
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new runtime-configurable knob (DOTNET_EventPipeCpuSamplingRate) to override EventPipe CPU sample-profiler interval (intended to allow slower sampling on WASM/browser), and wires it through CoreCLR/NativeAOT/Mono plus browser WASM build plumbing.

Changes:

  • Introduce EventPipeCpuSamplingRate config/env var and consume it in EventPipe init (ms → ns conversion, 0 = default).
  • Implement ep_rt_config_value_get_sampling_rate() for CoreCLR, NativeAOT, and Mono runtime layers.
  • Update browser WASM SDK targets to pass DOTNET_EventPipeCpuSamplingRate (and related instrumentation env vars) and adjust websocket interop declarations.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/eventpipe/ep.cReads configurable sampling interval and applies it during ep_init().
src/native/eventpipe/ep-session.cAdds an assert in the no-threads streaming loop shutdown path.
src/native/eventpipe/ep-rt.hAdds runtime abstraction API for sampling-rate config retrieval.
src/native/eventpipe/ds-ipc-pal-websocket.hAdjusts websocket externs for C++/interop and fixes recv buffer constness.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsAdds EnableDiagnostics gating and parses WasmPerformanceInstrumentation for optional interval.
src/mono/mono/eventpipe/ep-rt-mono.hMono implementation of sampling-rate config getter via env var.
src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.hCoreCLR implementation of sampling-rate config getter; minor preprocessor cleanup.
src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.hNativeAOT implementation of sampling-rate config getter.
src/coreclr/inc/clrconfigvalues.hRegisters new CoreCLR config knob INTERNAL_EventPipeCpuSamplingRate.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 22, 2026 18:31
…oft.NET.Sdk.WebAssembly.Browser.targets
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
CopilotAI review requested due to automatic review settings April 23, 2026 21:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
CopilotAI review requested due to automatic review settings April 24, 2026 09:19

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/eventpipe/ep.c Outdated
Comment threadsrc/native/eventpipe/ep.c Outdated

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@jkotas

Copy link
Copy Markdown
Member

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me modulo comments inline.

Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
# Conflicts:
#	src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
CopilotAI review requested due to automatic review settings April 27, 2026 17:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/eventpipe/ep.c
Comment threadsrc/coreclr/inc/clrconfigvalues.h
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h
Comment threadsrc/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h
@pavelsavarapavelsavara changed the title Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeCpuSamplingRateAdd configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRateApr 27, 2026
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@pavelsavara
pavelsavara merged commit 4e8ab2d into dotnet:mainApr 29, 2026
158 of 160 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_sample_rate branch April 29, 2026 07:15
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 29, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pavelsavara@jkotas@noahfalk@maraf@lateralusX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate - #127292

Merged
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate
Apr 29, 2026
Merged

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate#127292
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 22, 2026

Copy link
Copy Markdown
Member

Summary

This change introduces a new DOTNET_EventPipeThreadSamplingRate environment variable that allows overriding the default EventPipe CPU sample profiler interval.

The default 1ms is too quick for WASM/browser.

This split from #126324 for smaller code review.

Changes

New config: DOTNET_EventPipeThreadSamplingRate

  • src/coreclr/inc/clrconfigvalues.h — Register the new INTERNAL_EventPipeThreadSamplingRate DWORD config (default 0).
  • src/native/eventpipe/ep-rt.h — Declare ep_rt_config_value_get_sampling_rate() in the shared EventPipe runtime abstraction header.
  • src/native/eventpipe/ep.c — In ep_init(), read the configured rate and convert from milliseconds to nanoseconds. Falls back to the per-platform default when the value is 0.

Per-runtime implementations of ep_rt_config_value_get_sampling_rate

  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h — CoreCLR: reads via CLRConfig::GetConfigValue.
  • src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h — NativeAOT: reads via RhConfig::Environment::TryGetIntegerValue.
  • src/mono/mono/eventpipe/ep-rt-mono.h — Mono: reads via g_getenv("DOTNET_EventPipeThreadSamplingRate").

Blazor/Browser WASM build integration

  • src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
    • Gate _AddWasmDiagnosticPortsEnvironmentVariable target on EnableDiagnostics=true.
    • Parse WasmPerformanceInstrumentation to extract an optional ,interval=<ms> suffix.
    • Pass the filter portion as DOTNET_WasmPerformanceInstrumentation and the interval (if present) as DOTNET_EventPipeThreadSamplingRate.

Miscellaneous fixes

  • src/native/eventpipe/ds-ipc-pal-websocket.h

    • Wrap websocket extern declarations in extern "C" to prevent C++ name mangling (needed for JS interop in browser WASM).
    • Fix ds_rt_websocket_recv signature: remove incorrect const from the receive buffer parameter.
  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h

    • Add PROFILING_SUPPORTED preprocessor guard around ep_rt_notify_profiler_provider_created body.
    • Update #endif comments for clarity.
  • src/native/eventpipe/ep-session.c

    • Add EP_ASSERT(session->buffer_manager != NULL) invariant check in the streaming loop shutdown path.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 22, 2026
@pavelsavarapavelsavara self-assigned this Apr 22, 2026
CopilotAI review requested due to automatic review settings April 22, 2026 17:55
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @dotnet/area-system-diagnostics
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new runtime-configurable knob (DOTNET_EventPipeCpuSamplingRate) to override EventPipe CPU sample-profiler interval (intended to allow slower sampling on WASM/browser), and wires it through CoreCLR/NativeAOT/Mono plus browser WASM build plumbing.

Changes:

  • Introduce EventPipeCpuSamplingRate config/env var and consume it in EventPipe init (ms → ns conversion, 0 = default).
  • Implement ep_rt_config_value_get_sampling_rate() for CoreCLR, NativeAOT, and Mono runtime layers.
  • Update browser WASM SDK targets to pass DOTNET_EventPipeCpuSamplingRate (and related instrumentation env vars) and adjust websocket interop declarations.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/eventpipe/ep.cReads configurable sampling interval and applies it during ep_init().
src/native/eventpipe/ep-session.cAdds an assert in the no-threads streaming loop shutdown path.
src/native/eventpipe/ep-rt.hAdds runtime abstraction API for sampling-rate config retrieval.
src/native/eventpipe/ds-ipc-pal-websocket.hAdjusts websocket externs for C++/interop and fixes recv buffer constness.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsAdds EnableDiagnostics gating and parses WasmPerformanceInstrumentation for optional interval.
src/mono/mono/eventpipe/ep-rt-mono.hMono implementation of sampling-rate config getter via env var.
src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.hCoreCLR implementation of sampling-rate config getter; minor preprocessor cleanup.
src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.hNativeAOT implementation of sampling-rate config getter.
src/coreclr/inc/clrconfigvalues.hRegisters new CoreCLR config knob INTERNAL_EventPipeCpuSamplingRate.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 22, 2026 18:31
…oft.NET.Sdk.WebAssembly.Browser.targets
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
CopilotAI review requested due to automatic review settings April 23, 2026 21:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
CopilotAI review requested due to automatic review settings April 24, 2026 09:19

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/eventpipe/ep.c Outdated
Comment threadsrc/native/eventpipe/ep.c Outdated

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@jkotas

Copy link
Copy Markdown
Member

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me modulo comments inline.

Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
# Conflicts:
#	src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
CopilotAI review requested due to automatic review settings April 27, 2026 17:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/eventpipe/ep.c
Comment threadsrc/coreclr/inc/clrconfigvalues.h
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h
Comment threadsrc/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h
@pavelsavarapavelsavara changed the title Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeCpuSamplingRateAdd configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRateApr 27, 2026
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@pavelsavara
pavelsavara merged commit 4e8ab2d into dotnet:mainApr 29, 2026
158 of 160 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_sample_rate branch April 29, 2026 07:15
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 29, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pavelsavara@jkotas@noahfalk@maraf@lateralusX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate - #127292

Merged
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate
Apr 29, 2026
Merged

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate#127292
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 22, 2026

Copy link
Copy Markdown
Member

Summary

This change introduces a new DOTNET_EventPipeThreadSamplingRate environment variable that allows overriding the default EventPipe CPU sample profiler interval.

The default 1ms is too quick for WASM/browser.

This split from #126324 for smaller code review.

Changes

New config: DOTNET_EventPipeThreadSamplingRate

  • src/coreclr/inc/clrconfigvalues.h — Register the new INTERNAL_EventPipeThreadSamplingRate DWORD config (default 0).
  • src/native/eventpipe/ep-rt.h — Declare ep_rt_config_value_get_sampling_rate() in the shared EventPipe runtime abstraction header.
  • src/native/eventpipe/ep.c — In ep_init(), read the configured rate and convert from milliseconds to nanoseconds. Falls back to the per-platform default when the value is 0.

Per-runtime implementations of ep_rt_config_value_get_sampling_rate

  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h — CoreCLR: reads via CLRConfig::GetConfigValue.
  • src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h — NativeAOT: reads via RhConfig::Environment::TryGetIntegerValue.
  • src/mono/mono/eventpipe/ep-rt-mono.h — Mono: reads via g_getenv("DOTNET_EventPipeThreadSamplingRate").

Blazor/Browser WASM build integration

  • src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
    • Gate _AddWasmDiagnosticPortsEnvironmentVariable target on EnableDiagnostics=true.
    • Parse WasmPerformanceInstrumentation to extract an optional ,interval=<ms> suffix.
    • Pass the filter portion as DOTNET_WasmPerformanceInstrumentation and the interval (if present) as DOTNET_EventPipeThreadSamplingRate.

Miscellaneous fixes

  • src/native/eventpipe/ds-ipc-pal-websocket.h

    • Wrap websocket extern declarations in extern "C" to prevent C++ name mangling (needed for JS interop in browser WASM).
    • Fix ds_rt_websocket_recv signature: remove incorrect const from the receive buffer parameter.
  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h

    • Add PROFILING_SUPPORTED preprocessor guard around ep_rt_notify_profiler_provider_created body.
    • Update #endif comments for clarity.
  • src/native/eventpipe/ep-session.c

    • Add EP_ASSERT(session->buffer_manager != NULL) invariant check in the streaming loop shutdown path.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 22, 2026
@pavelsavarapavelsavara self-assigned this Apr 22, 2026
CopilotAI review requested due to automatic review settings April 22, 2026 17:55
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @dotnet/area-system-diagnostics
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new runtime-configurable knob (DOTNET_EventPipeCpuSamplingRate) to override EventPipe CPU sample-profiler interval (intended to allow slower sampling on WASM/browser), and wires it through CoreCLR/NativeAOT/Mono plus browser WASM build plumbing.

Changes:

  • Introduce EventPipeCpuSamplingRate config/env var and consume it in EventPipe init (ms → ns conversion, 0 = default).
  • Implement ep_rt_config_value_get_sampling_rate() for CoreCLR, NativeAOT, and Mono runtime layers.
  • Update browser WASM SDK targets to pass DOTNET_EventPipeCpuSamplingRate (and related instrumentation env vars) and adjust websocket interop declarations.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/eventpipe/ep.cReads configurable sampling interval and applies it during ep_init().
src/native/eventpipe/ep-session.cAdds an assert in the no-threads streaming loop shutdown path.
src/native/eventpipe/ep-rt.hAdds runtime abstraction API for sampling-rate config retrieval.
src/native/eventpipe/ds-ipc-pal-websocket.hAdjusts websocket externs for C++/interop and fixes recv buffer constness.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsAdds EnableDiagnostics gating and parses WasmPerformanceInstrumentation for optional interval.
src/mono/mono/eventpipe/ep-rt-mono.hMono implementation of sampling-rate config getter via env var.
src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.hCoreCLR implementation of sampling-rate config getter; minor preprocessor cleanup.
src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.hNativeAOT implementation of sampling-rate config getter.
src/coreclr/inc/clrconfigvalues.hRegisters new CoreCLR config knob INTERNAL_EventPipeCpuSamplingRate.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 22, 2026 18:31
…oft.NET.Sdk.WebAssembly.Browser.targets
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
CopilotAI review requested due to automatic review settings April 23, 2026 21:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
CopilotAI review requested due to automatic review settings April 24, 2026 09:19

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/eventpipe/ep.c Outdated
Comment threadsrc/native/eventpipe/ep.c Outdated

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@jkotas

Copy link
Copy Markdown
Member

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me modulo comments inline.

Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
# Conflicts:
#	src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
CopilotAI review requested due to automatic review settings April 27, 2026 17:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/eventpipe/ep.c
Comment threadsrc/coreclr/inc/clrconfigvalues.h
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h
Comment threadsrc/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h
@pavelsavarapavelsavara changed the title Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeCpuSamplingRateAdd configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRateApr 27, 2026
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@pavelsavara
pavelsavara merged commit 4e8ab2d into dotnet:mainApr 29, 2026
158 of 160 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_sample_rate branch April 29, 2026 07:15
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 29, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pavelsavara@jkotas@noahfalk@maraf@lateralusX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate - #127292

Merged
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate
Apr 29, 2026
Merged

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate#127292
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 22, 2026

Copy link
Copy Markdown
Member

Summary

This change introduces a new DOTNET_EventPipeThreadSamplingRate environment variable that allows overriding the default EventPipe CPU sample profiler interval.

The default 1ms is too quick for WASM/browser.

This split from #126324 for smaller code review.

Changes

New config: DOTNET_EventPipeThreadSamplingRate

  • src/coreclr/inc/clrconfigvalues.h — Register the new INTERNAL_EventPipeThreadSamplingRate DWORD config (default 0).
  • src/native/eventpipe/ep-rt.h — Declare ep_rt_config_value_get_sampling_rate() in the shared EventPipe runtime abstraction header.
  • src/native/eventpipe/ep.c — In ep_init(), read the configured rate and convert from milliseconds to nanoseconds. Falls back to the per-platform default when the value is 0.

Per-runtime implementations of ep_rt_config_value_get_sampling_rate

  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h — CoreCLR: reads via CLRConfig::GetConfigValue.
  • src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h — NativeAOT: reads via RhConfig::Environment::TryGetIntegerValue.
  • src/mono/mono/eventpipe/ep-rt-mono.h — Mono: reads via g_getenv("DOTNET_EventPipeThreadSamplingRate").

Blazor/Browser WASM build integration

  • src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
    • Gate _AddWasmDiagnosticPortsEnvironmentVariable target on EnableDiagnostics=true.
    • Parse WasmPerformanceInstrumentation to extract an optional ,interval=<ms> suffix.
    • Pass the filter portion as DOTNET_WasmPerformanceInstrumentation and the interval (if present) as DOTNET_EventPipeThreadSamplingRate.

Miscellaneous fixes

  • src/native/eventpipe/ds-ipc-pal-websocket.h

    • Wrap websocket extern declarations in extern "C" to prevent C++ name mangling (needed for JS interop in browser WASM).
    • Fix ds_rt_websocket_recv signature: remove incorrect const from the receive buffer parameter.
  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h

    • Add PROFILING_SUPPORTED preprocessor guard around ep_rt_notify_profiler_provider_created body.
    • Update #endif comments for clarity.
  • src/native/eventpipe/ep-session.c

    • Add EP_ASSERT(session->buffer_manager != NULL) invariant check in the streaming loop shutdown path.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 22, 2026
@pavelsavarapavelsavara self-assigned this Apr 22, 2026
CopilotAI review requested due to automatic review settings April 22, 2026 17:55
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @dotnet/area-system-diagnostics
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new runtime-configurable knob (DOTNET_EventPipeCpuSamplingRate) to override EventPipe CPU sample-profiler interval (intended to allow slower sampling on WASM/browser), and wires it through CoreCLR/NativeAOT/Mono plus browser WASM build plumbing.

Changes:

  • Introduce EventPipeCpuSamplingRate config/env var and consume it in EventPipe init (ms → ns conversion, 0 = default).
  • Implement ep_rt_config_value_get_sampling_rate() for CoreCLR, NativeAOT, and Mono runtime layers.
  • Update browser WASM SDK targets to pass DOTNET_EventPipeCpuSamplingRate (and related instrumentation env vars) and adjust websocket interop declarations.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/eventpipe/ep.cReads configurable sampling interval and applies it during ep_init().
src/native/eventpipe/ep-session.cAdds an assert in the no-threads streaming loop shutdown path.
src/native/eventpipe/ep-rt.hAdds runtime abstraction API for sampling-rate config retrieval.
src/native/eventpipe/ds-ipc-pal-websocket.hAdjusts websocket externs for C++/interop and fixes recv buffer constness.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsAdds EnableDiagnostics gating and parses WasmPerformanceInstrumentation for optional interval.
src/mono/mono/eventpipe/ep-rt-mono.hMono implementation of sampling-rate config getter via env var.
src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.hCoreCLR implementation of sampling-rate config getter; minor preprocessor cleanup.
src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.hNativeAOT implementation of sampling-rate config getter.
src/coreclr/inc/clrconfigvalues.hRegisters new CoreCLR config knob INTERNAL_EventPipeCpuSamplingRate.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 22, 2026 18:31
…oft.NET.Sdk.WebAssembly.Browser.targets
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
CopilotAI review requested due to automatic review settings April 23, 2026 21:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
CopilotAI review requested due to automatic review settings April 24, 2026 09:19

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/eventpipe/ep.c Outdated
Comment threadsrc/native/eventpipe/ep.c Outdated

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@jkotas

Copy link
Copy Markdown
Member

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me modulo comments inline.

Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
# Conflicts:
#	src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
CopilotAI review requested due to automatic review settings April 27, 2026 17:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/eventpipe/ep.c
Comment threadsrc/coreclr/inc/clrconfigvalues.h
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h
Comment threadsrc/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h
@pavelsavarapavelsavara changed the title Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeCpuSamplingRateAdd configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRateApr 27, 2026
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@pavelsavara
pavelsavara merged commit 4e8ab2d into dotnet:mainApr 29, 2026
158 of 160 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_sample_rate branch April 29, 2026 07:15
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 29, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pavelsavara@jkotas@noahfalk@maraf@lateralusX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate - #127292

Merged
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate
Apr 29, 2026
Merged

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate#127292
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 22, 2026

Copy link
Copy Markdown
Member

Summary

This change introduces a new DOTNET_EventPipeThreadSamplingRate environment variable that allows overriding the default EventPipe CPU sample profiler interval.

The default 1ms is too quick for WASM/browser.

This split from #126324 for smaller code review.

Changes

New config: DOTNET_EventPipeThreadSamplingRate

  • src/coreclr/inc/clrconfigvalues.h — Register the new INTERNAL_EventPipeThreadSamplingRate DWORD config (default 0).
  • src/native/eventpipe/ep-rt.h — Declare ep_rt_config_value_get_sampling_rate() in the shared EventPipe runtime abstraction header.
  • src/native/eventpipe/ep.c — In ep_init(), read the configured rate and convert from milliseconds to nanoseconds. Falls back to the per-platform default when the value is 0.

Per-runtime implementations of ep_rt_config_value_get_sampling_rate

  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h — CoreCLR: reads via CLRConfig::GetConfigValue.
  • src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h — NativeAOT: reads via RhConfig::Environment::TryGetIntegerValue.
  • src/mono/mono/eventpipe/ep-rt-mono.h — Mono: reads via g_getenv("DOTNET_EventPipeThreadSamplingRate").

Blazor/Browser WASM build integration

  • src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
    • Gate _AddWasmDiagnosticPortsEnvironmentVariable target on EnableDiagnostics=true.
    • Parse WasmPerformanceInstrumentation to extract an optional ,interval=<ms> suffix.
    • Pass the filter portion as DOTNET_WasmPerformanceInstrumentation and the interval (if present) as DOTNET_EventPipeThreadSamplingRate.

Miscellaneous fixes

  • src/native/eventpipe/ds-ipc-pal-websocket.h

    • Wrap websocket extern declarations in extern "C" to prevent C++ name mangling (needed for JS interop in browser WASM).
    • Fix ds_rt_websocket_recv signature: remove incorrect const from the receive buffer parameter.
  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h

    • Add PROFILING_SUPPORTED preprocessor guard around ep_rt_notify_profiler_provider_created body.
    • Update #endif comments for clarity.
  • src/native/eventpipe/ep-session.c

    • Add EP_ASSERT(session->buffer_manager != NULL) invariant check in the streaming loop shutdown path.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 22, 2026
@pavelsavarapavelsavara self-assigned this Apr 22, 2026
CopilotAI review requested due to automatic review settings April 22, 2026 17:55
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @dotnet/area-system-diagnostics
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new runtime-configurable knob (DOTNET_EventPipeCpuSamplingRate) to override EventPipe CPU sample-profiler interval (intended to allow slower sampling on WASM/browser), and wires it through CoreCLR/NativeAOT/Mono plus browser WASM build plumbing.

Changes:

  • Introduce EventPipeCpuSamplingRate config/env var and consume it in EventPipe init (ms → ns conversion, 0 = default).
  • Implement ep_rt_config_value_get_sampling_rate() for CoreCLR, NativeAOT, and Mono runtime layers.
  • Update browser WASM SDK targets to pass DOTNET_EventPipeCpuSamplingRate (and related instrumentation env vars) and adjust websocket interop declarations.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/eventpipe/ep.cReads configurable sampling interval and applies it during ep_init().
src/native/eventpipe/ep-session.cAdds an assert in the no-threads streaming loop shutdown path.
src/native/eventpipe/ep-rt.hAdds runtime abstraction API for sampling-rate config retrieval.
src/native/eventpipe/ds-ipc-pal-websocket.hAdjusts websocket externs for C++/interop and fixes recv buffer constness.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsAdds EnableDiagnostics gating and parses WasmPerformanceInstrumentation for optional interval.
src/mono/mono/eventpipe/ep-rt-mono.hMono implementation of sampling-rate config getter via env var.
src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.hCoreCLR implementation of sampling-rate config getter; minor preprocessor cleanup.
src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.hNativeAOT implementation of sampling-rate config getter.
src/coreclr/inc/clrconfigvalues.hRegisters new CoreCLR config knob INTERNAL_EventPipeCpuSamplingRate.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 22, 2026 18:31
…oft.NET.Sdk.WebAssembly.Browser.targets
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
CopilotAI review requested due to automatic review settings April 23, 2026 21:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
CopilotAI review requested due to automatic review settings April 24, 2026 09:19

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/eventpipe/ep.c Outdated
Comment threadsrc/native/eventpipe/ep.c Outdated

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@jkotas

Copy link
Copy Markdown
Member

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me modulo comments inline.

Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
# Conflicts:
#	src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
CopilotAI review requested due to automatic review settings April 27, 2026 17:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/eventpipe/ep.c
Comment threadsrc/coreclr/inc/clrconfigvalues.h
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h
Comment threadsrc/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h
@pavelsavarapavelsavara changed the title Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeCpuSamplingRateAdd configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRateApr 27, 2026
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@pavelsavara
pavelsavara merged commit 4e8ab2d into dotnet:mainApr 29, 2026
158 of 160 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_sample_rate branch April 29, 2026 07:15
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 29, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pavelsavara@jkotas@noahfalk@maraf@lateralusX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate - #127292

Merged
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate
Apr 29, 2026
Merged

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate#127292
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 22, 2026

Copy link
Copy Markdown
Member

Summary

This change introduces a new DOTNET_EventPipeThreadSamplingRate environment variable that allows overriding the default EventPipe CPU sample profiler interval.

The default 1ms is too quick for WASM/browser.

This split from #126324 for smaller code review.

Changes

New config: DOTNET_EventPipeThreadSamplingRate

  • src/coreclr/inc/clrconfigvalues.h — Register the new INTERNAL_EventPipeThreadSamplingRate DWORD config (default 0).
  • src/native/eventpipe/ep-rt.h — Declare ep_rt_config_value_get_sampling_rate() in the shared EventPipe runtime abstraction header.
  • src/native/eventpipe/ep.c — In ep_init(), read the configured rate and convert from milliseconds to nanoseconds. Falls back to the per-platform default when the value is 0.

Per-runtime implementations of ep_rt_config_value_get_sampling_rate

  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h — CoreCLR: reads via CLRConfig::GetConfigValue.
  • src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h — NativeAOT: reads via RhConfig::Environment::TryGetIntegerValue.
  • src/mono/mono/eventpipe/ep-rt-mono.h — Mono: reads via g_getenv("DOTNET_EventPipeThreadSamplingRate").

Blazor/Browser WASM build integration

  • src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
    • Gate _AddWasmDiagnosticPortsEnvironmentVariable target on EnableDiagnostics=true.
    • Parse WasmPerformanceInstrumentation to extract an optional ,interval=<ms> suffix.
    • Pass the filter portion as DOTNET_WasmPerformanceInstrumentation and the interval (if present) as DOTNET_EventPipeThreadSamplingRate.

Miscellaneous fixes

  • src/native/eventpipe/ds-ipc-pal-websocket.h

    • Wrap websocket extern declarations in extern "C" to prevent C++ name mangling (needed for JS interop in browser WASM).
    • Fix ds_rt_websocket_recv signature: remove incorrect const from the receive buffer parameter.
  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h

    • Add PROFILING_SUPPORTED preprocessor guard around ep_rt_notify_profiler_provider_created body.
    • Update #endif comments for clarity.
  • src/native/eventpipe/ep-session.c

    • Add EP_ASSERT(session->buffer_manager != NULL) invariant check in the streaming loop shutdown path.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 22, 2026
@pavelsavarapavelsavara self-assigned this Apr 22, 2026
CopilotAI review requested due to automatic review settings April 22, 2026 17:55
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @dotnet/area-system-diagnostics
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new runtime-configurable knob (DOTNET_EventPipeCpuSamplingRate) to override EventPipe CPU sample-profiler interval (intended to allow slower sampling on WASM/browser), and wires it through CoreCLR/NativeAOT/Mono plus browser WASM build plumbing.

Changes:

  • Introduce EventPipeCpuSamplingRate config/env var and consume it in EventPipe init (ms → ns conversion, 0 = default).
  • Implement ep_rt_config_value_get_sampling_rate() for CoreCLR, NativeAOT, and Mono runtime layers.
  • Update browser WASM SDK targets to pass DOTNET_EventPipeCpuSamplingRate (and related instrumentation env vars) and adjust websocket interop declarations.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/eventpipe/ep.cReads configurable sampling interval and applies it during ep_init().
src/native/eventpipe/ep-session.cAdds an assert in the no-threads streaming loop shutdown path.
src/native/eventpipe/ep-rt.hAdds runtime abstraction API for sampling-rate config retrieval.
src/native/eventpipe/ds-ipc-pal-websocket.hAdjusts websocket externs for C++/interop and fixes recv buffer constness.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsAdds EnableDiagnostics gating and parses WasmPerformanceInstrumentation for optional interval.
src/mono/mono/eventpipe/ep-rt-mono.hMono implementation of sampling-rate config getter via env var.
src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.hCoreCLR implementation of sampling-rate config getter; minor preprocessor cleanup.
src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.hNativeAOT implementation of sampling-rate config getter.
src/coreclr/inc/clrconfigvalues.hRegisters new CoreCLR config knob INTERNAL_EventPipeCpuSamplingRate.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 22, 2026 18:31
…oft.NET.Sdk.WebAssembly.Browser.targets
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
CopilotAI review requested due to automatic review settings April 23, 2026 21:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
CopilotAI review requested due to automatic review settings April 24, 2026 09:19

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/eventpipe/ep.c Outdated
Comment threadsrc/native/eventpipe/ep.c Outdated

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@jkotas

Copy link
Copy Markdown
Member

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me modulo comments inline.

Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
# Conflicts:
#	src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
CopilotAI review requested due to automatic review settings April 27, 2026 17:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/eventpipe/ep.c
Comment threadsrc/coreclr/inc/clrconfigvalues.h
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h
Comment threadsrc/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h
@pavelsavarapavelsavara changed the title Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeCpuSamplingRateAdd configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRateApr 27, 2026
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@pavelsavara
pavelsavara merged commit 4e8ab2d into dotnet:mainApr 29, 2026
158 of 160 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_sample_rate branch April 29, 2026 07:15
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 29, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pavelsavara@jkotas@noahfalk@maraf@lateralusX
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate - #127292

Merged
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate
Apr 29, 2026
Merged

Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRate#127292
pavelsavara merged 12 commits into
dotnet:mainfrom
pavelsavara:browser_EP_sample_rate

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Apr 22, 2026

Copy link
Copy Markdown
Member

Summary

This change introduces a new DOTNET_EventPipeThreadSamplingRate environment variable that allows overriding the default EventPipe CPU sample profiler interval.

The default 1ms is too quick for WASM/browser.

This split from #126324 for smaller code review.

Changes

New config: DOTNET_EventPipeThreadSamplingRate

  • src/coreclr/inc/clrconfigvalues.h — Register the new INTERNAL_EventPipeThreadSamplingRate DWORD config (default 0).
  • src/native/eventpipe/ep-rt.h — Declare ep_rt_config_value_get_sampling_rate() in the shared EventPipe runtime abstraction header.
  • src/native/eventpipe/ep.c — In ep_init(), read the configured rate and convert from milliseconds to nanoseconds. Falls back to the per-platform default when the value is 0.

Per-runtime implementations of ep_rt_config_value_get_sampling_rate

  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h — CoreCLR: reads via CLRConfig::GetConfigValue.
  • src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h — NativeAOT: reads via RhConfig::Environment::TryGetIntegerValue.
  • src/mono/mono/eventpipe/ep-rt-mono.h — Mono: reads via g_getenv("DOTNET_EventPipeThreadSamplingRate").

Blazor/Browser WASM build integration

  • src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
    • Gate _AddWasmDiagnosticPortsEnvironmentVariable target on EnableDiagnostics=true.
    • Parse WasmPerformanceInstrumentation to extract an optional ,interval=<ms> suffix.
    • Pass the filter portion as DOTNET_WasmPerformanceInstrumentation and the interval (if present) as DOTNET_EventPipeThreadSamplingRate.

Miscellaneous fixes

  • src/native/eventpipe/ds-ipc-pal-websocket.h

    • Wrap websocket extern declarations in extern "C" to prevent C++ name mangling (needed for JS interop in browser WASM).
    • Fix ds_rt_websocket_recv signature: remove incorrect const from the receive buffer parameter.
  • src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h

    • Add PROFILING_SUPPORTED preprocessor guard around ep_rt_notify_profiler_provider_created body.
    • Update #endif comments for clarity.
  • src/native/eventpipe/ep-session.c

    • Add EP_ASSERT(session->buffer_manager != NULL) invariant check in the streaming loop shutdown path.

@pavelsavarapavelsavara added this to the 11.0.0 milestone Apr 22, 2026
@pavelsavarapavelsavara self-assigned this Apr 22, 2026
CopilotAI review requested due to automatic review settings April 22, 2026 17:55
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @dotnet/area-system-diagnostics
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds a new runtime-configurable knob (DOTNET_EventPipeCpuSamplingRate) to override EventPipe CPU sample-profiler interval (intended to allow slower sampling on WASM/browser), and wires it through CoreCLR/NativeAOT/Mono plus browser WASM build plumbing.

Changes:

  • Introduce EventPipeCpuSamplingRate config/env var and consume it in EventPipe init (ms → ns conversion, 0 = default).
  • Implement ep_rt_config_value_get_sampling_rate() for CoreCLR, NativeAOT, and Mono runtime layers.
  • Update browser WASM SDK targets to pass DOTNET_EventPipeCpuSamplingRate (and related instrumentation env vars) and adjust websocket interop declarations.

Reviewed changes

Copilot reviewed 9 out of 9 changed files in this pull request and generated 3 comments.

Show a summary per file
FileDescription
src/native/eventpipe/ep.cReads configurable sampling interval and applies it during ep_init().
src/native/eventpipe/ep-session.cAdds an assert in the no-threads streaming loop shutdown path.
src/native/eventpipe/ep-rt.hAdds runtime abstraction API for sampling-rate config retrieval.
src/native/eventpipe/ds-ipc-pal-websocket.hAdjusts websocket externs for C++/interop and fixes recv buffer constness.
src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targetsAdds EnableDiagnostics gating and parses WasmPerformanceInstrumentation for optional interval.
src/mono/mono/eventpipe/ep-rt-mono.hMono implementation of sampling-rate config getter via env var.
src/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.hCoreCLR implementation of sampling-rate config getter; minor preprocessor cleanup.
src/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.hNativeAOT implementation of sampling-rate config getter.
src/coreclr/inc/clrconfigvalues.hRegisters new CoreCLR config knob INTERNAL_EventPipeCpuSamplingRate.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
CopilotAI review requested due to automatic review settings April 22, 2026 18:31
…oft.NET.Sdk.WebAssembly.Browser.targets
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 9 out of 9 changed files in this pull request and generated 2 comments.

Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
CopilotAI review requested due to automatic review settings April 23, 2026 21:59

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot encountered an error and was unable to review this pull request. You can try again by re-requesting a review.

Comment threadsrc/native/eventpipe/ep-session.c Outdated
CopilotAI review requested due to automatic review settings April 24, 2026 09:19

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 2 comments.

Comment threadsrc/native/eventpipe/ep.c Outdated
Comment threadsrc/native/eventpipe/ep.c Outdated

@lateralusXlateralusX left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM!

@jkotas

Copy link
Copy Markdown
Member

@noahfalknoahfalk left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good to me modulo comments inline.

Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
Comment threadsrc/coreclr/inc/clrconfigvalues.h Outdated
# Conflicts:
#	src/mono/nuget/Microsoft.NET.Sdk.WebAssembly.Pack/build/Microsoft.NET.Sdk.WebAssembly.Browser.targets
CopilotAI review requested due to automatic review settings April 27, 2026 17:44

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 10 out of 10 changed files in this pull request and generated 6 comments.

Comment threadsrc/native/eventpipe/ep.c
Comment threadsrc/coreclr/inc/clrconfigvalues.h
Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h
Comment threadsrc/coreclr/vm/eventing/eventpipe/ep-rt-coreclr.h
@pavelsavarapavelsavara changed the title Add configurable EventPipe CPU sampling rate via DOTNET_EventPipeCpuSamplingRateAdd configurable EventPipe CPU sampling rate via DOTNET_EventPipeThreadSamplingRateApr 27, 2026
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@pavelsavara
pavelsavara merged commit 4e8ab2d into dotnet:mainApr 29, 2026
158 of 160 checks passed
@pavelsavara
pavelsavara deleted the browser_EP_sample_rate branch April 29, 2026 07:15
@github-actionsgithub-actionsBot locked and limited conversation to collaborators May 29, 2026
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants

@pavelsavara@jkotas@noahfalk@maraf@lateralusX