Skip to content

feat(mip8): storage perf-regression suite + consume timing report - #54

Open
pdobacz wants to merge 23 commits into
forks/monad_ninefrom
perf-regression-eestnet-monad-ten-fixes
Open

feat(mip8): storage perf-regression suite + consume timing report #54
pdobacz wants to merge 23 commits into
forks/monad_ninefrom
perf-regression-eestnet-monad-ten-fixes

Conversation

@pdobacz

@pdobacz pdobacz commented Aug 28, 2026

Copy link
Copy Markdown
Collaborator

I wanted to get the performance regression stack into main, but it resulted huge. I trimmed it down considerably over the course of these commits, but still huge.

I am hesitant whether we need it, but not rejecting the idea, since most of this change is purely additive and would be easy to get rid of.

There's a bunch of tests and also the benchmark tests are going to be filled on CI to ensure they do not rot [that badly].

Happy to hear that it's better not to merge this and re-create when new need arises.

Greptile Summary

The PR adds a MIP-8 storage performance-regression suite and the supporting workflow for collecting, aggregating, and documenting Monad block-execution timings.

  • Adds pageified-storage benchmark fixtures spanning storage operations, transaction shapes, halt behavior, and adversarial access patterns.
  • Adds direct-consume timing CSV generation and Monad runner timing support.
  • Adds statistical NINE-versus-TEN report generation, orchestration scripts, tests, CI configuration, and usage documentation.
  • Updates merged-fixture handling so unnamed multi-fixture files are streamed and fully consumed.

Confidence Score: 5/5

The PR appears safe to merge because no blocking failure remains.

No blocking failure remains.

Important Files Changed

Filename Overview
tests/benchmark/stateful/mip8_pageified_storage/test_perf_regression.py Defines the storage performance workloads, sizing logic, fixture state, and fork-comparison cases.
packages/testing/src/execution_testing/cli/pytest_commands/plugins/consume/direct/timing_report.py Adds serial per-block timing collection and writes dynamically shaped client metrics to CSV.
packages/testing/src/execution_testing/cli/perf_regression.py Parses repeated timing reports and produces paired statistical comparisons with multiple-testing adjustment.
packages/testing/src/execution_testing/client_clis/clis/monad.py Adds Monad timing extraction and correctly iterates every fixture in unnamed merged fixture files.
scripts/perf_cycle.sh Orchestrates fixture generation, repeated timed consumption, provenance capture, and report creation.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
    B[MIP-8 benchmark definitions] --> F[Fill MONAD_NINE and MONAD_TEN fixtures]
    F --> C[Consume fixtures with Monad runloop]
    C --> T[Collect per-block timing metrics]
    T --> CSV[timing_consume.csv per run]
    CSV --> P[Pair fork samples by test and parameters]
    P --> S[Wilcoxon tests and BH adjustment]
    S --> M[Markdown regression report]
Loading

Reviews (3): Last reviewed commit: "fix(monad): verify every fixture when gi..." | Re-trigger Greptile

@pdobacz
pdobacz requested review from QEDK and mijovic as code owners August 28, 2026 16:27
Comment thread packages/testing/src/execution_testing/client_clis/clis/monad.py Outdated
Comment thread packages/testing/src/execution_testing/client_clis/clis/monad.py Outdated
pdobacz added 23 commits August 28, 2026 16:58
Runloop-timed SLOAD/SSTORE workloads (NINE vs NEXT):
- two-sided MWU p and a sig@0.10 flag
- ijson-streamed consume
- block diagrams doc

Co-Authored-By: Claude <claude-opus-4-8>
Rework random_sload/bad_block_chained for random file access; refresh disjoint-table descriptions and per-family diagrams.
Co-Authored-By: Claude <claude-opus-4-8>
Co-Authored-By: Claude <claude-opus-4-8>
…_page

sweep_page reads all 128 offsets at occupancy k in {0,1,64}: k hits + (128-k) misses.

Co-Authored-By: Claude <claude-fable-5>
Co-Authored-By: Claude <claude-fable-5>
Co-Authored-By: Claude <claude-opus-5[1m]>
Derives fork/format from the test case, namespaces part files, refuses xdist.

Co-Authored-By: Claude <claude-opus-5>
Gains an entry point, mypy coverage, typed signatures and unit tests.

Co-Authored-By: Claude <claude-opus-5>
Signed-rank on per-run differences, BH-adjusted q, uncompared cases named.

Co-Authored-By: Claude <claude-opus-5>
A shared sender's nonce chain serialises a block regardless of storage access.

Co-Authored-By: Claude <claude-opus-5>
Takes its budget from --gas-benchmark-values, so it leaves consensus releases.

Co-Authored-By: Claude <claude-opus-5>
rt separates a block that was slower from one that redid work under contention.

Co-Authored-By: Claude <claude-opus-5>
The runloop re-stamps the primary when it opens the db, so the value is inert.

Co-Authored-By: Claude <claude-opus-5>
Its gas reserve differed per fork (28100 vs 27900), so the code did too.

Co-Authored-By: Claude <claude-opus-5>
Benjamini-Hochberg already bounds the false discovery rate across the whole table, and 13 paired runs are what let an isolated effect reach 5%.

Co-Authored-By: Claude <claude-opus-5>
… merged

Co-Authored-By: Claude <claude-opus-5>
compute_loop fills the 7-tx block; block_shape is filled at both sender modes.

Co-Authored-By: Claude <claude-opus-5>
Reports retries as 0 and warns once, rather than dropping every timing row.

Co-Authored-By: Claude <claude-opus-5>
Every page and gas count followed from the gas budget and drifted twice.

Co-Authored-By: Claude <claude-opus-5>
The markdown table is the artifact; the standalone page duplicated it.

Co-Authored-By: Claude <claude-opus-5>
--timing-report refuses xdist, so the per-test part files were unreachable.

Co-Authored-By: Claude <claude-opus-5>
Filled at the smallest block gas every case supports, outside monad/monad_runloop.

Co-Authored-By: Claude <claude-opus-5>
Matches the verification path and `evm blocktest`, which run a whole file.

Co-Authored-By: Claude <claude-opus-5>
@pdobacz
pdobacz force-pushed the perf-regression-eestnet-monad-ten-fixes branch from 44d60dd to e790ffe Compare August 28, 2026 17:03
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