Repository navigation
perf: reduce large-page reuse CPU after #611 while preserving RSS and p99 #614
Description
Context
Focused next work order extracted from #585: reduce the CPU cost of reusing large pages while preserving the memory savings already shipped. Deliver one measured optimization, with a complete memory and latency ledger.
#584's memory savings originally cost roughly 11–15% CPU on large-class and ephemeral workloads. #609 recovered modest CPU gains; #611 then narrowed retired-page searches and merged as 236533318c4e22d7104fcc671ecf70f41e136a67. These historical costs are motivation, not a measurement of today's remaining debt. Both follow-ups claimed no new RSS saving. #610 is complete; do not repeat its search-bounds optimization.
Observed main at filing: 227eef06ff03f92966f38508441d6c2f60a75135. Freeze the exact current merged main SHA at campaign start, after verifying it includes #611, and use that same baseline throughout the candidate comparison.
Benchmark prerequisite: restore and verify benchmark-stats
Execution split: #615 owns benchmark restoration and its separate PR. This issue owns the CPU/memory optimization PR, after #615 is verified. The detailed prerequisite below remains the required handoff contract.
Also covers the user-reported failed build step, run 39577325702 on source ee3623f6b7a485754a0a0aa3462d8cba43390e8b (2026-10-21).
The fatal error in ci/build_benchmark_allocators.py was ArchiveError: tcmalloc generated module lock mismatch: expected 340a645e18fb1cdaed3dfd465312a3447de84ab31f78bd7db1863e2ee80f79f6, got c0b842b0e615e31c165a5d7f005f97fe6c0dcbed05576ebf17967d0702232544. Measurement never started. The earlier soldr cook warning about no root Cargo.toml was nonfatal and is not the demonstrated cause.
PR #608 subsequently merged the matching repair: a checksummed TCMalloc dependency-lock patch, exact Bazel 9.1.0 selection, and query/build with --lockfile_mode=error. It also records successful full-mode verification on its own source. Therefore first verify that current main contains this fix and that the existing benchmark-stats workflow succeeds on the current source; do not duplicate the patch or treat this historical run as proof that main is still broken. Fix any remaining reproducible blocker in the existing builder/workflow. Inspect ci/build_benchmark_allocators.py, rust/benchmark-suite/allocators/allocator-lock.json and its patches, .github/workflows/benchmark-stats.yml, and the allocator-builder tests.
- Retain the original failing evidence and verify fix(bench): snapshot TCMalloc Bazel dependency lock #608's regression tests cover lock corruption/tool-version drift (RED → GREEN for any newly discovered defect). Preserve checksums, pinned dependencies and fail-closed validation; do not accept an arbitrary new hash or skip TCMalloc.
- Record a successful full-mode
benchmark-statsrun on the exact repaired/current main source, covering native allocator build, complete measurements, raw-data validation and site rendering/validation. Verify normal scheduled publication is restored, with fresh benchmark data and a recorded run/source SHA. A reduced smoke run or a green build alone is insufficient. - Complete this prerequisite before relying on the benchmark pipeline for this CPU campaign. Keep benchmark repair commits distinct from allocator changes. If fix(bench): snapshot TCMalloc Bazel dependency lock #608 fully resolves it, record verification and reuse that fix without unnecessary code changes.
Proposal
- Attribute before editing. Profile
large-class/8,large-class-ephemeral/8, and the chart-build short-generation ephemeral workload on the frozen baseline. Separate retired-page selection, retirement/publication, geometry/page-map work, free-list formation/page initialization, and arena/OS work. Record event counts and sampled CPU attribution; distinguish instrumented work counts from timing evidence. Useci/attribution_probe.pyand the existing perf-ab/event/USDT tooling; acceptance timing follows the CI measurement process indocs/dev-loop.md. - Choose one demonstrated source of avoidable CPU work. Inspect
mi_page_repurpose_retired,mi_page_set_geometry, and_mi_page_initinsrc/page.c,src/page-retired-search.c, and their page-map/retirement callees. These are investigation points, not a preselected culprit. Preserve resident reuse, selection semantics, page geometry, aging, retention and purge policy for this work order. Prefer removing redundant bookkeeping or initialization after proving its invariants. - Implement and validate one optimization. Add a focused RED → GREEN regression/work-count test for the specific redundancy or invariant before implementation. Measure the candidate against the frozen baseline with unchanged traces, seeds, touches and operation counts. Preserve actual executables, raw results and rejected revisions.
Acceptance criteria
- Publish baseline/source SHAs, attribution, commands, and the selected mechanism. Evidence identifies avoidable work remaining after perf: narrow retired-page searches using existing owner bounds (#610) #611.
- Focused test is RED on the baseline and GREEN on the candidate; ownership, concurrent retirement/scavenging, page-map validity, and initialization/failure paths affected by the change remain correct.
- Declare target/control cells, sample caps, noise methodology, service bounds and material-risk bounds before measurement. Cover the existing 12 default perf-ab rows plus the sparse 64-slot diagnostic used by perf: narrow retired-page searches using existing owner bounds (#610) #611, including small/Larson controls, profiler-on, random/bursty and ephemeral variants.
- Report per-cell throughput, CPU/op, minor faults, peak RSS, after-drain RSS and sampled p99, with 95% intervals and original PASS/INCONCLUSIVE/FAIL labels. Show at least one statistically supported target CPU/throughput gain; no arbitrary minimum percentage is required.
- Preserve memory savings and release bounds. Claim zero memory credit unless a new reduction is actually established. Apply AGENTS.md rule 12: no confirmed per-cell regression beyond its allowance, no p99 credit, and no gains averaged across cells/hosts. Resolve uncertainty under the documented acceptance policy; prior owner acceptance of perf: reduce large-page bookkeeping and complete measurement gates (#585) #609/perf: narrow retired-page searches using existing owner bounds (#610) #611 is not a waiver for this candidate. Do not rerun unchanged failures to obtain green.
- Pass applicable full C/platform, native MSVC, win-GNU, Rust/layout, sanitizer, memory and default-fast-path identity gates. Preserve C-core/Rust commit separation and local-gate stamping. Put the final ledger and disposition in the PR and this issue.
Decisions
- Priority P2; benchmark restoration/verification first, followed by one optimization PR, branch
perf/<issue-number>-large-reuse-cpu. - This issue pays down CPU while protecting memory. Further persistent-buffer RSS reduction is separate research: perf: next steps after #575 — pay down #584 CPU, large-path fork/upstream regression, sparse-large gap #585's corrected persistent/8 result was 1.224× TCMalloc, but changing geometry or purge policy would broaden this task.
- Do not retry retired-body discard, rejected aging/budget settings, or perf: reduce retired-page best-fit search overhead #610's rejected inline prototypes. Any later release policy requires reuse-distance evidence first.
- If attribution finds no justified optimization, record that evidence here and stop under rule 7; do not invent a policy change or claim completion of the optimization.
- No new GitHub Actions workflow files or required C dependencies.
Related issues
-
PR fix(bench): snapshot TCMalloc Bazel dependency lock #608: merged TCMalloc dependency-lock repair matching the reported benchmark failure.
-
perf: next steps after #575 — pay down #584 CPU, large-path fork/upstream regression, sparse-large gap #585: broader remaining CPU and memory program; this issue extracts its next bounded CPU task.
-
perf: reduce retired-page best-fit search overhead #610 / PR perf: narrow retired-page searches using existing owner bounds (#610) #611: completed retired-page search optimization and preserved measurement evidence.
-
perf: close the large-class-persistent memory gap (2.3x jemalloc, 2.4x TCMalloc peak RSS at 8 workers) #575 / PR perf: fungible large-bin pages, 1 MiB span cap + repurpose budget (#575) #584: original resident-reuse memory savings and CPU cost.
Activity
zackees commentedon Oct 22, 2026
Baseline investigation started
Frozen source for the initial attribution:
227eef06ff03f92966f38508441d6c2f60a75135, after #611. Benchmark prerequisite is split into #615; full current-main run 39815683542 is still queued, so publication is not claimed restored and no candidate acceptance campaign has started.Local sampled profiles of the unchanged baseline identify
_mi_page_unpurge_allas one potential avoidable cost (about 0.66% self samples on large-class/8 and 1.39% on plain ephemeral in these diagnostic replays). Kernel symbols are restricted; these samples are attribution, not portable timing estimates or evidence of a gain. Disassembly shows the no-work case still enters the full function prologue, saving five callee-saved registers plus the frame pointer and reserving 72 stack bytes before testing the purge state.A separate instrumented replay counted calls and calls with either a nonempty unformed purged range or nonzero formed-purge bitmap:
The probe used atomic counters and is deliberately unsuitable for performance comparisons. Its patch, reports, exact baseline executables, compiler/host identity and raw perf data are retained locally for the eventual durable evidence archive; the probe has been removed from the source worktree.
Next hypothesis: a small public entry with an exact no-work check and a separate slow body can avoid entering that large body for clean pages, without changing any purge/retirement policy or metadata. Prove the no-work dispatch and dirty formed/unformed cases before implementation; evaluate performance only after the benchmark prerequisite. This is not yet an accepted optimization.
zackees commentedon Oct 22, 2026
Candidate and predeclared campaign
Draft PR #616 contains a small clean-page unpurge entry and the unchanged restore body as an explicitly noinline slow function. C-core and Rust regeneration are separate commits; current stamped head is
287cac2f664a. Local gate 45/45 PASS; sole source reviewer CLEAN. The diagnostic work-count regression is RED on the instrumented original implementation and GREEN on the candidate. C Release purge/event/large-span tests and C++ Debug/full event/large-span tests pass. The optional C++ purge-hole target fails on unchanged-source goto-across-initialization errors; its C test passes. This is not a performance acceptance claim.Before any measurement, declare the following for baseline
227eef06ff03f92966f38508441d6c2f60a75135and this candidate:large-class/8,large-class-ephemeral/8, andlarge-class-ephemeral/8 short generations (chart build). Each gets one original cohort: 60 initial actual samples/arm, adaptive cap 120, null arm and sanity gate enabled, unchanged original traces/touches/seeds/operation counts.The full platform checks are running on #616. The benchmark baseline run has progressed past native library build into the full workload suite; restoration is not yet claimed.
zackees commentedon Oct 22, 2026
Benchmark prerequisite #615 is now verified through publication: full run https://github.com/zackees/mimalloc-pprof/actions/runs/39815683542 passed, and independent local branch/Pages audits match the sealed artifact. Benchmark delivery remains a separate PR.
All nine original replacement platform workflows for CPU candidate
287cac2f664a46703ebb6522eef8c8dbeb984cbbpassed. Archived API records show its tree is identical to CI's test mergec9eab6aebbc68a4763b6063f1ebbf6060b6fe39e(a910b85e21192b946f9d7acda1096c60d437c582). Reviewed attribution and complete platform logs are retained in local evidence commits, not yet pushed; the measured candidate is unchanged.Started the predeclared original stage-one cohorts, each 60 initial samples/arm, adaptive cap 120, null arm and sanity gate on, no variants and unchanged workload parameters:
Fixed baseline remains
227eef06ff03f92966f38508441d6c2f60a75135. No performance result or acceptance is claimed yet. The remaining ten rows are conditional on the previously declared stage-one criteria; no unchanged reruns or cross-host pooling.zackees commentedon Oct 22, 2026
Stage-one result: candidate not accepted
Exact baseline
227eef06ff03f92966f38508441d6c2f60a75135, candidate287cac2f664a46703ebb6522eef8c8dbeb984cbb. All three original cohorts completed with 120 actual samples per arm (base/head/null), unchanged traces and sanity gates. Original executables/hash manifests, raw samples, workflow logs and independently recomputed ledgers are retained. No hosts are pooled.No statistically supported target CPU or throughput gain. Across 18 metrics: 10 PASS, 8 INCONCLUSIVE, 0 FAIL; zero memory credit in every row, all release bounds held. The stage-two condition is not met. I will not expand this candidate to the remaining rows or rerun it unchanged. It is rejected for delivery despite successful correctness/platform gates.
The measured chart binaries confirm the intended prologue removal, but structural work reduction is not a measured benefit. CPU changes in both ephemeral targets lean worse, and the plain-ephemeral RSS interval is unresolved; neither is silently relabelled as equivalence. Further implementation requires fresh attribution within the original CPU-only scope, not weaker thresholds.
large-class/8
Original run: https://github.com/zackees/mimalloc-pprof/actions/runs/39823333694
base
227eef06ff03head287cac2f664aon AMD EPYC 7763 64-Core Processor, 60 reps (up to 120); 4 logical CPUs, 8-worker cells have 2.00 workers per logical CPU (above 1 means oversubscription); arm order: rotating-reversed-blocks-v1Rule-12 ledger (CLAUDE.md; ci/perf_ab_ledger.py):
saved%of the reducible peak-RSS gap, then per metric the paired change [95% sign-test interval] against its allowance (saved%/3 for CPU, throughput and faults; noise for memory and for cells that saved none). INCONCLUSIVE is not a pass.large-class-ephemeral/8
Original run: https://github.com/zackees/mimalloc-pprof/actions/runs/39823337377
base
227eef06ff03head287cac2f664aon AMD EPYC 7763 64-Core Processor, 60 reps (up to 120); 4 logical CPUs, 8-worker cells have 2.00 workers per logical CPU (above 1 means oversubscription); arm order: rotating-reversed-blocks-v1Rule-12 ledger (CLAUDE.md; ci/perf_ab_ledger.py):
saved%of the reducible peak-RSS gap, then per metric the paired change [95% sign-test interval] against its allowance (saved%/3 for CPU, throughput and faults; noise for memory and for cells that saved none). INCONCLUSIVE is not a pass.large-class-ephemeral/8 short generations (chart build)
Original run: https://github.com/zackees/mimalloc-pprof/actions/runs/39823341873
base
227eef06ff03head287cac2f664aon AMD EPYC 9V74 80-Core Processor, 60 reps (up to 120); 4 logical CPUs, 8-worker cells have 2.00 workers per logical CPU (above 1 means oversubscription); arm order: rotating-reversed-blocks-v1Rule-12 ledger (CLAUDE.md; ci/perf_ab_ledger.py):
saved%of the reducible peak-RSS gap, then per metric the paired change [95% sign-test interval] against its allowance (saved%/3 for CPU, throughput and faults; noise for memory and for cells that saved none). INCONCLUSIVE is not a pass.perf: bypass the unpurge restore body for clean pages (#614)
chore(rust): regenerate the unpurge dispatch amalgamation (#614)
docs: preserve CPU attribution and structural test evidence (#614)
docs: preserve full platform validation for CPU candidate (#614)
docs: retain original rejected unpurge measurements (#614)
perf: skip clean retirement restore calls at publication (#614)
chore(rust): regenerate retirement guard amalgamation (#614)
zackees commentedon Oct 22, 2026
V2: call-site guard, predeclared campaign
V1 remains rejected for no supported target CPU/throughput gain; all original evidence is retained in PR #616. Its wrapper has been replaced with a guard at retirement publication, so clean pages never call the restore function. Original restore behavior remains for dirty pages and other callers. Optimized assembly confirms the clean path has no restore call; caller register-save prologue remains.
Candidate
59d369609ab47358df0f883b6419252f1ffbf03a, frozen baseline227eef06ff03f92966f38508441d6c2f60a75135. Main changed only benchmark evidence since the baseline. Separate C and regenerated Rust commits; local gate 45/45, source review clean. Focused clean-retirement test failed before implementation and passes after it. Real-discard tests independently cover formed-only and tail-only restoration and reuse; C event/purge/large 3/3, C++ event/large 2/2. Performance benefit is unproven. Prior platform passes apply only to V1; fresh V2 checks are required.Declared before dispatch: initial 60 samples per arm, adaptive cap120, null arm and sanity gate enabled, zero memory credit, no environment/define variants, unchanged traces/seeds/touches/operation counts. All six metrics with original 95% intervals/verdicts, same-run host comparison, existing 1300ms release bound. No cross-host pooling, unchanged reruns, threshold changes or new uncertainty waiver.
Stage one: large-class/8, large-class-ephemeral/8, and short-generation chart ephemeral/8, one original cohort each. Proceed to the remaining ten rows (all12 defaults plus sparse64-slot diagnostic total13) only with supported target CPU/throughput gain and no confirmed FAIL, incomplete data, sanity or service failure. Retain every outcome and all exact binaries/raw samples. Missing/uncertain acceptance remains unresolved; not a pass.
Benchmark prerequisite #615 is complete through merged PR #617 and full published run39815683542. PR #616 remains draft pending the full acceptance evidence.
zackees commentedon Oct 22, 2026
V2 platform failure and test correction
Original ASan run 39831434073, owner-gate Debug lane, failed
test-event-counters:_mi_page_free_collectasserted_mi_gate_held_theap. The new test called this internal function without acquiring the owner gate. This is a test defect and a real failed platform gate; it is not marked passing or retried unchanged.The failure reproduces locally. The correction holds the owner gate across internal page access/sweeping, including both clean and dirty tests, and releases it before deleting the heap. The focused test passes with Debug/full + owner gate + actual ASan enabled (
__asan_initverified), and with the gate disabled. An initial local setup lacked the ASan header and compiled sanitizer support out; its RED/GREEN results establish gate coverage only. The later sanitized configuration explicitly enables it.Only the test changes. Allocator sources, Rust amalgamation, build flags and performance harness remain the measured V2 implementation, so the three original live measurement cohorts are retained without duplicates. Original platform failure logs are preserved. Full platform validation of the corrected tests is still required before merge, and performance acceptance remains pending. PR #616 stays draft.
docs: preserve retirement guard validation and campaign plan (#614)
test: acquire owner gate in retirement restore checks (#614)
33 remaining items
docs: preserve V6 free-list structural evidence (#614)
perf: remove free-list candidate without supported gain (#614)
build: regenerate vendor C after rejecting V6 (#614)
docs: preserve rejected V6 measurements and platform evidence (#614)
zackees commentedon Oct 22, 2026
V6 rejected: no supported CPU/throughput gain
Tracks #614. Benchmark prerequisite #615 was delivered separately in merged PR #617. The CPU improvement objective remains incomplete; this draft is not ready to merge.
Measured candidate
a40d8d6e717df31859103a034bf349d32e7760fc; fixed baseline227eef06ff03f92966f38508441d6c2f60a75135.V6 removed a redundant final free-list link store. Its focused RED/GREEN test and all ten platform workflows passed, but the three original target cohorts produced 14 PASS, 4 INCONCLUSIVE, zero FAIL and no statistically supported target CPU/throughput gain. All release bounds held; zero memory credit. No stage two, unchanged rerun, threshold change or waiver. The candidate was removed in C commit
d9dc4e1aand separately regenerated Rust commit31c92eea.The plain ephemeral cohort retained inconclusive CPU, faults, p99 and drain RSS results, including the broad drain interval; these are not equivalence claims. A green workflow is not performance acceptance.
Evidence under
.github/assets/perf-614/:v6-structural.zip,v6-measurements.zip,v6-platform.zip, their external digests/member manifests, exact source snapshot, actual measurement executables, raw samples, run metadata/logs, source manifest andledger-v6.md. Native MSVC, Windows GNU, native Mac x64/ARM64, Rust, default fast-path identity, memory and sanitizer coverage passed. The minimal-only memory job is skipped in the full lane; full-lane memory coverage is retained.V1/V2/V4 also lacked supported CPU/throughput gains; V3 had confirmed regressions; V5 was rejected before measurement for a reentrant collection risk. All rejected production changes are removed; evidence remains preserved.
V6 original stage-one ledger
Baseline
227eef06ff03f92966f38508441d6c2f60a75135; candidatea40d8d6e717df31859103a034bf349d32e7760fc.Rejected: no statistically supported target CPU/throughput gain. 14 PASS, 4 INCONCLUSIVE, zero FAIL. No stage two or unchanged rerun.
Original per-host paired cohorts only; zero memory credit. All ten platform workflows passed. Platform success does not establish performance acceptance.
large-class/8
Run 39855326807; AMD EPYC 7763 64-Core Processor; samples per arm: {'base': 80, 'head': 80, 'null': 80}.
Release p95: 1040.0 ms; bound: 1300 ms; held: True.
large-class-ephemeral/8
Run 39855330463; AMD EPYC 7763 64-Core Processor; samples per arm: {'base': 120, 'head': 120, 'null': 120}.
Release p95: 1050.0 ms; bound: 1300 ms; held: True.
large-class-ephemeral/8 short generations (chart build) short generations (chart build)
Run 39855334782; AMD EPYC 7763 64-Core Processor; samples per arm: {'base': 110, 'head': 110, 'null': 110}.
Release p95: 1010.0 ms; bound: 1300 ms; held: True.
zackees commentedon Oct 22, 2026
V7 preflight update (not measured): specialization of the selected retired large singleton removal has a focused RED/GREEN work-count test and clean implementation review. The C and secure C++ large-span tests pass, as does the actual ASan + owner-gate large-span test.
Additional validation exposed two results that are not waived:
MI_SECURE=5,MI_DEBUG=3) cannot compile unchangedtest/test-purge-holes.c: gotos todoneat line 1939 cross initialized locals intest_owner_sweep_pacing. Reproduced with identical compiler flags against frozen baseline227eef06ff03f92966f38508441d6c2f60a75135; the test source is byte-identical. Exact command and diagnostics are retained locally.new-thread-does-not-sweep-at-onceat line 2313: 6 discards observed, expected 0. The reuse test passed. A matching frozen-baseline build is in progress to attribute this failure; no unchanged candidate rerun is being used to erase it.Under rule 7, optimization implementation/measurement is stopped pending validation attribution and disposition. No performance workflow has been dispatched and no gain is claimed. Actual executables, logs and source evidence are retained.
zackees commentedon Oct 22, 2026
Follow-up: the matching frozen-baseline ASan + owner-gate purge run passed. Thus the candidate pacing failure remains unresolved; it is not classified as preexisting or waived. Both actual executables and logs are retained. The secure C++ compile failure is separately reproduced on the frozen baseline. V7 remains uncommitted and no performance measurements are dispatched.
zackees commentedon Oct 22, 2026
V7 validation attribution
Candidate purge test: 34 pass, 1 pacing failure (6 discards vs 0). Baseline matched build passes. No unchanged candidate rerun.
Additional source/log evidence: MI_DIAGNOSTICS=1 in actual candidate compiler flags. Event counter implementation is unsampled monotonic atomic counts; print omits zero values. No test event resets and no production reset callers. Both final candidate and baseline event lines omit large_repurpose, meaning zero successful repurposes in those processes. MI_EVENT_LARGE_REPURPOSE occurs before the specialized removal call. Thus candidate specialization was not executed by this failing suite; this does not prove a test-only bug or waive the pacing assertion. Generic removal source is unchanged except extraction and a macro resolving to the exact original setter in production.
The test computes global discard-count change around thread C. Other threads including the scavenger remain enabled; it does not attribute the discards to C. This is a potential attribution defect, not yet proven root cause. A diagnostic should identify the discarding thread and reason before changing the assertion or allocator.
Secure C++ compile error is independently reproduced against frozen baseline identical purge test source and flags. A narrow compile repair would move initialized locals before reachable goto edges without changing checks.
Rule7 stop on optimization work and measurement remains in effect. Asked owner whether to expand work order to diagnose/fix validation blockers. No new approval inferred from elapsed time.
perf: specialize retired large singleton removal (#614)
build: regenerate vendor C for draft V7 (#614)
docs: preserve V7 draft and unresolved validation evidence (#614)
zackees commentedon Oct 23, 2026
Published the current V7 implementation, separately regenerated Rust source, and hashed validation evidence to draft PR #616 at
6155a79f6701. The local pre-push gate passed 45/45. New issue #618 tracks the secure C++ compile error and unresolved purge-pacing failure, with exact reproduction evidence and RED/GREEN acceptance criteria. V7 remains unmeasured and unaccepted; this is the requested draft handoff, not completion of #614.zackees commentedon Oct 23, 2026
Validation blockers (#618) resolved on #616 head f043323 — see #618 for attribution + RED→GREEN. Both were pre-existing on baseline 227eef0, not V7. CPU measurement may resume; no gain claimed yet.
zackees commentedon Oct 23, 2026
perf-ab status for V7 (head f043323 vs frozen base 227eef0):
--no-sanity-gate. The per-row ledger still judges drain RSS against the null-arm noise floor.complete: false, so per protocol no verdict is drawn from it. It is kept as evidence.zackees commentedon Oct 23, 2026
V7 verdict: REJECTED (rule 12)
Complete perf-ab runs comparing head
f0433230with frozen base227eef06, 15 reps (up to 25), with a null arm: group 1 39905247635 on AMD EPYC 7763, group 2 39909998440 on Xeon 8370C. Rows were judged only within their own VM; nothing was averaged across hosts.large-class-ephemeral/8CPU/op +0.7% [+0.4, +1.0] against a 0.3% allowance, with zero memory credit.large-class/8CPU +0.8% [+0.3, +1.2];random-large/8ops/s −1.9% [−2.5, −1.0] and CPU +0.8% [+0.5, +1.5].Earlier attempts, kept as evidence: 39896572843 (sanity gate tripped on base noise, #620) and 39897074404 (90-min timeout, incomplete; diagnosed and fixed in #621).
Disposition: V7 joins V1–V6 as rejected. The #618 validation fixes do not depend on V7 and continue separately in #622. Closing this draft.
Full ledgers
perf-ab run 39905247635: https://github.com/zackees/mimalloc-pprof/actions/runs/39905247635
base
227eef06ff03headf04332301b27on AMD EPYC 7763 64-Core Processor, 15 reps (up to 25); 4 logical CPUs, 8-worker cells have 2.00 workers per logical CPU (above 1 means oversubscription); arm order: rotating-reversed-blocks-v1Rule-12 ledger (CLAUDE.md; ci/perf_ab_ledger.py):
saved%of the reducible peak-RSS gap, then per metric the paired change [95% sign-test interval] against its allowance (saved%/3 for CPU, throughput and faults; noise for memory and for cells that saved none). INCONCLUSIVE is not a pass.perf-ab run 39909998440: https://github.com/zackees/mimalloc-pprof/actions/runs/39909998440
base
227eef06ff03headf04332301b27on Intel(R) Xeon(R) Platinum 8370C CPU @ 2.80GHz, 15 reps (up to 25); 4 logical CPUs, 8-worker cells have 2.00 workers per logical CPU (above 1 means oversubscription); arm order: rotating-reversed-blocks-v1Rule-12 ledger (CLAUDE.md; ci/perf_ab_ledger.py):
saved%of the reducible peak-RSS gap, then per metric the paired change [95% sign-test interval] against its allowance (saved%/3 for CPU, throughput and faults; noise for memory and for cells that saved none). INCONCLUSIVE is not a pass.