Skip to content

feat(bench): precompute-engine throughput vs CPU microbenchmark - #825

Merged
milindsrivastava1997 merged 1 commit into
mainfrom
precompute-throughput-microbench
Oct 11, 2026
Merged

milindsrivastava1997 merged 1 commit into
mainfrom
precompute-throughput-microbench

Conversation

@milindsrivastava1997

Copy link
Copy Markdown
Contributor

Summary

Microbenchmark of the standalone precompute_engine: throughput (samples/s) vs engine CPU for several StreamingConfigs and input cardinalities, for the paper's microbenchmark section. No Prometheus in the loop.

  • bench_ingest_sender (new bin): remote-write load generator run as a separate process on separate cores. Pre-encodes bodies off the send path, 16 senders each owning a disjoint slice of series (one request in flight, so per-series order holds), lockstepped so per-group watermarks don't drop a lagging sender's samples, optional target rate. Reports acked samples/s, engine + sender CPU (from /proc), engine peak RSS.
  • precompute_engine --num-aggregates-to-retain: without an inference config the standalone binary retained every window, so memory grew without bound (34 GB for KLL at 100K series in a 45 s run).
  • asap-tools/experiments/microbench/precompute_throughput/: pipeline configs (KLL, DDSketch, CMS+Heap, HydraKLL), sweep.py (main / fanin / window / scaling experiments), plot.py, results from a CloudLab run, and HANDOFF.md with the exact run procedure and why each setting is what it is.

Results (8 cores, saturation, M samples/s)

Pipeline 1K 10K 100K 1M
KLL 1.40 1.36 0.71 0.89
DDSketch 1.24 1.27 0.57 0.83
CMS+Heap 1.93 2.44 2.33 2.31
HydraKLL 0.64 1.73 1.94 2.12

Keyed sketches use all 8 cores and are flat in cardinality; per-series sketches saturate at ~5 of 8 cores at 100K+ series (not yet profiled; suspect the store's one RwLock per aggregation id). Caveats are listed in HANDOFF.md.

Test plan

  • Built and clippy-clean (bench_ingest_sender, precompute_engine); pre-commit (fmt/check/clippy/test) passed
  • Full sweep ran on CloudLab node5; sanity checks hold (sender CPU well under its cores, rate-limited points hit target)
  • Repeat runs (median of 3) before using numbers in the paper

🤖 Generated with Claude Code

Adds a remote-write load generator (bench_ingest_sender) and a sweep/plot
harness that measure the standalone precompute_engine's throughput against
CPU for KLL, DDSketch, CMS+Heap and HydraKLL pipelines at 1K-1M series,
plus fan-in, window-shape and core-scaling experiments.

precompute_engine gains --num-aggregates-to-retain: without an inference
config the standalone binary retained every window, so memory grew without
bound over a benchmark run.

Includes results from a CloudLab run and a HANDOFF.md on how to reproduce.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@milindsrivastava1997
milindsrivastava1997 marked this pull request as ready for review October 11, 2026 19:34
@milindsrivastava1997
milindsrivastava1997 merged commit c06d609 into main Oct 11, 2026
28 of 30 checks passed
@milindsrivastava1997
milindsrivastava1997 deleted the precompute-throughput-microbench branch October 11, 2026 19:35
milindsrivastava1997 added a commit that referenced this pull request Oct 12, 2026
…ncy layer (#832)

#825 added the bench_ingest_sender [[bin]] without a stub, so the cached
dependency build can't find it and every query-engine image build fails.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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