Skip to content

perf: threaded sensor sampling, GPU probe backoff, cooperative shutdown - #17

Merged
ZFordDev merged 1 commit into
mainfrom
perf/sensor-sampling
Aug 22, 2026
Merged

perf: threaded sensor sampling, GPU probe backoff, cooperative shutdown#17
ZFordDev merged 1 commit into
mainfrom
perf/sensor-sampling

Conversation

@ZFordDev

Copy link
Copy Markdown
Owner

Summary

Fixes the two Windows symptoms from testing: sluggish HUD dragging and fans ramping on launch. Both shared one root cause.

Root cause (measured): every sample ran Win32_PerfFormattedData_GPUPerformanceCounters_GPUEngine synchronously on the GUI thread when nvidia-smi is absent — 3.7–7.0 s per query, 358 COM instances, at a 1000 ms default interval. One core sat pegged (fans) while mouse/paint events queued behind WMI calls (drag lag).

Fixes

  • Off-thread sampling: new SensorWorker (QThread, low priority) owns the reader, samples at the configured interval, and pushes results to the HUD over a queued signal — painting/dragging never wait on probes
  • Server-side WQL filter: GPU counters now select only engtype_3D rows
  • Adaptive backoff: probes slower than 200 ms trigger a 30 s cache window instead of re-querying each tick — fast machines keep full-rate sampling, slow providers self-throttle
  • Cheap-path hygiene: nvidia-smi PATH lookup cached once; WMI connections created lazily and reused; empty counter sets report Unavailable instead of 0%
  • Cooperative cancellation: shutdown passes the stop event into sampling so an in-flight slow probe no longer blocks exit (found via test failure: wait(5000) used to time out behind a live enumeration)

Measured impact (Windows 11, no NVIDIA, i+dGPU)

Metric Before After
GUI thread blocked per sample ~5–7 s 0
Sensor duty cycle (steady) ~100% of a core 3.5%
Cancelled-sample latency n/a 17 ms

First cold sample remains slow (~6 s provider warmup) but runs off-thread once.

Docs

DocsHub maintenance page updated in lockstep (threaded sampling + backoff wording).

Testing

  • ruff format --check . / ruff check . pass
  • pytest -q offscreen: 18 passed (5 new tests: backoff, server-side filter + empty-set semantics, one-time PATH resolution, cooperative cancellation, worker stop)

- SensorWorker QThread samples at the configured interval and emits results
  via a queued signal; painting and dragging are never blocked by probes
- Windows GPU counters filter engtype_3D server-side and back off 30 s after
  a slow probe, serving cached values meanwhile (was ~5 s per tick here)
- nvidia-smi PATH lookup cached once; WMI connections created lazily and reused
- empty GPU counter sets now report Unavailable instead of 0%
- cooperative cancellation lets shutdown skip remaining heavy probes
@ZFordDev
ZFordDev merged commit 712c73f into main Aug 22, 2026
3 checks passed
@ZFordDev
ZFordDev deleted the perf/sensor-sampling branch August 22, 2026 03:17
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant