Conversation
…n metrics Extends the /proc host sampler from orchestrator-node-only to every allocated node, and adds the scheduler-level fields needed to attribute host-CPU interference to a remedy from a single baseline run: - per-process run_delay_ns (/proc/pid/schedstat): cumulative run-queue wait — the direct contention signal that CPU pinning remedies - per-process nr_migrations (/proc/pid/sched): cross-core churn, near-zero when pinned - per-process affinity_ncpus (sched_getaffinity): direct pinning-state observable (144 = floating, 36 = pinned rank on GB200/GB300) - host procs_running/procs_blocked and a t_mono companion timestamp (cross-node wall clocks have been observed seconds apart) Collection: host_sampler.py gains a stdlib-only standalone CLI mode (one file per node: host_samples_<node>.jsonl); benchmark_stage launches it on all non-orchestrator nodes via one srun --overlap per het group, gated by the new observability.host_sampler_all_nodes knob (default true, follows observability.enabled). This closes the gaps where worker nodes had no per-process host telemetry and a dedicated frontend node had none at all. Ingest: host_series.json gains a per-node hosts map plus run_delay_ms_per_s / migrations_rate / affinity_ncpus / procs_runnable series; rate denominators prefer the monotonic clock so NTP steps can't skew them. docs/host-attribution-metrics.md documents the metric set and the pinning-vs-placement attribution logic. Teardown hardening from adversarial review: benchmark proc creation moved inside the try so sampler sruns can't leak when placement/launch raises; sampler teardown escalates via terminate_and_reap and logs early-exited samplers; the standalone mode exits nonzero if its sampler thread dies; the sampler never samples itself. Signed-off-by: Yuewei Na <nv-yna@users.noreply.github.com>
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #356 +/- ##
=======================================
Coverage ? 72.23%
=======================================
Files ? 96
Lines ? 13169
Branches ? 0
=======================================
Hits ? 9513
Misses ? 3656
Partials ? 0 ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
First production evidence: round 1 of the c1010 validation matrixBoth round-1 runs (DSV4 c1010, 13× GB300 on oci-aga, collectors from this PR enabled) completed cleanly, and the samplers delivered on all nodes: 12 per-node Perf diff (single run per variant — repeats in progress)
Caveats: single runs on different NVL72 domains (d021 vs d195); the reference campaign's own single-run spread was 1–2%, so treat +4.2% as directionally right, not a settled effect size — rounds 2–3 bound it. Attribution evidence (what this PR exists for)Steady-window scheduler rates for the busiest worker rank per node, from the baseline run alone:
🤖 Generated with Claude Code |
…idation matrix Replaces the draft rubric with measured thresholds from 7 validation runs (2x baseline, 2x pinned, 3x dedicated-frontend at DSV4 c1010 on GB300): clean-node run-delay floor 0.00-0.01 ms/s; shared-node asymmetry 140-350x (persisting at 190x under pinning, collapsing to 1x in all three dedicated-frontend runs); affinity_ncpus as the direct pinning observable (full-width vs CPUs-per-GPU), unchanged by placement. Adds the operator three-step decision flow and expected-gain guidance (+4.0% pinning on 288-CPU nodes / +1.1% on 144-CPU; +0.5-0.85% placement). Signed-off-by: Yuewei Na <nv-yna@users.noreply.github.com>
Validation campaign complete: 9 runs, 3 per variant — double dissociation confirmedFinal results of the c1010 validation matrix (DSV4-Pro, 13–14× GB300, all runs with this PR's collectors enabled; orchestration parity-proven in #353): Throughput hierarchy (server-reported output tok/s)
C > B > A, A/B ranges disjoint; pinning +3.6% (cluster-dependent: these nodes expose 288 logical CPUs; the 144-CPU reference cluster measured +1.1%), placement +0.36% on top (reference +0.85%). TTFT p50 monotone: 1.43 → 1.31 → 1.32 s. The attribution metrics dissociate, replicated 3×Placement metric — shared-node worker rank's run-queue delay + migrations vs clean peers:
Pinning metric — Each metric responds to exactly its own remedy — the double dissociation these collectors were built to enable. Rubric thresholds derived from these numbers are in Known limitation, filed as follow-up: with 🤖 Generated with Claude Code |
…docs/comments for the collector union Post-merge fixups from the three-PR integration review: - benchmark_stage._start_remote_host_samplers hardcoded `--interval 2` (NVIDIA#356 predates b83dc4a, which made the in-process sampler follow observability.tachometer.collect_interval_ms). Derive the remote interval from the same knob, clamped to >= 1 s like HostSampler, so head-node and remote host_samples rows share one cadence. Test covers default, 2 s, 5 s, sub-second clamp and 1.5 s. - docs/config-reference.md node_exporter row lists the eight collectors of the union and the widened vmstat field filter (it still named NVIDIA#413's four). - telemetry_stage.py NODE_EXPORTER_COLLECTORS comment no longer claims "no scraper change is needed": the filter keeps numa_node / state / thread_state since the previous commit. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Signed-off-by: Yuewei Na <nv-yna@users.noreply.github.com>
What
Extends the
/prochost sampler from orchestrator-node-only to every allocated node, and adds the scheduler-level metrics needed to attribute host-CPU interference to a remedy from a single baseline run — the collection half of the pinning-vs-frontend-placement attribution methodology documented in the newdocs/host-attribution-metrics.md.Why
Two independent host-CPU effects are each worth ~1% output throughput at high concurrency on GB300 disaggregated serving (measured on the DSV4 c1010 A/B campaign): worker-rank CPU pinning, and moving frontend+etcd off the prefill node. Neither is visible in throughput/TTFT, and until now srt-slurm had zero host-CPU telemetry on worker nodes (and none at all on a dedicated frontend node). Retro-analysis of the c1010 runs showed the frontend-sharing node's ranks run measurably slower (cache-matched +1.3–2.0% median prefill time) and its GPUs 2–3 pp less utilized — signals these collectors now capture live.
New metrics (per sampled process)
run_delay_ns(schedstat)backend.numa_cpu_bindnr_migrations(/proc/pid/sched)backend.numa_cpu_bindaffinity_ncpus(sched_getaffinity)ctx_invol(existing) + per-proccpu_pcton the shared nodefrontend.dedicated_nodeprocs_running/blocked,t_monoHow
host_sampler.py: new fields; stdlib-only standalone CLI mode writinghost_samples_<node>.jsonl(SIGTERM-clean, exits nonzero if its sampler thread dies, never samples itself)benchmark_stage: launches the standalone sampler on all non-orchestrator nodes, onesrun --overlapper het group, no container; best-effort contract (a node without python3 logs and is skipped). Gated by newobservability.host_sampler_all_nodes(default true, followsobservability.enabled)host_series.jsongains a per-nodehostsmap + the new rate series; rate denominators prefer the monotonic clock (NTP-step-proof)terminate_and_reapescalation; early-exit loggingmake check: 1492 passed. 12 new tests (scheduler fields, standalone mode e2e, launch planning, remote-launch mocking, ingest rates incl. NTP-step case, multi-file merge).Status: first production evidence in
Round 1 of the validation matrix (baseline vs pinned at c1010) completed with these collectors enabled: all-node capture worked (13 files/run), and the baseline-only placement fingerprint is real — the frontend-sharing node's worker rank shows a ~100× run-queue-delay asymmetry vs clean peers, while
affinity_ncpusdirectly dissociates pinned (72) from unpinned (144) ranks. Full perf-diff and attribution tables: see the round-1 evidence comment below. Dedicated-frontend variants (C/D incl. the etcd-deconfounded cell) + repeats 2–3 are running to complete the double dissociation and set the rubric thresholds indocs/host-attribution-metrics.md.🤖 Generated with Claude Code