[browser] single threaded diagnostic server - #111910

Merged
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1
Feb 20, 2025
Merged

[browser] single threaded diagnostic server#111910
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Jan 28, 2025

Copy link
Copy Markdown
Member

This is split from #110818 to make code review easier

Enabled by <WasmPerfTracing>true</WasmPerfTracing> and also <MetricsSupport> and <EventSourceSupport> as necessary.

Single thread

  • ep_rt_thread_create and ep_rt_thread_mono_start_func
    • it will run short, non-blocking jobs on the browser event loop instead of on dedicated threads
    • streaming_loop_tick refactored from streaming_thread
    • server_loop_tick from refactored server_thread
  • mono_wasm_ds_exec to process on tick on event loop
  • mono_schedule_ds_job will register callback into queue for above
  • NOOP implementation of ep_rt_wait_event_wait
  • new FEATURE_PERFTRACING_DISABLE_THREADS -> PERFTRACING_DISABLE_THREADS
  • ds_ipc_stream_factory_get_next_available_stream only polls once and never blocks

Sampling

  • disabled sampling_thread because we can't do "stop-the-world and scan other threads"
  • new events ep_rt_sample_profiler_enabled and ep_rt_sample_profiler_disabled
  • new ep_rt_mono_sampling_provider_component_init
    • install mono profiler instrumentation MONO_PROFILER_CALL_INSTRUMENTATION_ENTER
    • this needs to happen before any managed code is executed
  • it has negative performance impact when workload & re-linked with FeaturePerfTracing
    • this is just single condition per method enter (and later per safe-point)
    • we could introduce separate FeaturePerfTracingSampling to enable/disable this if necessary

Web socket

  • FEATURE_PERFTRACING_PAL_WS
  • ds-ipc-pal-websocket.c and ds-ipc-pal-websocket.h they just forward to JavaScript
  • empty for now ds_rt_websocket_create, ds_rt_websocket_send, ds_rt_websocket_poll, ds_rt_websocket_recv, ds_rt_websocket_close

Other

  • include diagnostics_tracing-static.a in in-tree builds
  • Microsoft.NETCore.App.Runtime.Mono.perftrace.**RID** cleanup
  • fix SystemNative_GetCpuUtilization
  • fix crash dump file permissions for CI/helix

Next PRs

  • the rest of the implementation in JavaScript, for WebSocket and JS client
  • better sampling instrumentation via MINT_SDB_SEQ_POINT or similar
  • tests

Out of scope

  • pause runtime during startup
  • multi-threaded EP on browser - this will need some cross thread marshaling

contributes to #76316

@pavelsavarapavelsavara added arch-wasm WebAssembly architecture os-browser Browser variant of arch-wasm labels Jan 28, 2025
@pavelsavarapavelsavara added this to the 10.0.0 milestone Jan 28, 2025
@pavelsavarapavelsavara self-assigned this Jan 28, 2025
@ghostghost added the area-Build-mono label Jan 28, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing
See info in area-owners.md if you want to be subscribed.

@pavelsavarapavelsavara changed the title [browser] single threaded diagnosti server[browser] single threaded diagnostic serverJan 28, 2025
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@lateralusX please review this first step

Comment threadsrc/mono/System.Private.CoreLib/System.Private.CoreLib.csproj Outdated
Comment threadsrc/mono/browser/build/BrowserWasmApp.targets Outdated
# Conflicts:
#	src/native/eventpipe/CMakeLists.txt

@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.

Second pass on the EP code, mainly code structural comments as well as one idea around ep_rt_thread_create.

Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
Comment threadsrc/native/eventpipe/configure.cmake Outdated
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c

@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.

Native Mono and EventPipe changes LGTM! Thanks!

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

To be merged after preview snap

@pavelsavarapavelsavara added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 14, 2025
@pavelsavarapavelsavara removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 20, 2025
@pavelsavara
pavelsavara merged commit 3f71cde into dotnet:mainFeb 20, 2025
@pavelsavara
pavelsavara deleted the browser_st_ep_step1 branch February 20, 2025 10:07
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 20, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-monoos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@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

[browser] single threaded diagnostic server - #111910

Merged
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1
Feb 20, 2025
Merged

[browser] single threaded diagnostic server#111910
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Jan 28, 2025

Copy link
Copy Markdown
Member

This is split from #110818 to make code review easier

Enabled by <WasmPerfTracing>true</WasmPerfTracing> and also <MetricsSupport> and <EventSourceSupport> as necessary.

Single thread

  • ep_rt_thread_create and ep_rt_thread_mono_start_func
    • it will run short, non-blocking jobs on the browser event loop instead of on dedicated threads
    • streaming_loop_tick refactored from streaming_thread
    • server_loop_tick from refactored server_thread
  • mono_wasm_ds_exec to process on tick on event loop
  • mono_schedule_ds_job will register callback into queue for above
  • NOOP implementation of ep_rt_wait_event_wait
  • new FEATURE_PERFTRACING_DISABLE_THREADS -> PERFTRACING_DISABLE_THREADS
  • ds_ipc_stream_factory_get_next_available_stream only polls once and never blocks

Sampling

  • disabled sampling_thread because we can't do "stop-the-world and scan other threads"
  • new events ep_rt_sample_profiler_enabled and ep_rt_sample_profiler_disabled
  • new ep_rt_mono_sampling_provider_component_init
    • install mono profiler instrumentation MONO_PROFILER_CALL_INSTRUMENTATION_ENTER
    • this needs to happen before any managed code is executed
  • it has negative performance impact when workload & re-linked with FeaturePerfTracing
    • this is just single condition per method enter (and later per safe-point)
    • we could introduce separate FeaturePerfTracingSampling to enable/disable this if necessary

Web socket

  • FEATURE_PERFTRACING_PAL_WS
  • ds-ipc-pal-websocket.c and ds-ipc-pal-websocket.h they just forward to JavaScript
  • empty for now ds_rt_websocket_create, ds_rt_websocket_send, ds_rt_websocket_poll, ds_rt_websocket_recv, ds_rt_websocket_close

Other

  • include diagnostics_tracing-static.a in in-tree builds
  • Microsoft.NETCore.App.Runtime.Mono.perftrace.**RID** cleanup
  • fix SystemNative_GetCpuUtilization
  • fix crash dump file permissions for CI/helix

Next PRs

  • the rest of the implementation in JavaScript, for WebSocket and JS client
  • better sampling instrumentation via MINT_SDB_SEQ_POINT or similar
  • tests

Out of scope

  • pause runtime during startup
  • multi-threaded EP on browser - this will need some cross thread marshaling

contributes to #76316

@pavelsavarapavelsavara added arch-wasm WebAssembly architecture os-browser Browser variant of arch-wasm labels Jan 28, 2025
@pavelsavarapavelsavara added this to the 10.0.0 milestone Jan 28, 2025
@pavelsavarapavelsavara self-assigned this Jan 28, 2025
@ghostghost added the area-Build-mono label Jan 28, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing
See info in area-owners.md if you want to be subscribed.

@pavelsavarapavelsavara changed the title [browser] single threaded diagnosti server[browser] single threaded diagnostic serverJan 28, 2025
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@lateralusX please review this first step

Comment threadsrc/mono/System.Private.CoreLib/System.Private.CoreLib.csproj Outdated
Comment threadsrc/mono/browser/build/BrowserWasmApp.targets Outdated
# Conflicts:
#	src/native/eventpipe/CMakeLists.txt

@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.

Second pass on the EP code, mainly code structural comments as well as one idea around ep_rt_thread_create.

Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
Comment threadsrc/native/eventpipe/configure.cmake Outdated
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c

@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.

Native Mono and EventPipe changes LGTM! Thanks!

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

To be merged after preview snap

@pavelsavarapavelsavara added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 14, 2025
@pavelsavarapavelsavara removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 20, 2025
@pavelsavara
pavelsavara merged commit 3f71cde into dotnet:mainFeb 20, 2025
@pavelsavara
pavelsavara deleted the browser_st_ep_step1 branch February 20, 2025 10:07
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 20, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-monoos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@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

[browser] single threaded diagnostic server - #111910

Merged
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1
Feb 20, 2025
Merged

[browser] single threaded diagnostic server#111910
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Jan 28, 2025

Copy link
Copy Markdown
Member

This is split from #110818 to make code review easier

Enabled by <WasmPerfTracing>true</WasmPerfTracing> and also <MetricsSupport> and <EventSourceSupport> as necessary.

Single thread

  • ep_rt_thread_create and ep_rt_thread_mono_start_func
    • it will run short, non-blocking jobs on the browser event loop instead of on dedicated threads
    • streaming_loop_tick refactored from streaming_thread
    • server_loop_tick from refactored server_thread
  • mono_wasm_ds_exec to process on tick on event loop
  • mono_schedule_ds_job will register callback into queue for above
  • NOOP implementation of ep_rt_wait_event_wait
  • new FEATURE_PERFTRACING_DISABLE_THREADS -> PERFTRACING_DISABLE_THREADS
  • ds_ipc_stream_factory_get_next_available_stream only polls once and never blocks

Sampling

  • disabled sampling_thread because we can't do "stop-the-world and scan other threads"
  • new events ep_rt_sample_profiler_enabled and ep_rt_sample_profiler_disabled
  • new ep_rt_mono_sampling_provider_component_init
    • install mono profiler instrumentation MONO_PROFILER_CALL_INSTRUMENTATION_ENTER
    • this needs to happen before any managed code is executed
  • it has negative performance impact when workload & re-linked with FeaturePerfTracing
    • this is just single condition per method enter (and later per safe-point)
    • we could introduce separate FeaturePerfTracingSampling to enable/disable this if necessary

Web socket

  • FEATURE_PERFTRACING_PAL_WS
  • ds-ipc-pal-websocket.c and ds-ipc-pal-websocket.h they just forward to JavaScript
  • empty for now ds_rt_websocket_create, ds_rt_websocket_send, ds_rt_websocket_poll, ds_rt_websocket_recv, ds_rt_websocket_close

Other

  • include diagnostics_tracing-static.a in in-tree builds
  • Microsoft.NETCore.App.Runtime.Mono.perftrace.**RID** cleanup
  • fix SystemNative_GetCpuUtilization
  • fix crash dump file permissions for CI/helix

Next PRs

  • the rest of the implementation in JavaScript, for WebSocket and JS client
  • better sampling instrumentation via MINT_SDB_SEQ_POINT or similar
  • tests

Out of scope

  • pause runtime during startup
  • multi-threaded EP on browser - this will need some cross thread marshaling

contributes to #76316

@pavelsavarapavelsavara added arch-wasm WebAssembly architecture os-browser Browser variant of arch-wasm labels Jan 28, 2025
@pavelsavarapavelsavara added this to the 10.0.0 milestone Jan 28, 2025
@pavelsavarapavelsavara self-assigned this Jan 28, 2025
@ghostghost added the area-Build-mono label Jan 28, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing
See info in area-owners.md if you want to be subscribed.

@pavelsavarapavelsavara changed the title [browser] single threaded diagnosti server[browser] single threaded diagnostic serverJan 28, 2025
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@lateralusX please review this first step

Comment threadsrc/mono/System.Private.CoreLib/System.Private.CoreLib.csproj Outdated
Comment threadsrc/mono/browser/build/BrowserWasmApp.targets Outdated
# Conflicts:
#	src/native/eventpipe/CMakeLists.txt

@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.

Second pass on the EP code, mainly code structural comments as well as one idea around ep_rt_thread_create.

Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
Comment threadsrc/native/eventpipe/configure.cmake Outdated
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c

@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.

Native Mono and EventPipe changes LGTM! Thanks!

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

To be merged after preview snap

@pavelsavarapavelsavara added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 14, 2025
@pavelsavarapavelsavara removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 20, 2025
@pavelsavara
pavelsavara merged commit 3f71cde into dotnet:mainFeb 20, 2025
@pavelsavara
pavelsavara deleted the browser_st_ep_step1 branch February 20, 2025 10:07
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 20, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-monoos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@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

[browser] single threaded diagnostic server - #111910

Merged
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1
Feb 20, 2025
Merged

[browser] single threaded diagnostic server#111910
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Jan 28, 2025

Copy link
Copy Markdown
Member

This is split from #110818 to make code review easier

Enabled by <WasmPerfTracing>true</WasmPerfTracing> and also <MetricsSupport> and <EventSourceSupport> as necessary.

Single thread

  • ep_rt_thread_create and ep_rt_thread_mono_start_func
    • it will run short, non-blocking jobs on the browser event loop instead of on dedicated threads
    • streaming_loop_tick refactored from streaming_thread
    • server_loop_tick from refactored server_thread
  • mono_wasm_ds_exec to process on tick on event loop
  • mono_schedule_ds_job will register callback into queue for above
  • NOOP implementation of ep_rt_wait_event_wait
  • new FEATURE_PERFTRACING_DISABLE_THREADS -> PERFTRACING_DISABLE_THREADS
  • ds_ipc_stream_factory_get_next_available_stream only polls once and never blocks

Sampling

  • disabled sampling_thread because we can't do "stop-the-world and scan other threads"
  • new events ep_rt_sample_profiler_enabled and ep_rt_sample_profiler_disabled
  • new ep_rt_mono_sampling_provider_component_init
    • install mono profiler instrumentation MONO_PROFILER_CALL_INSTRUMENTATION_ENTER
    • this needs to happen before any managed code is executed
  • it has negative performance impact when workload & re-linked with FeaturePerfTracing
    • this is just single condition per method enter (and later per safe-point)
    • we could introduce separate FeaturePerfTracingSampling to enable/disable this if necessary

Web socket

  • FEATURE_PERFTRACING_PAL_WS
  • ds-ipc-pal-websocket.c and ds-ipc-pal-websocket.h they just forward to JavaScript
  • empty for now ds_rt_websocket_create, ds_rt_websocket_send, ds_rt_websocket_poll, ds_rt_websocket_recv, ds_rt_websocket_close

Other

  • include diagnostics_tracing-static.a in in-tree builds
  • Microsoft.NETCore.App.Runtime.Mono.perftrace.**RID** cleanup
  • fix SystemNative_GetCpuUtilization
  • fix crash dump file permissions for CI/helix

Next PRs

  • the rest of the implementation in JavaScript, for WebSocket and JS client
  • better sampling instrumentation via MINT_SDB_SEQ_POINT or similar
  • tests

Out of scope

  • pause runtime during startup
  • multi-threaded EP on browser - this will need some cross thread marshaling

contributes to #76316

@pavelsavarapavelsavara added arch-wasm WebAssembly architecture os-browser Browser variant of arch-wasm labels Jan 28, 2025
@pavelsavarapavelsavara added this to the 10.0.0 milestone Jan 28, 2025
@pavelsavarapavelsavara self-assigned this Jan 28, 2025
@ghostghost added the area-Build-mono label Jan 28, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing
See info in area-owners.md if you want to be subscribed.

@pavelsavarapavelsavara changed the title [browser] single threaded diagnosti server[browser] single threaded diagnostic serverJan 28, 2025
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@lateralusX please review this first step

Comment threadsrc/mono/System.Private.CoreLib/System.Private.CoreLib.csproj Outdated
Comment threadsrc/mono/browser/build/BrowserWasmApp.targets Outdated
# Conflicts:
#	src/native/eventpipe/CMakeLists.txt

@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.

Second pass on the EP code, mainly code structural comments as well as one idea around ep_rt_thread_create.

Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
Comment threadsrc/native/eventpipe/configure.cmake Outdated
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c

@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.

Native Mono and EventPipe changes LGTM! Thanks!

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

To be merged after preview snap

@pavelsavarapavelsavara added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 14, 2025
@pavelsavarapavelsavara removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 20, 2025
@pavelsavara
pavelsavara merged commit 3f71cde into dotnet:mainFeb 20, 2025
@pavelsavara
pavelsavara deleted the browser_st_ep_step1 branch February 20, 2025 10:07
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 20, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-monoos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@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

[browser] single threaded diagnostic server - #111910

Merged
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1
Feb 20, 2025
Merged

[browser] single threaded diagnostic server#111910
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Jan 28, 2025

Copy link
Copy Markdown
Member

This is split from #110818 to make code review easier

Enabled by <WasmPerfTracing>true</WasmPerfTracing> and also <MetricsSupport> and <EventSourceSupport> as necessary.

Single thread

  • ep_rt_thread_create and ep_rt_thread_mono_start_func
    • it will run short, non-blocking jobs on the browser event loop instead of on dedicated threads
    • streaming_loop_tick refactored from streaming_thread
    • server_loop_tick from refactored server_thread
  • mono_wasm_ds_exec to process on tick on event loop
  • mono_schedule_ds_job will register callback into queue for above
  • NOOP implementation of ep_rt_wait_event_wait
  • new FEATURE_PERFTRACING_DISABLE_THREADS -> PERFTRACING_DISABLE_THREADS
  • ds_ipc_stream_factory_get_next_available_stream only polls once and never blocks

Sampling

  • disabled sampling_thread because we can't do "stop-the-world and scan other threads"
  • new events ep_rt_sample_profiler_enabled and ep_rt_sample_profiler_disabled
  • new ep_rt_mono_sampling_provider_component_init
    • install mono profiler instrumentation MONO_PROFILER_CALL_INSTRUMENTATION_ENTER
    • this needs to happen before any managed code is executed
  • it has negative performance impact when workload & re-linked with FeaturePerfTracing
    • this is just single condition per method enter (and later per safe-point)
    • we could introduce separate FeaturePerfTracingSampling to enable/disable this if necessary

Web socket

  • FEATURE_PERFTRACING_PAL_WS
  • ds-ipc-pal-websocket.c and ds-ipc-pal-websocket.h they just forward to JavaScript
  • empty for now ds_rt_websocket_create, ds_rt_websocket_send, ds_rt_websocket_poll, ds_rt_websocket_recv, ds_rt_websocket_close

Other

  • include diagnostics_tracing-static.a in in-tree builds
  • Microsoft.NETCore.App.Runtime.Mono.perftrace.**RID** cleanup
  • fix SystemNative_GetCpuUtilization
  • fix crash dump file permissions for CI/helix

Next PRs

  • the rest of the implementation in JavaScript, for WebSocket and JS client
  • better sampling instrumentation via MINT_SDB_SEQ_POINT or similar
  • tests

Out of scope

  • pause runtime during startup
  • multi-threaded EP on browser - this will need some cross thread marshaling

contributes to #76316

@pavelsavarapavelsavara added arch-wasm WebAssembly architecture os-browser Browser variant of arch-wasm labels Jan 28, 2025
@pavelsavarapavelsavara added this to the 10.0.0 milestone Jan 28, 2025
@pavelsavarapavelsavara self-assigned this Jan 28, 2025
@ghostghost added the area-Build-mono label Jan 28, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing
See info in area-owners.md if you want to be subscribed.

@pavelsavarapavelsavara changed the title [browser] single threaded diagnosti server[browser] single threaded diagnostic serverJan 28, 2025
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@lateralusX please review this first step

Comment threadsrc/mono/System.Private.CoreLib/System.Private.CoreLib.csproj Outdated
Comment threadsrc/mono/browser/build/BrowserWasmApp.targets Outdated
# Conflicts:
#	src/native/eventpipe/CMakeLists.txt

@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.

Second pass on the EP code, mainly code structural comments as well as one idea around ep_rt_thread_create.

Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
Comment threadsrc/native/eventpipe/configure.cmake Outdated
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c

@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.

Native Mono and EventPipe changes LGTM! Thanks!

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

To be merged after preview snap

@pavelsavarapavelsavara added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 14, 2025
@pavelsavarapavelsavara removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 20, 2025
@pavelsavara
pavelsavara merged commit 3f71cde into dotnet:mainFeb 20, 2025
@pavelsavara
pavelsavara deleted the browser_st_ep_step1 branch February 20, 2025 10:07
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 20, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-monoos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@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

[browser] single threaded diagnostic server - #111910

Merged
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1
Feb 20, 2025
Merged

[browser] single threaded diagnostic server#111910
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Jan 28, 2025

Copy link
Copy Markdown
Member

This is split from #110818 to make code review easier

Enabled by <WasmPerfTracing>true</WasmPerfTracing> and also <MetricsSupport> and <EventSourceSupport> as necessary.

Single thread

  • ep_rt_thread_create and ep_rt_thread_mono_start_func
    • it will run short, non-blocking jobs on the browser event loop instead of on dedicated threads
    • streaming_loop_tick refactored from streaming_thread
    • server_loop_tick from refactored server_thread
  • mono_wasm_ds_exec to process on tick on event loop
  • mono_schedule_ds_job will register callback into queue for above
  • NOOP implementation of ep_rt_wait_event_wait
  • new FEATURE_PERFTRACING_DISABLE_THREADS -> PERFTRACING_DISABLE_THREADS
  • ds_ipc_stream_factory_get_next_available_stream only polls once and never blocks

Sampling

  • disabled sampling_thread because we can't do "stop-the-world and scan other threads"
  • new events ep_rt_sample_profiler_enabled and ep_rt_sample_profiler_disabled
  • new ep_rt_mono_sampling_provider_component_init
    • install mono profiler instrumentation MONO_PROFILER_CALL_INSTRUMENTATION_ENTER
    • this needs to happen before any managed code is executed
  • it has negative performance impact when workload & re-linked with FeaturePerfTracing
    • this is just single condition per method enter (and later per safe-point)
    • we could introduce separate FeaturePerfTracingSampling to enable/disable this if necessary

Web socket

  • FEATURE_PERFTRACING_PAL_WS
  • ds-ipc-pal-websocket.c and ds-ipc-pal-websocket.h they just forward to JavaScript
  • empty for now ds_rt_websocket_create, ds_rt_websocket_send, ds_rt_websocket_poll, ds_rt_websocket_recv, ds_rt_websocket_close

Other

  • include diagnostics_tracing-static.a in in-tree builds
  • Microsoft.NETCore.App.Runtime.Mono.perftrace.**RID** cleanup
  • fix SystemNative_GetCpuUtilization
  • fix crash dump file permissions for CI/helix

Next PRs

  • the rest of the implementation in JavaScript, for WebSocket and JS client
  • better sampling instrumentation via MINT_SDB_SEQ_POINT or similar
  • tests

Out of scope

  • pause runtime during startup
  • multi-threaded EP on browser - this will need some cross thread marshaling

contributes to #76316

@pavelsavarapavelsavara added arch-wasm WebAssembly architecture os-browser Browser variant of arch-wasm labels Jan 28, 2025
@pavelsavarapavelsavara added this to the 10.0.0 milestone Jan 28, 2025
@pavelsavarapavelsavara self-assigned this Jan 28, 2025
@ghostghost added the area-Build-mono label Jan 28, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing
See info in area-owners.md if you want to be subscribed.

@pavelsavarapavelsavara changed the title [browser] single threaded diagnosti server[browser] single threaded diagnostic serverJan 28, 2025
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@lateralusX please review this first step

Comment threadsrc/mono/System.Private.CoreLib/System.Private.CoreLib.csproj Outdated
Comment threadsrc/mono/browser/build/BrowserWasmApp.targets Outdated
# Conflicts:
#	src/native/eventpipe/CMakeLists.txt

@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.

Second pass on the EP code, mainly code structural comments as well as one idea around ep_rt_thread_create.

Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
Comment threadsrc/native/eventpipe/configure.cmake Outdated
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c

@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.

Native Mono and EventPipe changes LGTM! Thanks!

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

To be merged after preview snap

@pavelsavarapavelsavara added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 14, 2025
@pavelsavarapavelsavara removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 20, 2025
@pavelsavara
pavelsavara merged commit 3f71cde into dotnet:mainFeb 20, 2025
@pavelsavara
pavelsavara deleted the browser_st_ep_step1 branch February 20, 2025 10:07
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 20, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-monoos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@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

[browser] single threaded diagnostic server - #111910

Merged
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1
Feb 20, 2025
Merged

[browser] single threaded diagnostic server#111910
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Jan 28, 2025

Copy link
Copy Markdown
Member

This is split from #110818 to make code review easier

Enabled by <WasmPerfTracing>true</WasmPerfTracing> and also <MetricsSupport> and <EventSourceSupport> as necessary.

Single thread

  • ep_rt_thread_create and ep_rt_thread_mono_start_func
    • it will run short, non-blocking jobs on the browser event loop instead of on dedicated threads
    • streaming_loop_tick refactored from streaming_thread
    • server_loop_tick from refactored server_thread
  • mono_wasm_ds_exec to process on tick on event loop
  • mono_schedule_ds_job will register callback into queue for above
  • NOOP implementation of ep_rt_wait_event_wait
  • new FEATURE_PERFTRACING_DISABLE_THREADS -> PERFTRACING_DISABLE_THREADS
  • ds_ipc_stream_factory_get_next_available_stream only polls once and never blocks

Sampling

  • disabled sampling_thread because we can't do "stop-the-world and scan other threads"
  • new events ep_rt_sample_profiler_enabled and ep_rt_sample_profiler_disabled
  • new ep_rt_mono_sampling_provider_component_init
    • install mono profiler instrumentation MONO_PROFILER_CALL_INSTRUMENTATION_ENTER
    • this needs to happen before any managed code is executed
  • it has negative performance impact when workload & re-linked with FeaturePerfTracing
    • this is just single condition per method enter (and later per safe-point)
    • we could introduce separate FeaturePerfTracingSampling to enable/disable this if necessary

Web socket

  • FEATURE_PERFTRACING_PAL_WS
  • ds-ipc-pal-websocket.c and ds-ipc-pal-websocket.h they just forward to JavaScript
  • empty for now ds_rt_websocket_create, ds_rt_websocket_send, ds_rt_websocket_poll, ds_rt_websocket_recv, ds_rt_websocket_close

Other

  • include diagnostics_tracing-static.a in in-tree builds
  • Microsoft.NETCore.App.Runtime.Mono.perftrace.**RID** cleanup
  • fix SystemNative_GetCpuUtilization
  • fix crash dump file permissions for CI/helix

Next PRs

  • the rest of the implementation in JavaScript, for WebSocket and JS client
  • better sampling instrumentation via MINT_SDB_SEQ_POINT or similar
  • tests

Out of scope

  • pause runtime during startup
  • multi-threaded EP on browser - this will need some cross thread marshaling

contributes to #76316

@pavelsavarapavelsavara added arch-wasm WebAssembly architecture os-browser Browser variant of arch-wasm labels Jan 28, 2025
@pavelsavarapavelsavara added this to the 10.0.0 milestone Jan 28, 2025
@pavelsavarapavelsavara self-assigned this Jan 28, 2025
@ghostghost added the area-Build-mono label Jan 28, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing
See info in area-owners.md if you want to be subscribed.

@pavelsavarapavelsavara changed the title [browser] single threaded diagnosti server[browser] single threaded diagnostic serverJan 28, 2025
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@lateralusX please review this first step

Comment threadsrc/mono/System.Private.CoreLib/System.Private.CoreLib.csproj Outdated
Comment threadsrc/mono/browser/build/BrowserWasmApp.targets Outdated
# Conflicts:
#	src/native/eventpipe/CMakeLists.txt

@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.

Second pass on the EP code, mainly code structural comments as well as one idea around ep_rt_thread_create.

Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
Comment threadsrc/native/eventpipe/configure.cmake Outdated
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c

@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.

Native Mono and EventPipe changes LGTM! Thanks!

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

To be merged after preview snap

@pavelsavarapavelsavara added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 14, 2025
@pavelsavarapavelsavara removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 20, 2025
@pavelsavara
pavelsavara merged commit 3f71cde into dotnet:mainFeb 20, 2025
@pavelsavara
pavelsavara deleted the browser_st_ep_step1 branch February 20, 2025 10:07
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 20, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-monoos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@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

[browser] single threaded diagnostic server - #111910

Merged
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1
Feb 20, 2025
Merged

[browser] single threaded diagnostic server#111910
pavelsavara merged 22 commits into
dotnet:mainfrom
pavelsavara:browser_st_ep_step1

Conversation

@pavelsavara

@pavelsavarapavelsavara commented Jan 28, 2025

Copy link
Copy Markdown
Member

This is split from #110818 to make code review easier

Enabled by <WasmPerfTracing>true</WasmPerfTracing> and also <MetricsSupport> and <EventSourceSupport> as necessary.

Single thread

  • ep_rt_thread_create and ep_rt_thread_mono_start_func
    • it will run short, non-blocking jobs on the browser event loop instead of on dedicated threads
    • streaming_loop_tick refactored from streaming_thread
    • server_loop_tick from refactored server_thread
  • mono_wasm_ds_exec to process on tick on event loop
  • mono_schedule_ds_job will register callback into queue for above
  • NOOP implementation of ep_rt_wait_event_wait
  • new FEATURE_PERFTRACING_DISABLE_THREADS -> PERFTRACING_DISABLE_THREADS
  • ds_ipc_stream_factory_get_next_available_stream only polls once and never blocks

Sampling

  • disabled sampling_thread because we can't do "stop-the-world and scan other threads"
  • new events ep_rt_sample_profiler_enabled and ep_rt_sample_profiler_disabled
  • new ep_rt_mono_sampling_provider_component_init
    • install mono profiler instrumentation MONO_PROFILER_CALL_INSTRUMENTATION_ENTER
    • this needs to happen before any managed code is executed
  • it has negative performance impact when workload & re-linked with FeaturePerfTracing
    • this is just single condition per method enter (and later per safe-point)
    • we could introduce separate FeaturePerfTracingSampling to enable/disable this if necessary

Web socket

  • FEATURE_PERFTRACING_PAL_WS
  • ds-ipc-pal-websocket.c and ds-ipc-pal-websocket.h they just forward to JavaScript
  • empty for now ds_rt_websocket_create, ds_rt_websocket_send, ds_rt_websocket_poll, ds_rt_websocket_recv, ds_rt_websocket_close

Other

  • include diagnostics_tracing-static.a in in-tree builds
  • Microsoft.NETCore.App.Runtime.Mono.perftrace.**RID** cleanup
  • fix SystemNative_GetCpuUtilization
  • fix crash dump file permissions for CI/helix

Next PRs

  • the rest of the implementation in JavaScript, for WebSocket and JS client
  • better sampling instrumentation via MINT_SDB_SEQ_POINT or similar
  • tests

Out of scope

  • pause runtime during startup
  • multi-threaded EP on browser - this will need some cross thread marshaling

contributes to #76316

@pavelsavarapavelsavara added arch-wasm WebAssembly architecture os-browser Browser variant of arch-wasm labels Jan 28, 2025
@pavelsavarapavelsavara added this to the 10.0.0 milestone Jan 28, 2025
@pavelsavarapavelsavara self-assigned this Jan 28, 2025
@ghostghost added the area-Build-mono label Jan 28, 2025
@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to 'arch-wasm': @lewing
See info in area-owners.md if you want to be subscribed.

@pavelsavarapavelsavara changed the title [browser] single threaded diagnosti server[browser] single threaded diagnostic serverJan 28, 2025
@pavelsavara

Copy link
Copy Markdown
MemberAuthor

@lateralusX please review this first step

Comment threadsrc/mono/System.Private.CoreLib/System.Private.CoreLib.csproj Outdated
Comment threadsrc/mono/browser/build/BrowserWasmApp.targets Outdated
# Conflicts:
#	src/native/eventpipe/CMakeLists.txt

@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.

Second pass on the EP code, mainly code structural comments as well as one idea around ep_rt_thread_create.

Comment threadsrc/coreclr/nativeaot/Runtime/eventpipe/ep-rt-aot.h Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c Outdated
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono.h Outdated
Comment threadsrc/native/eventpipe/configure.cmake Outdated
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/native/eventpipe/ds-server.c
Comment threadsrc/mono/mono/eventpipe/ep-rt-mono-runtime-provider.c

@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.

Native Mono and EventPipe changes LGTM! Thanks!

@pavelsavara

Copy link
Copy Markdown
MemberAuthor

To be merged after preview snap

@pavelsavarapavelsavara added the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 14, 2025
@pavelsavarapavelsavara removed the NO-MERGE The PR is not ready for merge yet (see discussion for detailed reasons) label Feb 20, 2025
@pavelsavara
pavelsavara merged commit 3f71cde into dotnet:mainFeb 20, 2025
@pavelsavara
pavelsavara deleted the browser_st_ep_step1 branch February 20, 2025 10:07
@github-actionsgithub-actionsBot locked and limited conversation to collaborators Apr 20, 2025
Sign up for freeto subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

arch-wasmWebAssembly architecturearea-Diagnostics-monoos-browserBrowser variant of arch-wasm

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@pavelsavara@maraf@lateralusX