Skip to content

docs: 8x L40S benchmark -- three tip blocks, 8 vs 16 chunks - #238

Merged
defenwycke merged 4 commits into
mainfrom
docs/bench-8xl40s
Sep 8, 2026
Merged

docs: 8x L40S benchmark -- three tip blocks, 8 vs 16 chunks#238
defenwycke merged 4 commits into
mainfrom
docs/bench-8xl40s

Conversation

@defenwycke

Copy link
Copy Markdown
Contributor

Writes up last night's fleet runs. Everything here is wall-clock on real hardware; nothing is projected unless it says so.

What was run

Eight UpCloud L40S boxes, v0.21.0 release binary verified against the signed SHA256SUMS.txt on every box, CORE guest 37987b85. Blocks 966,108 / 966,107 / 966,106, each proved twice — once at HAZYNC_CHUNKS=8 (one chunk per card) and once at 16 (two per card). Six proofs in all.

Headline

block 8 chunks 16 chunks Δ
966,108 912.8 s 905.5 s −0.8%
966,107 807.8 s 819.3 s +1.4%
966,106 711.8 s 711.9 s +0.0%

Chunk count does essentially nothing — mean +0.2%, and the sign is not consistent. This answers the open question the doc originally left as "not measured".

The mechanism is visible in the ordering: the 16-chunk gain tracks the 8-chunk straggler monotonically (1.118 → −0.8%, 1.059 → 0.0%, 1.048 → +1.4%). Splitting finer buys back imbalance and nothing else, and roughly pays for its own overhead when it does. Recommendation: keep HAZYNC_CHUNKS equal to the card count.

Other measured results

Card counts

The projection is anchored on the measured 8-card figure, which is the only reason to trust it. It puts sub-ten-minute blocks at ~13 L40S, not 10.

Incidental finding

HAZYNC_RECEIPTS (#230) is not in the v0.21.0 binary — it merged after the tag. The aggregate reads chunk_<i>.bin from the working directory. Noted in the reproduction section.

Refs #119, #237, #226, #230, #236.

First fleet measurement of near-tip blocks on the v0.21.0 CORE guest.
Blocks 966,108 / 966,107 / 966,106, `HAZYNC_CHUNKS=8`, one chunk per
card, aggregated over `seg-serve`.

Measured, not projected:

- compute total 912.8 s / 807.8 s / 711.8 s
- straggler 1.118 / 1.048 / 1.059 -- block composition moves the chunk
  phase more than any knob we have tuned
- the aggregate barely moves (203.8 / 205.8 / 189.8 s) across a 22% swing
  in chunk work; it tracks segment count, not layout
- prevout count predicts chunk time, transaction count does not -- the
  three blocks order in reverse by transactions
- both 966,108 runs produced an identical receipt digest despite
  different chunk timings and one restarted chunk
- 966,106 hit #119 and the armed retry recovered it on `attempt=2`, the
  first live confirmation the wrapper works

Card-count projection is anchored on the measured 8-card figure and puts
sub-ten-minute blocks at ~13 L40S, not 10.
Answers the open question the doc previously left as "not measured": is
`HAZYNC_CHUNKS=16` (two chunks per card) better than one chunk per card?

Measured on 966,108, same fleet, same binary, same guest:

- straggler falls 1.118 -> 1.085, exactly as summing two draws predicts
- but total chunk work rises 1.3% (fixed per-chunk cost paid 16 times)
- and the aggregate rises 2.3% (depth-4 join tree, 4.3 s of resolves)
- net **905.5 s vs 912.8 s -- 0.8%, inside noise**

All sixteen chunks `REAL_EXIT=0, attempt=1`. Chunk inputs sum to 8,562,
matching the block's prevout count exactly.

The 8- and 16-chunk runs produced the **identical receipt digest**, so
the proof does not depend on how the work is divided -- determinism
across a structural change, not just a timing one.

Conclusion: match chunks to cards. Chunk count is nearly free to get
wrong, which is a better reason for the default than load balance.
Second block re-run at 16 chunks. Two chunks hit #119 and the armed
retry recovered both on `attempt=2`.

- 16 chunks is *slightly worse* here: 819.3 s vs 807.8 s (+1.4%). The
  8-chunk straggler was already 1.048, so there was no imbalance to win
  back and only the +1.2% per-chunk overhead showed up. The 16-chunk
  gain is bounded by how bad the 8-chunk straggler was.
- digest matches the 8-chunk run of the same block, as with 966,108
- inputs sum to 7,961, matching the block's prevout count exactly

⛔ #119 cost 33% of the block -- 817 s wall against 614 s of successful
work on the same card, because `prove-chunk` restarts from segment
zero. Observed rate across the night is 4 faults in 64 attempts (~6%),
which is a ~40% chance of at least one fault per 8-chunk block. The
retry is not optional; it belongs in the binary (#237).
Completes the 8-vs-16 comparison across all three blocks.

| block   | 8 chunks | 16 chunks |     Δ |
|---------|----------|-----------|-------|
| 966,108 |  912.8 s |   905.5 s | -0.8% |
| 966,107 |  807.8 s |   819.3 s | +1.4% |
| 966,106 |  711.8 s |   711.9 s | +0.0% |

⏰ Chunk count does essentially nothing -- mean +0.2%, and the sign is
not consistent. The mechanism shows in the ordering: the 16-chunk gain
tracks the 8-chunk straggler monotonically (1.118 -> -0.8%, 1.059 ->
0.0%, 1.048 -> +1.4%). Splitting finer buys back imbalance and nothing
else, and roughly pays for its own overhead when it does.

✅ All three blocks gave byte-identical digests at 8 and 16 chunks --
six proofs, three digests. The receipt is a function of the block, not
of how the work was divided.

⇒ Keep HAZYNC_CHUNKS equal to the card count. Effort is better spent on
#119 (33% of a block when it fires, 6.3% per chunk) than on chunk count.

Also notes that HAZYNC_RECEIPTS (#230) is not in the v0.21.0 binary.
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