eval: 8-node CloudLab real-hardware §6 figures + harness fixes - #503
Merged
Merged
Conversation
Wire up the mvp-multinode harness to an 8-node CloudLab cluster (node0 driver, node1 cold, node2 warm, node3-7 sources) and produce real-hardware §6 figures. New: - topology.8node.env: 8-node role split (TOPOLOGY_ENV override) - scripts/scale_fleet.sh: Fig 10 fleet-size driver (reuses run_demo.sh as a lib) - scripts/plots.py: Fig 2/6/7/10 figure generators from harness CSV/JSONL - eval-8node/: rendered figures + raw results + RESULTS.md summary Results (real hardware): ASAP cuts ingest wire ~39x vs raw-none / ~120x at the warm sketch sink, at ~3x edge CPU; per-agent bandwidth flat at N=1-3; DDSketch p99 quantile median rel-err 0.026 vs KLL 0.084; edge gorilla encode ~2.1 us/sample. Bug fixes surfaced during the eval: - snapshot_resources.sh: hard-coded NIC enp130s0f0 -> auto-detect 10.10.1.x iface (this cluster is eno2); node set configurable via SNAP_NODES. - Dockerfile.otel-app: COPY the asap-precompute-go sibling its go.mod requires (+ build-context); otel-app image build was failing without it. - run_demo.sh / run_demo_sweep.sh: honor TOPOLOGY_ENV override; run_demo.sh sourceable as a library (RUN_DEMO_LIB=1). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- fig_costmodel.py: Fig 1 cost-vs-accuracy Pareto (measured Fig2/Fig3 anchors + cost-model sampling extension) and Fig 11 cold-storage (measured gorilla-XOR bytes/sample, 2.3x-12x vs uncompressed raw, data-dependent). - fig11_storage_bench.txt: real asap-gorilla-go storage benchmark output. - RESULTS.md: Fig 1 / Fig 11 sections + Fig 9 (coordinated-vs-uniform) documented as a scoped gap (coordinator on :4319 is present, but the MVP workload emits an empty monitors[] — needs a threshold-monitored metric + coordinated skewed fleet). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fig 9 (coordinated sampling on a skewed fleet) — advanced from "empty monitors[]" gap to an end-to-end-wired pipeline verified on hardware: - configs/asap/mvp-workload-fig9.yaml: adds a monitor: block to http_requests_total so the controller emits a backend monitors[] entry (agg_id + tau + epsilon). - run_demo.sh: DP_MONITOR_FLAGS plumbs --enable-monitor-coordinator into the data-plane (coordinator was off by default). - scripts/fig9_coordinated.sh: brings up the coordinator + a skewed 3-edge trace-replay fleet (synthetic timestamp_ms,series_id,value CSVs, -trace-loop). Result (fig9_partial.csv): all 3 edges connect to the coordinator and report a 25x skewed rate (80k/16k/3.2k per window), but the coordinator did not issue differentiated p<1 grants (tried tau=5e6 and 1e5) — grant-trigger in data_plane/src/monitor/ needs further investigation. Also documented: coordination only activates in the producer trace-replay path, not the synthetic path. Fig 10 v3: clean re-run (90s soak, 6-sample averaged CPU) — per-agent bandwidth flat at N=1-3 (0.047-0.060 MB/s), stable CPU 73-138%. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Fig 7 cold-OFF arm (fig7_latency.sh): warm-only quantile p99 = 51ms vs the cold-ON 167ms — confirms the cold-ON latency was Thanos archive failover, not the warm path. sum resolves warm in ~2.4ms. - Fig 9 root cause: coordinator.rs::allocate_p passes rates as BOTH rate and freq vectors, so √(f_i/rate_i)=1 for every edge → uniform p, the differentiated p_i ∝ √(f_i/rate_i) is architecturally not wired (per-key f_i not plumbed to the coordinator). Documented the fix path. - soak_rss.sh: Fig 6b memory-leak soak driver (RSS slope over a soak window). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Fig 8 (fig8_placement.sh): same DDSketch agg at SDK vs agent placement. Moving the sketch to the SDK drops agent CPU 111%->4.5% (~25x), backend 90%->6.6%, and producer 240%->99% (one compact sketch/window vs full raw-buffer) — earlier placement is cheaper at every downstream layer; tradeoff is sketch lib in every app. - Fig 6b (soak_rss.sh): 30-min agent RSS soak, slope -290/-183 MiB/hr (GC, not growth) => no leak. In-session proxy for the 24h target. - plot_fig8_fig6b.py renders both. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…Ek macros topology.8node.env now names machines by ROLE — DRIVER_HOST/IP, COLD_HOST/IP (MinIO/Thanos/merger/Prometheus/VM), WARM_HOST/IP (data_plane+control_plane), SRC_HOSTS/SRC_IPS (sources) — as the source of truth. The team's run_demo.sh 4-slot NODE0..NODE3 vars are kept as DERIVED compat shims (NODE1=COLD, NODE2=WARM, NODE0/NODE3 = first two SRC). ADD_HOSTS + scale_fleet.sh + soak_rss.sh use the role names (e.g. WARM_HOST/WARM_IP, COLD_HOST) instead of NODE2_IP/NODE1_HOST. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Fig 9 now shows end-to-end differentiated CDM grants on hardware: with the monitored sid s0 held at constant frequency and total rate skewed 400:80:16, the coordinator allocates granted p = 0.0010 / 0.0022 / 0.0049 (hot/med/quiet) — ratio 1:2.2:4.9, matching the √rate law √(400:80:16)=1:2.24:5. Edges auto-learn the cms_point monitor (key s0) from the controller config. - mvp-workload-fig9.yaml: monitor functional sum -> cms_point, key: s0. - fig9_coordinated.sh: seed the monitor into the data-plane BOOT streaming-config + restart it (the coordinator only reads monitors() at boot, not on hot-reload), tau=7000 / window_ms=15000 so the slack countdown trips each window, pass -monitor-key=s0 alongside -monitor-config-url, portable paths, learn+p parsing. - fig9_cmspoint.csv + figs/fig9_coordinated.png: result + plot (replaces fig9_partial.csv). - RESULTS.md: rewrite Fig 9 from the prior 'architecturally cannot' note to the measured result + the five bugs fixed (needs ASAPQuery-backend#377 coordinator per-sid freq + ASAPCollector#504 edge key/flag fixes). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
With the data-plane coordinator hot-reload landed (ASAPQuery-backend#379), Fig 9 no longer needs the seed-boot-config + restart-data-plane workaround: - mvp-workload-fig9.yaml: the monitor block now carries the real coordination params (tau 7000, window_secs 15) instead of placeholder tau 5e6 / 30 s, so the controller-published monitor is directly usable by the coordinator. - fig9_coordinated.sh: replace the seed+restart of asap-data-plane with a wait for the coordinator's 'hot-reloaded monitors' log — the monitor is picked up live. - RESULTS.md: bug #2 is now a code fix (#379), not a run-side workaround. Live-validated end-to-end (no seed, no restart): data-plane logs 'hot-reloaded monitors added=1', 0 unconfigured registrations, grants 0.0010/0.0022/0.0049 (hot/med/quiet) — identical to the boot-seed result and matching the sqrt(rate) law. REQUIRES ASAPQuery-backend#379 in the data-plane image. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Wires up the
mvp-multinodeharness to an 8-node CloudLab cluster and produces real-hardware §6 figures, with the bug fixes needed to get the stack running at scale.Figures (see
deploy/mvp-multinode/eval-8node/RESULTS.md)Bug fixes
Dockerfile.otel-app: COPY theasap-precompute-gosibling its go.mod requires (build was failing).snapshot_resources.sh: auto-detect the 10.10.1.x NIC (was hard-codedenp130s0f0).run_demo.sh/run_demo_sweep.sh:TOPOLOGY_ENVoverride;run_demo.shsourceable as a library;DP_MONITOR_FLAGSto enable the CDM coordinator.New
topology.8node.env,scale_fleet.sh,fig9_coordinated.sh,fig7_latency.sh,fig8_placement.sh,soak_rss.sh,plots.py,fig_costmodel.py,plot_fig8_fig6b.py, andeval-8node/(figures + raw results + RESULTS.md).🤖 Generated with Claude Code