bench(results): re-measure the in-process and redis legs on mains, add batch ceilings to the README - #199
Conversation
…sured on mains Re-measure in-process and Redis on the pinned matrix and regenerate the charts. Both passes ran 2026-09-11 on the document's host and toolchain, one at a time, with Low Power Mode off; the other four legs are untouched. in-process: the published leg predated the 32 GiB drain byte cap, so its 64 KiB drain corpus was 49 152 and all eleven 64 KiB drain rows were setup_bound and withheld. At 524 288 all twelve publish with windows of 3.4 to 9.1 s, the 1 KiB leg sits on the pinned 6 000 000 corpus, and the one failure (consume_batch 64 KiB 8c consumed before assembly) is gone. 167 rows, no failures. The twelve 64 B fills run 9.8 to 10.7 s in execution order. redis: the published leg predated the 1 s acked-entry trim cadence and the direct consumer honouring concurrent_processing. Its nine failures, all 64 KiB offered-load rungs refused with XADD OOM, do not recur, and the 64 KiB ladder carries 24 rows against 15. The consume_parallel drains rise 10 to 25x at 64 B and 1 KiB and now sit level with consumer_group on the same primitive; every other cell, publish included, rises a near-uniform 26 to 45 percent while the 64 B fill drops from 89 s to 64 s, the host speed signature the runbook records for Low Power Mode. The twelve 64 B fills run 63.8 to 68.9 s in execution order. 156 rows, no failures; the consume_batch 64 KiB 8c drain is newly setup_bound at a 0.9 s window over the byte-capped 49 152 corpus.
One table under Performance: the batch flow's best published drain cell per backend and payload, its consumer count, and the ratio to the parallel consumer at the same cell, all read off the committed document.
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
shove-docs | efeaf43 | Commit Preview URL Branch Preview URL |
Sep 11 2026, 11:45 AM |
Reviewed against the document: the table reproduces, one prose bound does notI recomputed all eighteen cells of the README table from The
|
| backend | 1c | 2c | 4c | 8c | max |
|---|---|---|---|---|---|
| in-process | 0.542 | 0.689 | 0.891 | 1.135 | 1.135 |
| Kafka | — | 1.030 | — | — | 1.030 |
| NATS | 1.109 | 1.131 | 1.121 | 1.186 | 1.186 |
| RabbitMQ | 1.464 | 1.260 | 1.341 | — | 1.464 |
| Redis | 1.169 | 0.755 | 1.013 | — | 1.169 |
| SQS | 1.152 | 1.054 | 1.030 | 1.147 | 1.152 |
Rounded outward, the true bound is at most 1.5x. Suggested edit: at 64 KiB the batch flow is at most 1.5x the parallel one on every backend. (Dashes are cells where one side of the pair is setup_bound or absent, so the ratio isn't published.)
Two smaller things
- SQS's comparator isn't
consume_parallel. SQS has no such rows — its flows areconsume_batch,consume_fifo,dlq_drain,publish_*andsupervisor. The 1.1x / 2.5x / 1.1x figures are batch oversupervisor, which is the right comparator (ConsumerSupervisoris SQS's parallel-consume analogue) but not "the plain parallel consumer". One clause would fix it. - Failure count. The body says the document carries 3 failures; it carries 2 — NATS
broadcast64 KiB 8c and RabbitMQconsume_parallel64 KiB 8c. The in-process one is gone, which I think is what the arrow meant.
What I confirmed independently
- In-process: 167 rows,
failures[]empty, all twelve 64 KiB drainsframeworkat corpus 524 288, windows 3.39-9.09 s. The batch 64 KiB 8c cell assembles at 30 500 of 524 288. - Redis: 156 rows,
failures[]empty, noXADD ... OOManywhere. - The other four legs: no key or value changed; the only diff is float re-serialisation, as you said.
- The in-process fills support the corpus explanation rather than a host-speed one: 64 B fills are 9.7-13.9 s before and 9.8-10.7 s after, so that leg's host state is comparable and the 64 KiB rate drop is the larger corpus. (Your Low Power Mode reading of the redis leg is a separate argument and I'm not disputing it.)
The prose re-derivation you left me is in #200, which stacks on this branch. It supersedes #197 — I couldn't rebase #197 in place because the runner blocks force-push, so #200 carries its two commits unchanged and #197 should be closed rather than merged.
main squash-merged #199, so this branch's copies of its two commits are now duplicates. The only conflict is the batching paragraph in performance.mdx, where main carries the pre-re-derivation text and this branch carries the version derived from the re-measured leg; the merge keeps the latter.
Re-measures the two published legs that predated harness fixes, regenerates every chart, and adds the batch consume ceilings to the README. Two commits, one per concern.
Why these two legs
setup_boundand the charts withheld every one: the fastest backend in the set published no 64 KiB consume rate.benches/README.mdalready described the 32 GiB cap as if the published leg carried it.concurrent_processing(fix(redis): honour concurrent_processing on a direct consumer's run #187). Its nine failures were all 64 KiB offered-load rungs refused withXADD ... OOM, and itsconsume_paralleldrains ran one message at a time.Kafka is deliberately not re-measured: its seven withheld 64 KiB rows sit at corpus 49 152 under the containerised 3 GiB cap, so a rerun reproduces them. RabbitMQ, NATS and SQS are untouched; their rows are byte-identical apart from last-digit float re-serialisation by the merge (worst relative difference 2e-16, no key or value changed).
Provenance
Both passes ran on 2026-09-11 on the document's own host and toolchain (Apple M4 Max 16c / 64 GB, macOS 26.6.2, rustc 1.91.1, shove 0.14.0), through
scripts/bench.sh <backend>with no flags, one at a time, on mains with Low Power Mode off (the script's own gate). Logs:target/bench-logs/inmemory-20260911T072238Z.logandtarget/bench-logs/redis-20260911T075353Z.log.What changed in the document
in-process. 64 KiB drain corpus 49 152 → 524 288, windows 3.4 to 9.1 s, all twelve rows
framework. The 1 KiB leg moves from the byte-bound 3 145 728 to the pinned 6 000 000. The "consumed before assembly" failure (consume_batch64 KiB 8c, 37 000 of 49 152) is gone: 30 500 of 524 288 is well under half.redis. No OOM anywhere in the log.
consume_paralleldrains rise 10 to 25x at 64 B and 1 KiB (for example 11.7k → 290k msg/s at one consumer) and now sit level withconsumer_groupon the same primitive, which is the #187 fix. Every other cell, the six publish cells included, rises a near-uniform 26 to 45 percent, and the 64 B fill drops from 89 s to 64 s. A fill is the runbook's pure host-speed probe and that factor is the Low Power Mode signature it records; the previous leg was measured on the evening of 2026-09-09, before the power gate existed. Theconsume_batch64 KiB 8c drain is newlysetup_bound: a 0.9 s window at 43.7k msg/s over the byte-capped 49 152 corpus, which a rerun cannot change.Reading a run, per the runbook checklist
Failed scenarios:absent from both logs.failures[]for both legs is empty; the document carries 3 failures (1 NATS, 1 RabbitMQ, 1 in-process → 0) down from 12.unique_at_startunder half the corpus on every drain row of both legs (worst in-process 30 500 / 524 288, worst redis 4 000 / 49 152).duplicates0 on every drain row.setup_boundrows remaining: in-process 24 (broadcast, FIFO, DLQ drain, five 64 KiB rungs, one 64 B batch drain), redis 17 (broadcast, FIFO, DLQ drain, the 64 KiB batch 8c drain above). Same classes as before.README
The
## Performancesection gains one paragraph and one table: the batch flow's best published drain cell per backend and payload, its consumer count, and the ratio to the parallel consumer at that same cell, every figure a row in this document. Ratios are stated to one decimal of the measured cell, and the "at most 1.35x at 64 KiB" claim covers the largest measured ratio (1.341, RabbitMQ 4c).Not in this PR
docs/pages/ops/performance.mdxstill quotes the in-process 64 KiB figures of the previous leg (the 356k parallel row and the 3-10x / 2-7x batch ratios), andbenches/README.md's 32 GiB deviation section describes the cap in terms this leg now makes true. Both need re-deriving from this document in a follow-up; nothing in them is made more wrong by this change, and the previous prose fixes (#196, #197) already scoped those sentences.Verification
scripts/bench.sh charts: every SVG underdocs/public/bench/regenerated, thencargo nextest run --no-default-features -E 'binary(chartgen)': 131 run, 131 passed, includingthe_committed_results_document_renders_every_family.git diffon the other four legs: no key or value change beyond float re-serialisation.