From 9097ec43158967ad2ff8528dfda4533551a4e17f Mon Sep 17 00:00:00 2001 From: Zeying Zhu <50204836+zzylol@users.noreply.github.com> Date: Mon, 12 Oct 2026 14:38:54 +0000 Subject: [PATCH 1/7] Move asap_sketchlib pin to main for the CMSHeap ASAPv1 payload The pinned rev predates the CMSHeap ASAPv1 envelope (asap_sketchlib#115). On main, DdSketchState also carries negative and zero stores, so the DDSketch wrapper now uses sketchlib's own to_proto/from_proto mapping. --- asap-precompute-rs/Cargo.lock | 10 +++---- asap-precompute-rs/Cargo.toml | 2 +- asap-precompute-rs/src/sketches/ddsketch.rs | 30 +++++---------------- 3 files changed, 13 insertions(+), 29 deletions(-) diff --git a/asap-precompute-rs/Cargo.lock b/asap-precompute-rs/Cargo.lock index aec0f19..79e6252 100644 --- a/asap-precompute-rs/Cargo.lock +++ b/asap-precompute-rs/Cargo.lock @@ -381,8 +381,8 @@ dependencies = [ [[package]] name = "asap_sketchlib" -version = "0.2.2" -source = "git+https://github.com/ProjectASAP/asap_sketchlib?rev=010457de46ba9ec5574a53476bbe8b4bdb02b965#010457de46ba9ec5574a53476bbe8b4bdb02b965" +version = "0.3.0" +source = "git+https://github.com/ProjectASAP/asap_sketchlib?rev=3fc3442c3275d374f79ba522f473de83912c6345#3fc3442c3275d374f79ba522f473de83912c6345" dependencies = [ "bytes", "prost 0.13.5", @@ -5443,7 +5443,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "03da047801ff44bb6a4d407d4860c05fd70bb81714e6b2f3812603d5b145b042" dependencies = [ "heck", - "itertools 0.14.0", + "itertools 0.13.0", "log", "multimap", "petgraph", @@ -5464,7 +5464,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a56d757972c98b346a9b766e3f02746cde6dd1cd1d1d563472929fdd74bec4d" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.13.0", "proc-macro2", "quote", "syn 2.0.118", @@ -5477,7 +5477,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b570b25f7617e43d59005d0990ccb79e950a423952cea19671b7a876da390adf" dependencies = [ "anyhow", - "itertools 0.14.0", + "itertools 0.13.0", "proc-macro2", "quote", "syn 2.0.118", diff --git a/asap-precompute-rs/Cargo.toml b/asap-precompute-rs/Cargo.toml index 71e7512..302ff29 100644 --- a/asap-precompute-rs/Cargo.toml +++ b/asap-precompute-rs/Cargo.toml @@ -7,7 +7,7 @@ license = "MIT" # asap_sketchlib is a public dependency. [dependencies] -asap_sketchlib = { git = "https://github.com/ProjectASAP/asap_sketchlib", rev = "010457de46ba9ec5574a53476bbe8b4bdb02b965" } +asap_sketchlib = { git = "https://github.com/ProjectASAP/asap_sketchlib", rev = "3fc3442c3275d374f79ba522f473de83912c6345" } serde = { version = "1", features = ["derive"] } prost = "0.13" # OTAP's generated protobuf types implement the 0.14 Message trait. diff --git a/asap-precompute-rs/src/sketches/ddsketch.rs b/asap-precompute-rs/src/sketches/ddsketch.rs index 49a8fec..6e96350 100644 --- a/asap-precompute-rs/src/sketches/ddsketch.rs +++ b/asap-precompute-rs/src/sketches/ddsketch.rs @@ -63,18 +63,9 @@ impl DDSketchWrapper { } fn build_state(&self) -> DdSketchState { - DdSketchState { - // Use the gamma-roundtripped alpha so the on-the-wire bytes - // match the portable serialization exactly. - // - // The DataPoint-level METRIC scalars (count/sum/min/max) were - // dropped from `DdSketchState`: the count is recoverable by - // summing `store_counts` and the others are bucket-estimated, - // so the wire format now carries only alpha + the bucket store. - alpha: self.sk.wire_alpha(), - store_counts: self.sk.store_counts.clone(), - store_offset: self.sk.store_offset, - } + // asap_sketchlib owns the proto mapping, including the negative-value + // and zero stores and the gamma-roundtripped alpha. + self.sk.to_proto() } fn encode_envelope(&self) -> Vec { @@ -107,17 +98,10 @@ impl DDSketchWrapper { state.alpha ))); } - // `DdSketchState` no longer carries the count/sum/min/max scalars. - // The total count is recovered by summing `store_counts` (see - // `DdSketch::total_count`); min/max are estimated from the extreme - // non-empty buckets inside `DdSketch::quantile`, within DDSketch's - // alpha relative-accuracy bound. So we reconstruct purely from the - // bucket store + alpha. - Ok(DdSketch::from_raw( - state.alpha, - state.store_counts, - state.store_offset, - )) + // `DdSketchState` carries no count/sum/min/max scalars: the count is + // the sum of all stores and min/max are bucket-estimated, within + // DDSketch's alpha relative-accuracy bound. + Ok(DdSketch::from_proto(state)) } } From 05ca90e9e38495e42808b74774f7f9f7f60325c4 Mon Sep 17 00:00:00 2001 From: Zeying Zhu <50204836+zzylol@users.noreply.github.com> Date: Mon, 12 Oct 2026 14:38:54 +0000 Subject: [PATCH 2/7] Add CMSHeapWrapper over asap_sketchlib CMSHeap Count-Min sketch with a top-k heap: full ASAPv1 snapshots (kind 0x03 0x00), merge that re-ranks both heaps on merged counters, and FrequencySketch top_k. Envelopes name it CountMinSketchWithHeap. --- asap-precompute-rs/src/config.rs | 14 +- asap-precompute-rs/src/envelope.rs | 7 + asap-precompute-rs/src/otap/decode.rs | 1 + asap-precompute-rs/src/sketches/cms.rs | 2 +- asap-precompute-rs/src/sketches/cms_heap.rs | 171 ++++++++++++++++++++ asap-precompute-rs/src/sketches/mod.rs | 2 + asap-precompute-rs/tests/otap_codec.rs | 2 + 7 files changed, 192 insertions(+), 7 deletions(-) create mode 100644 asap-precompute-rs/src/sketches/cms_heap.rs diff --git a/asap-precompute-rs/src/config.rs b/asap-precompute-rs/src/config.rs index ba8e032..cb25410 100644 --- a/asap-precompute-rs/src/config.rs +++ b/asap-precompute-rs/src/config.rs @@ -170,13 +170,15 @@ pub fn sketch_size_string(sketch_type: SketchType, params: &SketchParams) -> Opt _ => None, }, }, - SketchType::CountMinSketch => match (params.get("rows"), params.get("columns")) { - (Some(r), Some(c)) => match (as_wire_u64(*r), as_wire_u64(*c)) { - (Some(r), Some(c)) => Some(format!("{r} x {c}")), + SketchType::CountMinSketch | SketchType::CountMinSketchWithHeap => { + match (params.get("rows"), params.get("columns")) { + (Some(r), Some(c)) => match (as_wire_u64(*r), as_wire_u64(*c)) { + (Some(r), Some(c)) => Some(format!("{r} x {c}")), + _ => None, + }, _ => None, - }, - _ => None, - }, + } + } SketchType::Unspecified => None, } } diff --git a/asap-precompute-rs/src/envelope.rs b/asap-precompute-rs/src/envelope.rs index 37706d1..cf6e69f 100644 --- a/asap-precompute-rs/src/envelope.rs +++ b/asap-precompute-rs/src/envelope.rs @@ -51,6 +51,8 @@ pub enum SketchType { CountSketch, /// Count-Min Sketch frequency sketch. CountMinSketch, + /// Count-Min Sketch plus a top-k heavy-hitter heap (ASAPv1 kind `0x03 0x00`). + CountMinSketchWithHeap, } impl SketchType { @@ -63,6 +65,7 @@ impl SketchType { Self::HLLSketch => "HLLSketch", Self::CountSketch => "CountSketch", Self::CountMinSketch => "CountMinSketch", + Self::CountMinSketchWithHeap => "CountMinSketchWithHeap", Self::Unspecified => "Unspecified", } } @@ -225,6 +228,10 @@ mod tests { assert_eq!(SketchType::HLLSketch.name(), "HLLSketch"); assert_eq!(SketchType::CountSketch.name(), "CountSketch"); assert_eq!(SketchType::CountMinSketch.name(), "CountMinSketch"); + assert_eq!( + SketchType::CountMinSketchWithHeap.name(), + "CountMinSketchWithHeap" + ); assert_eq!(SketchType::Unspecified.name(), "Unspecified"); } diff --git a/asap-precompute-rs/src/otap/decode.rs b/asap-precompute-rs/src/otap/decode.rs index b8c6958..b1e502b 100644 --- a/asap-precompute-rs/src/otap/decode.rs +++ b/asap-precompute-rs/src/otap/decode.rs @@ -235,6 +235,7 @@ pub(super) fn parse_sketch_type(row: usize, raw: &str) -> Result Ok(SketchType::HLLSketch), "CountSketch" => Ok(SketchType::CountSketch), "CountMinSketch" => Ok(SketchType::CountMinSketch), + "CountMinSketchWithHeap" => Ok(SketchType::CountMinSketchWithHeap), "Unspecified" | "" => Ok(SketchType::Unspecified), _ => Err(OtapDecodeError::UnknownSketchType { row, diff --git a/asap-precompute-rs/src/sketches/cms.rs b/asap-precompute-rs/src/sketches/cms.rs index 4ffee0e..932a1a3 100644 --- a/asap-precompute-rs/src/sketches/cms.rs +++ b/asap-precompute-rs/src/sketches/cms.rs @@ -25,7 +25,7 @@ const MAX_ROW_HASH_BITS: usize = 64; /// `log2(cols)` == the per-row bit width. When `bits_per_row == 0` /// (cols == 1) every row maps to column 0 regardless, so the slicing /// never overflows and `rows` is left as-is. Returns at least 1. -fn clamp_rows_for_hash_bits(rows: usize, cols: usize) -> usize { +pub(crate) fn clamp_rows_for_hash_bits(rows: usize, cols: usize) -> usize { let bits_per_row = cols.trailing_zeros() as usize; if bits_per_row == 0 { return rows.max(1); diff --git a/asap-precompute-rs/src/sketches/cms_heap.rs b/asap-precompute-rs/src/sketches/cms_heap.rs new file mode 100644 index 0000000..f9c4388 --- /dev/null +++ b/asap-precompute-rs/src/sketches/cms_heap.rs @@ -0,0 +1,171 @@ +//! Count-Min sketch with a top-k heap, over [`asap_sketchlib::CMSHeap`]. +//! +//! Implements [`Sketch`] + [`FrequencySketch`]. Snapshots are sketchlib's +//! ASAPv1 envelope (kind `0x03 0x00`): the counter matrix plus the heap's +//! keys and counts. There is no delta encoding; every payload is full state. + +use std::any::Any; + +use asap_sketchlib::{CMSHeap, DataInput, HeapItem}; + +use super::cms::clamp_rows_for_hash_bits; +use crate::precompute::{DeltaResult, FrequencyEntry, FrequencySketch, PrecomputeError, Sketch}; + +/// Count-Min sketch plus heavy-hitter heap. Keys are raw bytes. +pub struct CMSHeapWrapper { + sk: CMSHeap, +} + +impl CMSHeapWrapper { + /// Construct with `top_k` heap slots. `cols` is rounded up to a power of + /// two and `rows` clamped to the 64-bit hash budget, as for + /// [`super::CMSWrapper`]. + pub fn new(rows: usize, cols: usize, top_k: usize) -> Self { + let cols = cols.max(1).next_power_of_two(); + let rows = clamp_rows_for_hash_bits(rows, cols); + Self { + sk: CMSHeap::new(rows, cols, top_k.max(1)), + } + } + + /// Decode a full ASAPv1 snapshot. + pub fn from_snapshot(bytes: &[u8]) -> Result { + CMSHeap::deserialize_from_bytes(bytes) + .map(|sk| Self { sk }) + .map_err(|e| PrecomputeError::Other(format!("CMSHeapWrapper decode: {e}"))) + } + + /// Add `count` occurrences of `key` and refresh its heap entry. + pub fn update(&mut self, key: &[u8], count: i64) { + self.sk.insert_many(&DataInput::Bytes(key), count); + } + + /// Merge counters, then re-rank both heaps' candidates on the merged counters. + pub fn merge_from(&mut self, other: &Self) -> Result<(), PrecomputeError> { + if (self.sk.rows(), self.sk.cols()) != (other.sk.rows(), other.sk.cols()) { + return Err(PrecomputeError::Other( + "CMSHeapWrapper merge: dimension mismatch".into(), + )); + } + self.sk.merge(&other.sk); + Ok(()) + } + + /// Borrow the underlying sketch. + pub fn inner(&self) -> &CMSHeap { + &self.sk + } +} + +impl Sketch for CMSHeapWrapper { + fn snapshot(&self) -> Result, PrecomputeError> { + if self.sk.heap().is_empty() { + return Ok(Vec::new()); + } + self.sk + .serialize_to_bytes() + .map_err(|e| PrecomputeError::Other(format!("CMSHeapWrapper snapshot: {e}"))) + } + + fn compute_delta_against(&self, _: &[u8], _: u64) -> Result { + Ok(DeltaResult { + payload: self.snapshot()?, + is_full: true, + }) + } + + fn apply_delta(&mut self, payload: &[u8]) -> Result<(), PrecomputeError> { + if payload.is_empty() { + return Ok(()); + } + self.merge_from(&Self::from_snapshot(payload)?) + } + + fn merge(&mut self, other: &dyn Sketch) -> Result<(), PrecomputeError> { + self.apply_delta(&other.snapshot()?) + } + + fn reset(&mut self) { + self.sk = CMSHeap::new(self.sk.rows(), self.sk.cols(), self.sk.heap().capacity()); + } + + fn as_any_mut(&mut self) -> &mut dyn Any { + self + } +} + +impl FrequencySketch for CMSHeapWrapper { + fn estimate_count(&self, key: &[u8]) -> f64 { + self.sk.estimate(&DataInput::Bytes(key)) as f64 + } + + /// Heap entries, largest count first. + fn top_k(&self, k: usize) -> Vec { + let mut entries = self + .sk + .heap() + .heap() + .iter() + .filter_map(|item| match &item.key { + HeapItem::Bytes(key) => Some(FrequencyEntry { + key: key.clone(), + count: item.count as f64, + }), + _ => None, + }) + .collect::>(); + entries.sort_by(|a, b| b.count.total_cmp(&a.count).then_with(|| a.key.cmp(&b.key))); + entries.truncate(k); + entries + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn keyed(counts: &[(u64, i64)]) -> CMSHeapWrapper { + let mut sk = CMSHeapWrapper::new(4, 2048, 3); + for (key, count) in counts { + sk.update(&key.to_be_bytes(), *count); + } + sk + } + + fn keys(sk: &CMSHeapWrapper) -> Vec { + sk.top_k(3) + .iter() + .map(|e| u64::from_be_bytes(e.key.as_slice().try_into().unwrap())) + .collect() + } + + #[test] + fn top_k_orders_heavy_hitters() { + let sk = keyed(&[(1, 5), (2, 50), (3, 20), (4, 1), (5, 30)]); + assert_eq!(keys(&sk), vec![2, 5, 3]); + assert_eq!(sk.estimate_count(&2u64.to_be_bytes()), 50.0); + } + + #[test] + fn snapshot_round_trips_through_asapv1() { + let sk = keyed(&[(7, 9), (8, 4)]); + let bytes = sk.snapshot().unwrap(); + let decoded = CMSHeapWrapper::from_snapshot(&bytes).unwrap(); + assert_eq!(decoded.top_k(3), sk.top_k(3)); + assert_eq!(decoded.snapshot().unwrap(), bytes); + } + + #[test] + fn merge_reranks_candidates_from_both_heaps() { + let mut left = keyed(&[(1, 10), (2, 9), (3, 8), (4, 7)]); + let right = keyed(&[(4, 7), (5, 1)]); + left.merge(&right).unwrap(); + assert_eq!(keys(&left), vec![4, 1, 2]); + assert_eq!(left.estimate_count(&4u64.to_be_bytes()), 14.0); + } + + #[test] + fn empty_sketch_has_empty_snapshot() { + assert!(CMSHeapWrapper::new(4, 64, 2).snapshot().unwrap().is_empty()); + } +} diff --git a/asap-precompute-rs/src/sketches/mod.rs b/asap-precompute-rs/src/sketches/mod.rs index 404c5e7..a539d4f 100644 --- a/asap-precompute-rs/src/sketches/mod.rs +++ b/asap-precompute-rs/src/sketches/mod.rs @@ -33,12 +33,14 @@ //! inner state proto. pub mod cms; +pub mod cms_heap; pub mod countsketch; pub mod ddsketch; pub mod hll; pub mod kll; pub use cms::{CMSObserver, CMSWrapper}; +pub use cms_heap::CMSHeapWrapper; pub use countsketch::{CountSketchObserver, CountSketchWrapper}; pub use ddsketch::{DDSketchObserver, DDSketchWrapper}; pub use hll::{HLLObserver, HLLWrapper}; diff --git a/asap-precompute-rs/tests/otap_codec.rs b/asap-precompute-rs/tests/otap_codec.rs index fcb661a..1a2eaef 100644 --- a/asap-precompute-rs/tests/otap_codec.rs +++ b/asap-precompute-rs/tests/otap_codec.rs @@ -61,6 +61,7 @@ fn batch_from_envelope_entries(entries: &[(SketchType, &[u8])]) -> RecordBatch { SketchType::HLLSketch => "metric_HLLSketch", SketchType::CountSketch => "metric_CountSketch", SketchType::CountMinSketch => "metric_CountMinSketch", + SketchType::CountMinSketchWithHeap => "metric_CountMinSketchWithHeap", SketchType::Unspecified => "metric_Unspecified", }) .collect(); @@ -183,6 +184,7 @@ fn per_sketch_type_round_trip_smoke() { (SketchType::HLLSketch, vec![0xcc; 16]), (SketchType::CountSketch, vec![0xdd; 128]), (SketchType::CountMinSketch, vec![0xee; 256]), + (SketchType::CountMinSketchWithHeap, vec![0xef; 96]), ] { let env = envelope_for(sketch_type, &payload); let batch = encode_batch(std::slice::from_ref(&env)).expect("encode"); From 9d7625ac92b4971213c5d553c0d017a5b50f0093 Mon Sep 17 00:00:00 2001 From: Zeying Zhu <50204836+zzylol@users.noreply.github.com> Date: Mon, 12 Oct 2026 14:47:54 +0000 Subject: [PATCH 3/7] Accept CMSHeap ASAPv1 payloads in the OTAP sketch carrier The carrier validated every sketch.envelope as KLL. CountMinSketchWithHeap envelopes are now validated as CMSHeap; other types keep the KLL check. --- asap-precompute-rs/src/otap/codec.rs | 36 +++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/asap-precompute-rs/src/otap/codec.rs b/asap-precompute-rs/src/otap/codec.rs index a32d84a..7d8e2d0 100644 --- a/asap-precompute-rs/src/otap/codec.rs +++ b/asap-precompute-rs/src/otap/codec.rs @@ -185,7 +185,7 @@ impl OtapSketchEncoder { /// Encodes one flush while retaining series identity across later flushes. pub fn encode(&mut self, envelopes: &[SketchEnvelope]) -> Result { for env in envelopes { - validate_self_describing_payload(env.encoding, &env.payload) + validate_self_describing_payload(env.sketch_type, env.encoding, &env.payload) .map_err(CodecError::Encode)?; } let series_ids = envelopes @@ -223,7 +223,11 @@ impl OtapSketchEncoder { /// /// `sketch.envelope` contains the canonical sketchlib ASAPv1 envelope: /// magic, version, kind ID, length-prefixed metadata, and payload. -fn validate_self_describing_payload(encoding: Encoding, payload: &[u8]) -> Result<(), String> { +fn validate_self_describing_payload( + sketch_type: crate::envelope::SketchType, + encoding: Encoding, + payload: &[u8], +) -> Result<(), String> { if payload.is_empty() { return Ok(()); } @@ -233,6 +237,11 @@ fn validate_self_describing_payload(encoding: Encoding, payload: &[u8]) -> Resul encoding.name() )); } + if sketch_type == crate::envelope::SketchType::CountMinSketchWithHeap { + return crate::sketches::CMSHeapWrapper::from_snapshot(payload) + .map(|_| ()) + .map_err(|error| format!("invalid self-describing CMSHeap sketch.envelope: {error}")); + } asap_sketchlib::sketches::KLL::::deserialize_from_bytes(payload) .map(|_| ()) .map_err(|error| format!("invalid self-describing KLL sketch.envelope: {error}")) @@ -1579,7 +1588,8 @@ impl DecodeAccumulator { .transpose() .map_err(|error| CodecError::Decode(error.to_string()))? .unwrap_or(crate::envelope::Encoding::Unspecified); - validate_self_describing_payload(encoding, &payload).map_err(CodecError::Decode)?; + validate_self_describing_payload(sketch_type, encoding, &payload) + .map_err(CodecError::Decode)?; let timestamp_ms = dp.time_unix_nano() / 1_000_000; let envelope = SketchEnvelope { schema_version: inherited_schema.schema_version.unwrap_or(0), @@ -1881,6 +1891,26 @@ mod tests { assert_eq!(decoded_env.window_end_ms, 2_000); } + #[test] + fn summary_carrier_round_trips_a_cms_heap_envelope() { + use crate::sketches::CMSHeapWrapper; + let mut env = one_envelope("topk_stream", 0.0, "region", "us-east"); + env.sketch_type = SketchType::CountMinSketchWithHeap; + env.encoding = Encoding::Msgpack; + let mut sketch = CMSHeapWrapper::new(4, 64, 3); + sketch.update(b"checkout", 5); + env.payload = sketch.snapshot().expect("CMSHeap ASAPv1 envelope"); + let pdata = encode_envelopes_to_pdata(std::slice::from_ref(&env)).expect("encode"); + let outcome = decode_pdata_to_observations(pdata).expect("decode"); + let decoded = outcome.observations[0].value.envelope.as_ref().unwrap(); + assert_eq!(decoded.sketch_type, SketchType::CountMinSketchWithHeap); + assert_eq!(decoded.payload, env.payload); + + // A CMSHeap payload labelled as KLL is still rejected. + env.sketch_type = SketchType::KLLSketch; + assert!(encode_envelopes_to_pdata(std::slice::from_ref(&env)).is_err()); + } + #[test] fn asapv1_rejects_non_self_describing_envelope_bytes() { let mut env = one_envelope("sketch_stream", 0.0, "region", "us-east"); From 6606f209bb2238de45700409fb161ff9684bc4d4 Mon Sep 17 00:00:00 2001 From: Zeying Zhu <50204836+zzylol@users.noreply.github.com> Date: Mon, 12 Oct 2026 14:47:54 +0000 Subject: [PATCH 4/7] Add CMS-with-heap and exact top-k streaming scenarios and dashboard topk-exact ships per-key count maps and sums them; cmsheap ships one ASAPv1 CMSHeap per source and merges sketches. Keys follow Zipf(1.1) over 2^20 ranks. The backend validates every window: exact must match, the sketch must reach recall@10 >= 0.9. The demo exports top-k, recall and count error next to per-process throughput, CPU and egress. --- .../src/bin/asap_stream_bench.rs | 107 +++- .../src/bin/stream_bench/model.rs | 2 +- .../src/bin/stream_bench/topk.rs | 577 ++++++++++++++++++ benchmarks/run-streaming.py | 25 +- .../grafana/dashboards/topk-stream.json | 301 +++++++++ demos/kll-grafana/verify-streaming.py | 35 +- 6 files changed, 1015 insertions(+), 32 deletions(-) create mode 100644 asap-precompute-rs/src/bin/stream_bench/topk.rs create mode 100644 demos/kll-grafana/grafana/dashboards/topk-stream.json diff --git a/asap-precompute-rs/src/bin/asap_stream_bench.rs b/asap-precompute-rs/src/bin/asap_stream_bench.rs index 892eda4..958cd8c 100644 --- a/asap-precompute-rs/src/bin/asap_stream_bench.rs +++ b/asap-precompute-rs/src/bin/asap_stream_bench.rs @@ -4,6 +4,9 @@ mod model; #[path = "stream_bench/profile.rs"] mod profile; +#[path = "stream_bench/topk.rs"] +mod topk; +use asap_precompute_rs::otap::codec::decode_pdata_to_observations; use async_trait::async_trait; use linkme::distributed_slice; use otel_arrow_dfe_config::{ @@ -89,7 +92,7 @@ impl Options { signals_per_second: number("ASAP_SIGNALS_PER_SECOND", "100000")?, rolling_windows: number("ASAP_ROLLING_WINDOWS", "1")?, }; - if !["raw", "exact", "kll"].contains(&o.scenario.as_str()) + if !["raw", "exact", "kll", "topk-exact", "cmsheap"].contains(&o.scenario.as_str()) || !["generator", "branch", "merge", "estimate", "backend"].contains(&o.role.as_str()) || o.points == 0 || o.batch == 0 @@ -117,6 +120,8 @@ struct Stats { output_messages: u64, window_latency_ms: BTreeMap, latest_results: Vec, + latest_topk: Vec, + topk_accuracy: Vec, } struct Shared { stats: Mutex, @@ -223,8 +228,33 @@ fn start_control() -> Result<(), String> { }); Ok(()) } +/// Quantile scenarios (raw/exact/kll) or keyed top-k scenarios (topk-exact/cmsheap). +enum Stage { + Quantile(model::Processor), + TopK(topk::Processor), +} +impl Stage { + fn process(&mut self, pdata: OtapPdata) -> Result, String> { + match self { + Self::Quantile(p) => p.process(pdata), + Self::TopK(p) => p.process(pdata), + } + } + fn process_normalized( + &mut self, + batch: model::NormalizedBatch, + ) -> Result, String> { + match self { + Self::Quantile(p) => p.process_normalized(batch), + Self::TopK(p) => p.process_normalized(batch), + } + } +} +fn is_topk(scenario: &str) -> bool { + matches!(scenario, "topk-exact" | "cmsheap") +} struct StreamProcessor { - processor: model::Processor, + processor: Stage, normalizer: Option, } #[async_trait(?Send)] @@ -284,13 +314,23 @@ fn create_processor( let o = OPTIONS.get().unwrap(); Ok(ProcessorWrapper::local( StreamProcessor { - processor: model::Processor::new( - &o.scenario, - &o.role, - o.points, - o.batch, - o.rolling_windows, - ), + processor: if is_topk(&o.scenario) { + Stage::TopK(topk::Processor::new( + &o.scenario, + &o.role, + o.points, + o.batch, + o.rolling_windows, + )) + } else { + Stage::Quantile(model::Processor::new( + &o.scenario, + &o.role, + o.points, + o.batch, + o.rolling_windows, + )) + }, normalizer: (o.role == "branch") .then(|| model::InputNormalizer::new(o.source, o.points, o.batch)), }, @@ -306,7 +346,35 @@ static PROCESSOR_FACTORY: ProcessorFactory = ProcessorFactory { wiring_contract: otel_arrow_dfe_engine::wiring_contract::WiringContract::UNRESTRICTED, validate_config: otel_arrow_dfe_config::validation::no_config, }; -struct ValidatingBackend(model::Backend); +enum ValidatingBackend { + Quantile(model::Backend), + TopK(topk::Backend, u64), +} +impl ValidatingBackend { + /// Completed input signals and optional (window id, start timestamp). + fn receive(&mut self, pdata: OtapPdata) -> Result<(u64, Option<(u64, u64)>), String> { + match self { + Self::Quantile(backend) => { + let received = backend.receive(pdata)?; + if received.1.is_some() { + let mut stats = shared().stats.lock().unwrap(); + stats.latest_results.clone_from(&backend.latest); + } + Ok(received) + } + Self::TopK(backend, signals) => { + let obs = decode_pdata_to_observations(pdata) + .map_err(|e| e.to_string())? + .observations; + let completed = backend.receive(&obs)?; + let mut stats = shared().stats.lock().unwrap(); + stats.latest_topk.clone_from(&backend.latest); + stats.topk_accuracy.clone_from(&backend.accuracy); + Ok((*signals, Some(completed))) + } + } + } +} #[async_trait(?Send)] impl exporter::Exporter for ValidatingBackend { async fn start( @@ -319,7 +387,6 @@ impl exporter::Exporter for ValidatingBackend { Message::PData(pdata) => { // Validation failures terminate the benchmark, never increment goodput. let (count, completed) = self - .0 .receive(pdata.clone()) .expect("backend correctness failure"); { @@ -327,7 +394,6 @@ impl exporter::Exporter for ValidatingBackend { stats.received_signals += count; if let Some((window, start)) = completed { assert_eq!(window, stats.completed_windows, "backend window gap"); - stats.latest_results.clone_from(&self.0.latest); stats.completed_windows += 1; let elapsed_ms = now_ns().saturating_sub(start) / 1_000_000; *stats.window_latency_ms.entry(elapsed_ms).or_default() += 1; @@ -351,11 +417,18 @@ fn create_backend( ) -> Result, otel_arrow_dfe_config::error::Error> { let o = OPTIONS.get().unwrap(); Ok(ExporterWrapper::local( - ValidatingBackend(model::Backend::new( - &o.scenario, - o.points, - o.rolling_windows, - )), + if is_topk(&o.scenario) { + ValidatingBackend::TopK( + topk::Backend::new(&o.scenario, o.points, o.rolling_windows), + (o.points * 2) as u64, + ) + } else { + ValidatingBackend::Quantile(model::Backend::new( + &o.scenario, + o.points, + o.rolling_windows, + )) + }, node, config, runtime, diff --git a/asap-precompute-rs/src/bin/stream_bench/model.rs b/asap-precompute-rs/src/bin/stream_bench/model.rs index 0e03090..b125d14 100644 --- a/asap-precompute-rs/src/bin/stream_bench/model.rs +++ b/asap-precompute-rs/src/bin/stream_bench/model.rs @@ -53,7 +53,7 @@ impl Meta { started_ns: get("bench.started_ns")?, }) } - fn envelope(self, value: f64) -> SketchEnvelope { + pub fn envelope(self, value: f64) -> SketchEnvelope { SketchEnvelope { schema_version: 1, sketch_type: SketchType::Unspecified, diff --git a/asap-precompute-rs/src/bin/stream_bench/topk.rs b/asap-precompute-rs/src/bin/stream_bench/topk.rs new file mode 100644 index 0000000..3f5f138 --- /dev/null +++ b/asap-precompute-rs/src/bin/stream_bench/topk.rs @@ -0,0 +1,577 @@ +//! Keyed top-k over the same count-aligned windows as `model.rs`. +//! +//! `topk-exact` keeps a per-key count map per window, ships every entry and +//! sums the maps; `cmsheap` ships one ASAPv1 Count-Min-with-heap sketch per +//! source and merges sketches. Both answer the top `K` keys per window. +use super::model::{Meta, NormalizedBatch, MAX_PENDING}; +use super::profile::{self, Category}; +use asap_precompute_rs::{ + envelope::{Encoding, SketchEnvelope, SketchType}, + observation::{KeyValue, Observation}, + otap::codec::{decode_pdata_to_observations, encode_envelopes_to_pdata}, + precompute::FrequencySketch, + sketches::CMSHeapWrapper, +}; +use otel_arrow_dfe_otap::pdata::OtapPdata; +use serde::Serialize; +use std::collections::{BTreeMap, HashMap, VecDeque}; +use std::hash::{BuildHasherDefault, Hasher}; +use std::sync::OnceLock; + +pub const K: usize = 10; +const KEYS: usize = 1 << 20; +const ZIPF_S: f64 = 1.1; +const CMS_ROWS: usize = 4; +const CMS_COLS: usize = 2048; +const KEY_SEED: u64 = 0x2545_f491_4f6c_dd1d; +/// Minimum recall@K the sketch must reach in every window. +const MIN_RECALL: f64 = 0.9; + +fn mix(mut x: u64) -> u64 { + x = (x ^ (x >> 30)).wrapping_mul(0xbf58_476d_1ce4_e5b9); + x = (x ^ (x >> 27)).wrapping_mul(0x94d0_49bb_1331_11eb); + x ^ (x >> 31) +} + +/// Deterministic Zipf(s=1.1) key over 2^20 ranks; ranks are scrambled so the +/// heaviest keys are not small integers. +pub fn key(index: u64) -> u64 { + static CDF: OnceLock> = OnceLock::new(); + let cdf = CDF.get_or_init(|| { + let mut total = 0.0; + let mut cdf = (1..=KEYS) + .map(|rank| { + total += (rank as f64).powf(-ZIPF_S); + total + }) + .collect::>(); + cdf.iter_mut().for_each(|c| *c /= total); + cdf + }); + let unit = (mix(index.wrapping_add(KEY_SEED)) >> 11) as f64 / (1_u64 << 53) as f64; + let rank = cdf.partition_point(|&c| c < unit).min(KEYS - 1) as u64; + mix(rank ^ KEY_SEED) +} + +/// Keys are already scrambled 64-bit values, so the exact baseline hashes +/// them with the identity rather than SipHash. +#[derive(Default)] +struct KeyHasher(u64); +impl Hasher for KeyHasher { + fn finish(&self) -> u64 { + self.0 + } + fn write(&mut self, _: &[u8]) { + unreachable!("only u64 keys are hashed") + } + fn write_u64(&mut self, key: u64) { + self.0 = key; + } +} +type Counts = HashMap>; + +/// Largest counts first; ties by key so exact answers are deterministic. +fn top(counts: &Counts) -> Vec<(u64, u64)> { + let mut entries = counts.iter().map(|(k, c)| (*k, *c)).collect::>(); + entries.sort_unstable_by(|a, b| b.1.cmp(&a.1).then(a.0.cmp(&b.0))); + entries.truncate(K); + entries +} + +fn label(o: &Observation, name: &str) -> Result { + o.labels + .iter() + .find(|kv| kv.key == name) + .ok_or_else(|| format!("missing {name}"))? + .value + .parse() + .map_err(|e| format!("{name}: {e}")) +} + +fn counts_pdata(entries: &[(u64, u64)], total: usize, meta: Meta) -> Result { + let _cpu = profile::scope(Category::PdataCodec); + let envelopes = entries + .iter() + .map(|(key, count)| { + let mut env = meta.envelope(*count as f64); + env.labels.push(KeyValue::new("topk.key", key.to_string())); + env.labels + .push(KeyValue::new("bench.total", total.to_string())); + env + }) + .collect::>(); + encode_envelopes_to_pdata(&envelopes).map_err(|e| e.to_string()) +} + +fn sketch_pdata(sketch: &CMSHeapWrapper, count: usize, meta: Meta) -> Result { + use asap_precompute_rs::precompute::Sketch; + let _cpu = profile::scope(Category::PdataCodec); + let mut env: SketchEnvelope = meta.envelope(0.0); + env.sketch_type = SketchType::CountMinSketchWithHeap; + env.encoding = Encoding::Msgpack; + env.payload = { + let _cpu = profile::scope(Category::SketchCodec); + sketch.snapshot().map_err(|e| e.to_string())? + }; + env.count = count as u64; + encode_envelopes_to_pdata(&[env]).map_err(|e| e.to_string()) +} + +fn decode_sketch(o: &Observation, count: usize) -> Result { + let _cpu = profile::scope(Category::SketchCodec); + let env = o.value.envelope.as_ref().ok_or("missing sketch envelope")?; + if env.count != count as u64 || env.sketch_type != SketchType::CountMinSketchWithHeap { + return Err("sketch count/type mismatch".into()); + } + CMSHeapWrapper::from_snapshot(&env.payload).map_err(|e| e.to_string()) +} + +fn sketch_top(sketch: &CMSHeapWrapper) -> Vec<(u64, u64)> { + sketch + .top_k(K) + .into_iter() + .map(|e| { + let key = u64::from_be_bytes(e.key.as_slice().try_into().expect("8-byte key")); + (key, e.count as u64) + }) + .collect() +} + +fn topk_pdata(results: &[(&str, Vec<(u64, u64)>)], meta: Meta) -> Result { + let _cpu = profile::scope(Category::PdataCodec); + let envelopes = results + .iter() + .flat_map(|(kind, entries)| { + entries.iter().enumerate().map(move |(rank, (key, count))| { + let mut env = meta.envelope(*count as f64); + env.metric_name = "http.server.request.topk".into(); + env.labels.push(KeyValue::new("topk.key", key.to_string())); + env.labels + .push(KeyValue::new("topk.rank", (rank + 1).to_string())); + env.labels.push(KeyValue::new("window_kind", *kind)); + env + }) + }) + .collect::>(); + encode_envelopes_to_pdata(&envelopes).map_err(|e| e.to_string()) +} + +struct Window { + /// Signals (branch) or entries (merge/estimate) received per source. + received: [usize; 3], + /// Entries expected per source, once its first chunk arrives. + total: [Option; 3], + counts: Counts, + sketch: Option, + started_ns: u64, +} +impl Window { + fn new(started_ns: u64) -> Self { + Self { + received: [0; 3], + total: [None; 3], + counts: Counts::default(), + sketch: None, + started_ns, + } + } +} + +pub struct Processor { + sketch: bool, + role: String, + points: usize, + batch: usize, + windows: BTreeMap, + next: [u64; 3], + rolling: usize, + count_history: VecDeque, + sketch_history: VecDeque, +} +impl Processor { + pub fn new(scenario: &str, role: &str, points: usize, batch: usize, rolling: usize) -> Self { + Self { + sketch: scenario == "cmsheap", + role: role.into(), + points, + batch, + windows: BTreeMap::new(), + next: [0; 3], + rolling, + count_history: VecDeque::new(), + sketch_history: VecDeque::new(), + } + } + + fn new_sketch() -> CMSHeapWrapper { + CMSHeapWrapper::new(CMS_ROWS, CMS_COLS, K) + } + + /// Branch input: the normalized corpus indices of one source. + pub fn process_normalized(&mut self, batch: NormalizedBatch) -> Result, String> { + let _cpu = profile::scope(Category::ProcessorBookkeeping); + let meta = batch.meta; + if self.role != "branch" || meta.source > 1 || meta.window != self.next[meta.source] { + return Err("duplicate or out-of-order window".into()); + } + let w = self + .windows + .entry(meta.window) + .or_insert_with(|| Window::new(meta.started_ns)); + if meta.offset != w.received[meta.source] || meta.offset + batch.count > self.points { + return Err("duplicate, missing, or overflowing batch".into()); + } + { + let _cpu = profile::scope(Category::Computation); + let keys = (0..batch.count as u64).map(|i| key(batch.first_index + i)); + if self.sketch { + let sketch = w.sketch.get_or_insert_with(Self::new_sketch); + keys.for_each(|k| sketch.update(&k.to_be_bytes(), 1)); + } else { + keys.for_each(|k| *w.counts.entry(k).or_default() += 1); + } + } + w.received[meta.source] += batch.count; + if w.received[meta.source] < self.points { + if self.windows.len() > MAX_PENDING as usize { + return Err("pending window bound exceeded".into()); + } + return Ok(vec![]); + } + self.next[meta.source] += 1; + let w = self.windows.remove(&meta.window).unwrap(); + let out = Meta { + offset: 0, + started_ns: w.started_ns, + ..meta + }; + self.emit(w, out, self.points) + } + + /// Ship a completed window: one sketch, or every count entry in chunks. + fn emit(&self, w: Window, meta: Meta, signals: usize) -> Result, String> { + if self.sketch { + return Ok(vec![sketch_pdata( + w.sketch.as_ref().unwrap(), + signals, + meta, + )?]); + } + let entries = w.counts.into_iter().collect::>(); + let total = entries.len(); + entries + .chunks(self.batch) + .enumerate() + .map(|(i, chunk)| { + counts_pdata( + chunk, + total, + Meta { + offset: i * self.batch, + ..meta + }, + ) + }) + .collect() + } + + /// Merge and estimate input. + pub fn process(&mut self, pdata: OtapPdata) -> Result, String> { + let _cpu = profile::scope(Category::ProcessorBookkeeping); + let obs = { + let _cpu = profile::scope(Category::PdataCodec); + decode_pdata_to_observations(pdata) + .map_err(|e| e.to_string())? + .observations + }; + let meta = Meta::read(obs.first().ok_or("empty batch")?)?; + let estimate = self.role == "estimate"; + if (estimate && meta.source != 2) || (!estimate && meta.source > 1) { + return Err("wrong source for role".into()); + } + if meta.window != self.next[meta.source] { + return Err("duplicate or out-of-order window".into()); + } + let signals = if estimate { + self.points * 2 + } else { + self.points + }; + let w = self + .windows + .entry(meta.window) + .or_insert_with(|| Window::new(meta.started_ns)); + w.started_ns = w.started_ns.min(meta.started_ns); + if meta.offset != w.received[meta.source] { + return Err("duplicate or missing batch".into()); + } + let _cpu = profile::scope(Category::Computation); + if self.sketch { + if obs.len() != 1 { + return Err("expected one sketch".into()); + } + let decoded = decode_sketch(&obs[0], signals)?; + match &mut w.sketch { + Some(sketch) => sketch.merge_from(&decoded).map_err(|e| e.to_string())?, + None => w.sketch = Some(decoded), + } + w.received[meta.source] = 1; + w.total[meta.source] = Some(1); + } else { + let total = label(&obs[0], "bench.total")? as usize; + if *w.total[meta.source].get_or_insert(total) != total + || w.received[meta.source] + obs.len() > total + { + return Err("count entry overflow".into()); + } + for o in &obs { + *w.counts.entry(label(o, "topk.key")?).or_default() += o.value.float as u64; + } + w.received[meta.source] += obs.len(); + } + let done = |s: usize| w.total[s] == Some(w.received[s]); + if done(meta.source) { + self.next[meta.source] += 1; + } + let complete = if estimate { + done(2) + } else { + done(0) && done(1) + }; + if !complete { + if self.windows.len() > MAX_PENDING as usize { + return Err("pending window bound exceeded".into()); + } + return Ok(vec![]); + } + let w = self.windows.remove(&meta.window).unwrap(); + let out = Meta { + source: 2, + offset: 0, + started_ns: w.started_ns, + ..meta + }; + if !estimate { + return self.emit(w, out, self.points * 2); + } + let mut results = vec![("tumbling", Vec::new())]; + if self.sketch { + let sketch = w.sketch.unwrap(); + results[0].1 = sketch_top(&sketch); + if self.rolling > 1 { + self.sketch_history.push_back(sketch); + if self.sketch_history.len() > self.rolling { + self.sketch_history.pop_front(); + } + let mut merged = Self::new_sketch(); + for s in &self.sketch_history { + merged.merge_from(s).map_err(|e| e.to_string())?; + } + results.push(("rolling", sketch_top(&merged))); + } + } else { + results[0].1 = top(&w.counts); + if self.rolling > 1 { + self.count_history.push_back(w.counts); + if self.count_history.len() > self.rolling { + self.count_history.pop_front(); + } + let mut merged = Counts::default(); + for counts in &self.count_history { + for (k, c) in counts { + *merged.entry(*k).or_default() += c; + } + } + results.push(("rolling", top(&merged))); + } + } + Ok(vec![topk_pdata(&results, out)?]) + } +} + +/// One reported top-k entry and its exact count, for dashboards. +#[derive(Serialize, Clone, Debug, Default)] +pub struct TopkPoint { + pub window_kind: String, + pub rank: usize, + pub key: String, + pub estimate: f64, + pub exact: f64, +} +/// Accuracy of one window's answer against the exact top-k. +#[derive(Serialize, Clone, Debug, Default)] +pub struct TopkAccuracy { + pub window_kind: String, + pub recall: f64, + pub mean_relative_error: f64, +} + +pub struct Backend { + sketch: bool, + rolling: usize, + /// Exact per-key counts of one window; every window replays the corpus. + counts: Counts, + reference: Vec<(u64, u64)>, + next: u64, + pub latest: Vec, + pub accuracy: Vec, +} +impl Backend { + pub fn new(scenario: &str, points: usize, rolling: usize) -> Self { + let mut counts = Counts::default(); + for index in 1..=points as u64 * 2 { + *counts.entry(key(index)).or_default() += 1; + } + Self { + sketch: scenario == "cmsheap", + rolling, + reference: top(&counts), + counts, + next: 0, + latest: Vec::new(), + accuracy: Vec::new(), + } + } + + /// Validate one window's answers; returns the window id and start time. + pub fn receive(&mut self, obs: &[Observation]) -> Result<(u64, u64), String> { + let meta = Meta::read(obs.first().ok_or("empty backend batch")?)?; + let mut kinds = vec![("tumbling", 1)]; + if self.rolling > 1 { + kinds.push(("rolling", (meta.window as usize + 1).min(self.rolling))); + } + if meta.window != self.next || meta.source != 2 || obs.len() != kinds.len() * K { + return Err("top-k window missing/duplicated".into()); + } + let (mut latest, mut accuracy) = (Vec::new(), Vec::new()); + for (kind, copies) in kinds { + let mut answer = obs + .iter() + .filter(|o| { + o.labels + .iter() + .any(|kv| kv.key == "window_kind" && kv.value == kind) + }) + .map(|o| Ok((label(o, "topk.rank")?, label(o, "topk.key")?, o.value.float))) + .collect::, String>>()?; + answer.sort_by_key(|(rank, _, _)| *rank); + if answer.len() != K { + return Err(format!("{kind}: expected {K} entries")); + } + let exact = + |key: u64| (self.counts.get(&key).copied().unwrap_or(0) * copies as u64) as f64; + let found = |key: u64| answer.iter().find(|(_, k, _)| *k == key).map(|e| e.2); + let hits = self + .reference + .iter() + .filter(|(k, _)| found(*k).is_some()) + .count(); + let recall = hits as f64 / K as f64; + let error = self + .reference + .iter() + .map(|(k, _)| (found(*k).unwrap_or(0.0) - exact(*k)).abs() / exact(*k)) + .sum::() + / K as f64; + let expected = self + .reference + .iter() + .map(|(k, c)| (*k, (c * copies as u64) as f64)) + .collect::>(); + let actual = answer.iter().map(|(_, k, c)| (*k, *c)).collect::>(); + if (!self.sketch && actual != expected) || recall < MIN_RECALL { + return Err(format!( + "{kind}: recall {recall}, answer {actual:?} != {expected:?}" + )); + } + for (rank, k, c) in &answer { + latest.push(TopkPoint { + window_kind: kind.into(), + rank: *rank as usize, + key: format!("{k:016x}"), + estimate: *c, + exact: exact(*k), + }); + } + accuracy.push(TopkAccuracy { + window_kind: kind.into(), + recall, + mean_relative_error: error, + }); + } + self.latest = latest; + self.accuracy = accuracy; + self.next += 1; + Ok((meta.window, meta.started_ns)) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use asap_precompute_rs::otap::codec::decode_pdata_to_observations; + + fn exercise(scenario: &str, rolling: usize) -> Backend { + let (n, batch) = (4096, 300); + let mut branches = [0, 1].map(|_| Processor::new(scenario, "branch", n, batch, rolling)); + let mut merge = Processor::new(scenario, "merge", n, batch, rolling); + let mut estimate = Processor::new(scenario, "estimate", n, batch, rolling); + let mut backend = Backend::new(scenario, n, rolling); + let mut completed = 0; + for window in 0..3 { + for offset in (0..n).step_by(batch) { + for (source, branch) in branches.iter_mut().enumerate() { + let input = NormalizedBatch { + first_index: (source * n + offset + 1) as u64, + count: (offset + batch).min(n) - offset, + meta: Meta { + window, + source, + offset, + started_ns: 1, + }, + }; + for a in branch.process_normalized(input).unwrap() { + for m in merge.process(a).unwrap() { + for e in estimate.process(m).unwrap() { + let obs = decode_pdata_to_observations(e).unwrap().observations; + assert_eq!(backend.receive(&obs).unwrap().0, completed); + completed += 1; + } + } + } + } + } + } + assert_eq!(completed, 3); + backend + } + + #[test] + fn exact_top_k_matches_reference() { + let backend = exercise("topk-exact", 2); + assert!(backend + .accuracy + .iter() + .all(|a| a.recall == 1.0 && a.mean_relative_error == 0.0)); + assert_eq!(backend.latest.len(), 2 * K); + } + + #[test] + fn sketch_top_k_meets_recall_bound() { + let backend = exercise("cmsheap", 2); + assert!(backend.accuracy.iter().all(|a| a.recall >= MIN_RECALL)); + } + + #[test] + fn keys_are_heavy_tailed() { + let mut counts = Counts::default(); + (1..=100_000).for_each(|i| *counts.entry(key(i)).or_default() += 1); + let heaviest = top(&counts)[0].1; + assert!( + heaviest > 5_000 && counts.len() > 10_000, + "{heaviest} {}", + counts.len() + ); + } +} diff --git a/benchmarks/run-streaming.py b/benchmarks/run-streaming.py index e563a31..802f75b 100755 --- a/benchmarks/run-streaming.py +++ b/benchmarks/run-streaming.py @@ -23,7 +23,7 @@ ROLES = ("generator_a", "generator_b", "branch_a", "branch_b", "merge", "estimate", "backend") PROCESSOR_ROLES = ("branch_a", "branch_b", "merge", "estimate") -SCENARIOS = ("raw", "exact", "kll") +SCENARIOS = ("raw", "exact", "kll", "topk-exact", "cmsheap") HTTP = urllib.request.build_opener(urllib.request.ProxyHandler({})) @@ -375,6 +375,12 @@ def backlog(s): "generated_signals_after_drain": drained["backend"]["stats"]["completed_windows"] * self.window_points * 2, "validated_signals_after_drain": drained["backend"]["stats"]["completed_windows"] * self.window_points * 2, "correctness": "passed", "resources": resources} + # Top-k answers are validated per window (exact must match, recall@k >= 0.9); + # report the last window's accuracy. + for accuracy in after["backend"]["stats"].get("topk_accuracy", []): + if accuracy["window_kind"] == "tumbling": + report["recall_at_k"] = accuracy["recall"] + report["mean_relative_count_error"] = accuracy["mean_relative_error"] if accounted: inputs = drained["backend"]["stats"]["received_signals"] - cpu_before["backend"]["stats"]["received_signals"] cpu_profile = {} @@ -415,7 +421,7 @@ def close(self): def draw_summary(rows, path): - colors = {"raw": "#64748b", "exact": "#dc2626", "kll": "#2563eb"} + colors = {"raw": "#64748b", "exact": "#dc2626", "kll": "#2563eb", "topk-exact": "#b45309", "cmsheap": "#059669"} maximum = max(r["median_signals_per_second"] for r in rows) height = 100 + len(rows) * 55 svg = [f'', @@ -504,6 +510,15 @@ def gauge(name, labels, value): gauge("asap_demo_reference", labels, point["reference"]) gauge("asap_demo_relative_error", labels, abs(point["value"] - point["reference"]) / abs(point["reference"]) if point["reference"] else 0) + for point in after["backend"]["stats"].get("latest_topk", []): + labels = {"scenario": scenario, "window_kind": point["window_kind"], + "rank": point["rank"], "key": point["key"]} + gauge("asap_demo_topk_estimate", labels, point["estimate"]) + gauge("asap_demo_topk_exact", labels, point["exact"]) + for accuracy in after["backend"]["stats"].get("topk_accuracy", []): + labels = {"scenario": scenario, "window_kind": accuracy["window_kind"]} + gauge("asap_demo_topk_recall", labels, accuracy["recall"]) + gauge("asap_demo_topk_mean_relative_error", labels, accuracy["mean_relative_error"]) return "\n".join(lines) + "\n" @@ -650,6 +665,10 @@ def main(): "min_signals_per_second": min(s["signals_per_second"] for s in samples), "max_signals_per_second": max(s["signals_per_second"] for s in samples), "median_window_latency_p99_ms": statistics.median(s["window_latency_p99_ms"] for s in samples)}) + if all("recall_at_k" in s for s in samples): + rows[-1]["min_recall_at_k"] = min(s["recall_at_k"] for s in samples) + rows[-1]["median_mean_relative_count_error"] = statistics.median( + s["mean_relative_count_error"] for s in samples) latency_limit_ms = max( args.sustainable_max_p99_ms, 2000 * window_points / traffic_rate, @@ -711,7 +730,7 @@ def main(): writer.writerows(capacities) (args.output / "summary.json").write_text(json.dumps(rows, indent=2) + "\n") with (args.output / "summary.csv").open("w", newline="") as f: - writer = csv.DictWriter(f, fieldnames=list(rows[0])) + writer = csv.DictWriter(f, fieldnames=list(dict.fromkeys(k for row in rows for k in row)), restval="") writer.writeheader() writer.writerows(rows) diff --git a/demos/kll-grafana/grafana/dashboards/topk-stream.json b/demos/kll-grafana/grafana/dashboards/topk-stream.json new file mode 100644 index 0000000..d6dc233 --- /dev/null +++ b/demos/kll-grafana/grafana/dashboards/topk-stream.json @@ -0,0 +1,301 @@ +{ + "uid": "asap-topk-stream", + "title": "ASAP CMS + heap vs exact top-k: multi-process streaming", + "schemaVersion": 39, + "version": 1, + "refresh": "5s", + "time": { + "from": "now-15m", + "to": "now" + }, + "panels": [ + { + "id": 1, + "type": "timeseries", + "title": "Backend-validated throughput", + "datasource": { + "type": "prometheus", + "uid": "asap-prometheus" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "targets": [ + { + "refId": "A", + "expr": "asap_demo_validated_signals_per_second{scenario=~\"topk-exact|cmsheap\"}", + "legendFormat": "{{scenario}}" + } + ], + "fieldConfig": { + "defaults": { + "unit": "short" + }, + "overrides": [] + } + }, + { + "id": 2, + "type": "bargauge", + "title": "Processor CPU-seconds per million signals (branches + merge + estimate)", + "datasource": { + "type": "prometheus", + "uid": "asap-prometheus" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "targets": [ + { + "refId": "A", + "expr": "asap_demo_processor_cpu_seconds_per_million_signals{scenario=~\"topk-exact|cmsheap\"}", + "legendFormat": "{{scenario}}", + "instant": true + } + ], + "fieldConfig": { + "defaults": { + "decimals": 2 + }, + "overrides": [] + }, + "options": { + "orientation": "horizontal", + "displayMode": "basic", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + } + } + }, + { + "id": 3, + "type": "timeseries", + "title": "CPU cores per pinned processor", + "datasource": { + "type": "prometheus", + "uid": "asap-prometheus" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "targets": [ + { + "refId": "A", + "expr": "asap_demo_cpu_cores{scenario=~\"topk-exact|cmsheap\",component=~\"branch_a|branch_b|merge|estimate\"}", + "legendFormat": "{{scenario}} {{component}}" + } + ], + "fieldConfig": { + "defaults": { + "unit": "short" + }, + "overrides": [] + } + }, + { + "id": 4, + "type": "timeseries", + "title": "Data-network egress per process", + "datasource": { + "type": "prometheus", + "uid": "asap-prometheus" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "targets": [ + { + "refId": "A", + "expr": "asap_demo_data_tx_mbit_per_second{scenario=~\"topk-exact|cmsheap\",component=~\"branch_a|branch_b|merge|estimate\"}", + "legendFormat": "{{scenario}} {{component}}" + } + ], + "fieldConfig": { + "defaults": { + "unit": "Mbits" + }, + "overrides": [] + } + }, + { + "id": 5, + "type": "bargauge", + "title": "Top-10 keys, latest window: CMS + heap estimate", + "datasource": { + "type": "prometheus", + "uid": "asap-prometheus" + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 16 + }, + "targets": [ + { + "refId": "A", + "expr": "asap_demo_topk_estimate{scenario=\"cmsheap\",window_kind=\"tumbling\"}", + "legendFormat": "#{{rank}} {{key}}", + "instant": true + } + ], + "fieldConfig": { + "defaults": { + "decimals": 0 + }, + "overrides": [] + }, + "options": { + "orientation": "horizontal", + "displayMode": "basic", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + } + } + }, + { + "id": 6, + "type": "bargauge", + "title": "Top-10 keys, latest window: exact counts", + "datasource": { + "type": "prometheus", + "uid": "asap-prometheus" + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 16 + }, + "targets": [ + { + "refId": "A", + "expr": "asap_demo_topk_estimate{scenario=\"topk-exact\",window_kind=\"tumbling\"}", + "legendFormat": "#{{rank}} {{key}}", + "instant": true + } + ], + "fieldConfig": { + "defaults": { + "decimals": 0 + }, + "overrides": [] + }, + "options": { + "orientation": "horizontal", + "displayMode": "basic", + "reduceOptions": { + "calcs": [ + "lastNotNull" + ], + "fields": "", + "values": false + } + } + }, + { + "id": 7, + "type": "timeseries", + "title": "Recall@10 vs exact", + "datasource": { + "type": "prometheus", + "uid": "asap-prometheus" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 26 + }, + "targets": [ + { + "refId": "A", + "expr": "asap_demo_topk_recall", + "legendFormat": "{{scenario}} {{window_kind}}" + } + ], + "fieldConfig": { + "defaults": { + "unit": "percentunit" + }, + "overrides": [] + } + }, + { + "id": 8, + "type": "timeseries", + "title": "Mean relative count error over the true top-10", + "datasource": { + "type": "prometheus", + "uid": "asap-prometheus" + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 26 + }, + "targets": [ + { + "refId": "A", + "expr": "asap_demo_topk_mean_relative_error", + "legendFormat": "{{scenario}} {{window_kind}}" + } + ], + "fieldConfig": { + "defaults": { + "unit": "percentunit" + }, + "overrides": [] + } + }, + { + "id": 9, + "type": "timeseries", + "title": "Resident memory per process", + "datasource": { + "type": "prometheus", + "uid": "asap-prometheus" + }, + "gridPos": { + "h": 8, + "w": 24, + "x": 0, + "y": 34 + }, + "targets": [ + { + "refId": "A", + "expr": "asap_demo_rss_mib{scenario=~\"topk-exact|cmsheap\",component=~\"branch_a|branch_b|merge|estimate\"}", + "legendFormat": "{{scenario}} {{component}}" + } + ], + "fieldConfig": { + "defaults": { + "unit": "decmbytes" + }, + "overrides": [] + } + } + ] +} diff --git a/demos/kll-grafana/verify-streaming.py b/demos/kll-grafana/verify-streaming.py index 2940c2f..fdb016e 100644 --- a/demos/kll-grafana/verify-streaming.py +++ b/demos/kll-grafana/verify-streaming.py @@ -39,8 +39,11 @@ def main(): parser.add_argument('--docker-command', default='docker') parser.add_argument('--scenarios', nargs='+', default=['exact', 'kll']) parser.add_argument('--tolerance', type=float, default=0.05, - help='maximum relative error for sketch scenarios') + help='maximum relative (count) error for sketch scenarios') args, extra = parser.parse_known_args() + topk = set(args.scenarios) <= {'topk-exact', 'cmsheap'} + rolling_metric = ('asap_demo_topk_recall{window_kind="rolling"}' if topk + else 'asap_demo_estimate{window_kind="rolling"}') demo = subprocess.Popen([ sys.executable, str(REPO / 'benchmarks/run-streaming.py'), '--demo', '--docker-command', args.docker_command, '--output', str(REPO / 'benchmark-results/demo-verify'), @@ -52,7 +55,7 @@ def main(): assert demo.poll() is None, 'demo exited before metrics were verified' assert time.monotonic() < deadline, 'demo metrics did not appear' windows = values(args.prometheus, 'asap_demo_completed_windows', ['scenario']) - rolling = values(args.prometheus, 'asap_demo_estimate{window_kind="rolling"}', ['scenario']) + rolling = values(args.prometheus, rolling_metric, ['scenario']) if all(windows.get((s,), 0) >= 4 for s in args.scenarios) and len(rolling) == len(args.scenarios): break time.sleep(2) @@ -60,17 +63,27 @@ def main(): assert all(throughput[(s,)] > 0 for s in args.scenarios), throughput cpu = values(args.prometheus, 'asap_demo_cpu_cores', ['scenario', 'component']) assert all((s, c) in cpu for s in args.scenarios for c in PROCESSORS), cpu - errors = values(args.prometheus, 'asap_demo_relative_error', - ['scenario', 'window_kind', 'quantile']) - assert {(s, k, q) for s in args.scenarios for k in ('tumbling', 'rolling') - for q in ('0.5', '0.99')} <= set(errors), errors - for (scenario, _, _), error in errors.items(): - assert error <= (0.0 if scenario == 'exact' else args.tolerance), errors - expression = 'asap_demo_estimate' - keys = ['scenario', 'window_kind', 'quantile'] + if topk: + errors = values(args.prometheus, 'asap_demo_topk_mean_relative_error', + ['scenario', 'window_kind']) + recall = values(args.prometheus, 'asap_demo_topk_recall', ['scenario', 'window_kind']) + assert {(s, k) for s in args.scenarios for k in ('tumbling', 'rolling')} <= set(recall) + assert all(r == 1.0 for (s, _), r in recall.items() if s == 'topk-exact'), recall + assert all(r >= 0.9 for r in recall.values()), recall + print('recall@10:', {'/'.join(k): v for k, v in sorted(recall.items())}) + expression, keys = 'asap_demo_topk_estimate', ['scenario', 'window_kind', 'rank'] + else: + errors = values(args.prometheus, 'asap_demo_relative_error', + ['scenario', 'window_kind', 'quantile']) + assert {(s, k, q) for s in args.scenarios for k in ('tumbling', 'rolling') + for q in ('0.5', '0.99')} <= set(errors), errors + expression, keys = 'asap_demo_estimate', ['scenario', 'window_kind', 'quantile'] + for key, error in errors.items(): + assert error <= (0.0 if key[0] in ('exact', 'topk-exact') else args.tolerance), errors assert set(values(args.prometheus, expression, keys)) == set( values(args.grafana, expression, keys, grafana=True)) - with urllib.request.urlopen(args.grafana.rstrip('/') + '/api/dashboards/uid/asap-kll-stream', + uid = 'asap-topk-stream' if topk else 'asap-kll-stream' + with urllib.request.urlopen(args.grafana.rstrip('/') + '/api/dashboards/uid/' + uid, timeout=10) as response: dashboard = json.load(response)['dashboard'] assert any('asap_demo_validated_signals_per_second' in t['expr'] From ba8f00259fe0cb3c37751e5c70cbc87fcd407ebb Mon Sep 17 00:00:00 2001 From: Zeying Zhu <50204836+zzylol@users.noreply.github.com> Date: Mon, 12 Oct 2026 15:35:16 +0000 Subject: [PATCH 5/7] Document the CMS-with-heap top-k demo and benchmark scenarios --- benchmarks/STREAMING.md | 8 ++++++ docs/topk-demo.md | 64 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 docs/topk-demo.md diff --git a/benchmarks/STREAMING.md b/benchmarks/STREAMING.md index 059e266..0abd87f 100644 --- a/benchmarks/STREAMING.md +++ b/benchmarks/STREAMING.md @@ -44,6 +44,14 @@ wall-clock rotation, late-event handling, or window-watermark policies. Msgpack sketch per source/window, merges them, then returns p50/p99. - Backend validates every quantile result. Exact must match; KLL tolerance is `max(abs(reference) * 0.05, 0.001)`. This is value error, not rank error. +- Top-k scenarios use 64-bit keys drawn from Zipf(s=1.1) over + 2^20 ranks instead of durations. `topk-exact` counts keys per window in a + hash map, ships every (key, count) entry in bounded batches, sums the maps, + then returns the top 10. `cmsheap` updates a Count-Min sketch (4 x 2048) + with a 10-slot heavy-hitter heap, sends one ASAPv1 sketch per source/window, + merges sketches, then returns the heap's top 10. The backend requires exact + answers from `topk-exact` and recall@10 >= 0.9 from `cmsheap` in every + window, and reports recall and mean relative count error over the true top 10. The official generator emits generic synthetic metrics. Each branch maps the received item count to the deterministic long-tail HTTP-duration corpus used by diff --git a/docs/topk-demo.md b/docs/topk-demo.md new file mode 100644 index 0000000..c87ace9 --- /dev/null +++ b/docs/topk-demo.md @@ -0,0 +1,64 @@ +# Top-k heavy hitters: Count-Min sketch with heap vs exact counting + +The top-k demo runs the same multi-process topology as the +[KLL demo](./kll-windows.md): every processor is its own OS process in its own +container, pinned to one CPU, and every hop is OTLP/HTTP over TCP. Two +pipelines run side by side on identical keyed traffic: + +```mermaid +flowchart LR + G["generators A/B
Zipf(1.1) keys"] --> B["branch A/B
1 CPU each"] + B -->|"cmsheap: one ASAPv1 sketch
topk-exact: every (key, count)"| M["merge
1 CPU"] + M --> E["estimate
1 CPU
top 10 (tumbling + rolling)"] + E --> V["validating backend
recall@10, count error"] +``` + +- **`cmsheap`**: each branch inserts every key into a + [`CMSHeapWrapper`](../asap-precompute-rs/src/sketches/cms_heap.rs), which + wraps `asap_sketchlib::CMSHeap`: a 4 x 2048 Count-Min sketch plus a 10-slot + heavy-hitter heap. One ASAPv1 envelope (`CountMinSketchWithHeap`, kind + `0x03 0x00`) per source and window goes to merge. Merge adds the counters + and re-ranks both heaps' candidates on the merged counters; estimate reads + the top 10 from the heap. +- **`topk-exact`**: each branch counts keys in a hash map and ships every + (key, count) entry; merge sums the maps; estimate sorts them for the top 10. + +Keys are 64-bit values drawn from Zipf(s=1.1) over 2^20 ranks, deterministic +per corpus index, with disjoint index ranges per source. A 65,536-key window +has about 17,000 distinct keys per source and 30,000 after merging both. Every window replays the same +corpus, so the backend compares each answer with the exact top 10 computed +once at startup: `topk-exact` must match exactly, and `cmsheap` must reach +recall@10 of at least 0.9 in every window, or the run fails. With +`--rolling-windows N`, estimate also answers over the last N windows by +merging sketches or summing maps. + +## Run + +Linux with Docker and Docker Compose. From the repository root: + +```sh +demos/kll-grafana/run-demo.sh --scenarios topk-exact cmsheap # Ctrl+C stops +``` + +Open . The dashboard shows +backend-validated throughput, processor CPU-seconds per million signals, +per-process CPU, egress and memory, both pipelines' current top 10 with +counts, recall@10, and mean relative count error over the true top 10. + +![CMS with heap vs exact top-k dashboard](images/topk-streaming-grafana.png) + +Verify the demo end to end (60 seconds): + +```sh +python3 demos/kll-grafana/verify-streaming.py --scenarios topk-exact cmsheap +``` + +Benchmark sweep (see [STREAMING.md](../benchmarks/STREAMING.md)): + +```sh +python3 benchmarks/run-streaming.py --scenarios raw topk-exact cmsheap \ + --window-points 65536 --repetitions 3 +``` + +`summary.csv` adds `min_recall_at_k` and `median_mean_relative_count_error` +for top-k rows. From 6d2b9e9093961218080230e78e56335233c5f9fc Mon Sep 17 00:00:00 2001 From: Zeying Zhu <50204836+zzylol@users.noreply.github.com> Date: Mon, 12 Oct 2026 15:44:10 +0000 Subject: [PATCH 6/7] Add top-k dashboard screenshot; pin throughput and recall axes --- .../grafana/dashboards/topk-stream.json | 7 +++++-- docs/images/topk-streaming-grafana.png | Bin 0 -> 157099 bytes 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 docs/images/topk-streaming-grafana.png diff --git a/demos/kll-grafana/grafana/dashboards/topk-stream.json b/demos/kll-grafana/grafana/dashboards/topk-stream.json index d6dc233..d7480e7 100644 --- a/demos/kll-grafana/grafana/dashboards/topk-stream.json +++ b/demos/kll-grafana/grafana/dashboards/topk-stream.json @@ -32,7 +32,8 @@ ], "fieldConfig": { "defaults": { - "unit": "short" + "unit": "short", + "min": 0 }, "overrides": [] } @@ -236,7 +237,9 @@ ], "fieldConfig": { "defaults": { - "unit": "percentunit" + "unit": "percentunit", + "min": 0, + "max": 1 }, "overrides": [] } diff --git a/docs/images/topk-streaming-grafana.png b/docs/images/topk-streaming-grafana.png new file mode 100644 index 0000000000000000000000000000000000000000..b6893c6091c77a0ac7aca70827c7bcf997595ccb GIT binary patch literal 157099 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

PwJ$6v|HkF3p+Tb!mh3**sc1bK)fiduf`ES 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 +FoO5b1Ia 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

CW~B;xO=e&2+_hU@FWe96bz>^ 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 literal 0 HcmV?d00001 From fb6fa0feaf25e91eaf0eb168bd34851ad669b1ba Mon Sep 17 00:00:00 2001 From: Zeying Zhu <50204836+zzylol@users.noreply.github.com> Date: Mon, 12 Oct 2026 16:55:08 +0000 Subject: [PATCH 7/7] Add top-k benchmark results from a 56-core x86 server sweep --- docs/images/topk-streaming-throughput.png | Bin 0 -> 90374 bytes docs/topk-demo.md | 44 ++++++++++++++++++++++ 2 files changed, 44 insertions(+) create mode 100644 docs/images/topk-streaming-throughput.png diff --git a/docs/images/topk-streaming-throughput.png b/docs/images/topk-streaming-throughput.png new file mode 100644 index 0000000000000000000000000000000000000000..54aaf9bc5ed397616b78c137e0bc2476599c4a71 GIT binary patch literal 90374 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 I8oY7W-*w_~6#xJL literal 0 HcmV?d00001 diff --git a/docs/topk-demo.md b/docs/topk-demo.md index c87ace9..98e2144 100644 --- a/docs/topk-demo.md +++ b/docs/topk-demo.md @@ -47,6 +47,50 @@ counts, recall@10, and mean relative count error over the true top 10. ![CMS with heap vs exact top-k dashboard](images/topk-streaming-grafana.png) +*56-core x86 server, 50,000 signals/s per source. Both pipelines keep up; +CMS + heap uses 1.7 processor CPU-seconds per million signals, exact 13.0, +and its top 10 matches the exact keys and order with counts within 0.6%.* + +## Benchmark results + +`benchmarks/run-streaming.py --scenarios raw topk-exact cmsheap +--window-points 65536 --repetitions 3` on a 56-core x86 server, four generator CPUs per source and one dedicated CPU +per processor. Median backend-validated signals/s over three runs (both +sources combined): + +| Offered | Raw | Exact top-k | CMS + heap | +| ---: | ---: | ---: | ---: | +| 20,000 | 21,813 | 21,813 | 21,813 | +| 50,000 | 47,988 | 52,348 | 47,989 | +| 100,000 | 100,327 | 100,336 | 100,335 | +| 200,000 | 196,309 | 148,316 | 200,675 | +| 400,000 | 274,848 | 130,879 | 397,004 | +| 600,000 | 279,185 | 130,860 | 597,659 | +| 800,000 | 283,555 | 126,516 | 798,355 | + +(Short runs round to whole windows, so low-rate rows can exceed the offer.) + +![Validated throughput vs offered load](images/topk-streaming-throughput.png) + +By the [capacity criteria](../benchmarks/CAPACITY_DESIGN.md), the largest +sustainable offered rate per source is 50,000 for exact top-k, 100,000 for +raw, and at least 400,000 (the highest tested) for CMS + heap. Exact top-k +plateaus near 130,000 signals/s; raw forwarding near 280,000. + +Summed over branch A, branch B, merge and estimate, at the same offered load: + +| Offered per source | Exact CPU | CMS + heap CPU | Exact egress | CMS + heap egress | +| ---: | ---: | ---: | ---: | ---: | +| 10,000 | 0.29 cores | 0.039 cores | 43.9 Mbit/s | 0.1 Mbit/s | +| 25,000 | 0.66 cores | 0.084 cores | 102.9 Mbit/s | 0.3 Mbit/s | +| 50,000 | 1.29 cores | 0.165 cores | 201.1 Mbit/s | 0.5 Mbit/s | + +Accuracy, checked by the backend in every window of every run: exact top-k +matched exactly; CMS + heap had **recall@10 = 1.0** (same ten keys, same +order) and a **0.62% mean relative count error** over the true top 10, in +tumbling windows. Count-Min only overestimates, so every reported count is +at or above the true count. + Verify the demo end to end (60 seconds): ```sh