Experiment benchmarks coupled capacity findings - kmosoti/FabricO11y GitHub Wiki
Historical report imported 2026-10-10 from
docs/experiments/benchmarks/coupled-capacity-findings.md. Original SHA-256:a2d324e076b15180f6fb9b2b116707987a6ccc4a4145d6549fc1a087e2378c18. Measurements and outcomes retain their stated revisions. Links and local environment labels are normalized;$FABRIC_DATAis the mounted experiment drive. See evidence policy.
Coupled capacity attribute diagnostic
C4 run 03 completed; the phase observer was not admitted, while inclusive
attribution reconciled. This is a diagnostic observation, not a performance
nomination or evidence of isolated attribute-parser causality. The authoritative
result (local evidence omitted from stage) records these
statuses separately. The preparation (local checkout reference docs/experiments/benchmarks/coupled-capacity-preparation.md; not present at origin/main) defines
the scope; repairs were registered as b2fa586 and 8e5d484.
The fixture contains 4096 logs, seed 42, 1024-byte bodies, and either zero or eight string attributes of 128 bytes each. Attribute values repeat across rows; this is not a high-cardinality attribute workload. Encoded batch bytes increased from 4,269,184 to 9,020,544, but Parquet bytes only from 3,537,380 to 3,542,586. Walk and Scan each query selective text (32 hits) and broad text (4096 hits), with limit 50. Measurement covers the first page, including JSON construction; full chains are graded afterward. It does not time full-chain draining.
Twelve fresh children cover plain, allocation-counted phase-off, and counted phase-on regimes, each with owned/borrowed projection and zero/eight attributes. Each child reports medians of three measured first pages per query: one diagnostic pair per attribute/regime, not three independent paired repetitions.
Plain first-page CPU below is milliseconds, zero attributes → eight attributes.
Requested allocation and incremental allocator peak are counted phase-off
medians in bytes; owned / borrowed denotes the two implementations.
| Query | Owned CPU | Borrowed CPU | Requested, attrs 0 | Requested, attrs 8 |
|---|---|---|---|---|
| Walk selective | 2.974211 → 6.845283 | 2.907036 → 6.629916 | 19,499,679 / 15,309,803 | 35,393,417 / 31,203,541 |
| Walk broad | 2.839278 → 6.830357 | 2.783543 → 6.376224 | 19,582,880 / 15,412,593 | 35,537,962 / 31,367,675 |
| Scan selective | 2.861982 → 6.903572 | 2.950563 → 6.706849 | 19,501,517 / 15,311,659 | 35,395,255 / 31,205,397 |
| Scan broad | 2.778897 → 6.638595 | 2.866510 → 6.508165 | 19,584,726 / 15,414,457 | 35,539,808 / 31,369,539 |
Eight attributes added 3.592681–4.041590 ms CPU (2.270414–2.412165 times the empty cost). Requested bytes increased by exactly 15,893,738 for selective queries and 15,955,082 for broad queries in both implementations. Borrowing saved the same absolute bytes at both attribute settings: selective Walk/Scan 4,189,876/4,189,858; broad Walk/Scan 4,170,287/4,170,269. Consequently the saved fraction declined from 21.2935–21.4869% to 11.7341–11.8380% as the attribute-associated allocation grew. This supports dilution of the ownership saving, rather than increased absolute ownership savings with richer attributes.
Incremental peak for owned projection rose by 699,224 bytes (selective) or 783,520 (broad); borrowed rose by 698,193 or 782,489. Empty peaks were 4,900,989–4,948,773 bytes and rich peaks 5,599,188–5,732,287. Borrowing changed empty peaks by +6 bytes and rich peaks by −1,025 bytes: no material peak improvement. Plain borrowed/owned CPU ratios were 0.977414–1.031528 with empty attributes and 0.933513–0.980353 with rich attributes. These single pairs do not establish a repeatable speedup; an H0 of no isolated parsing benefit remains compatible with the observations.
All 48 stored oracle verdicts passed, with 12 recorded negative-control sets rejecting truncated and duplicated answers. The structural ledgers record 48 actual canonical chains (1992 pages) and 144 measured-first-page associations; associations are not additional independent full drains. One actual Rust validation control passed, preserving malformed-attribute rejection and validation/window behavior for rejected rows. Read-only review recomputed all 12 summaries from native timings and inspected verdicts; it did not rerun the oracle or verify every compressed object hash.
Observer phase-on/off CPU ratios span 0.903857–1.043303, violating the
registered 0.95–1.05 admission band. All 48 measured inclusive residuals
reconciled within tolerance, but reconciliation does not admit the observer.
parquet_load_project_logs includes decoding, attribute parsing, predicates,
and materialization; its delta cannot isolate parsing. C4 remains inconclusive
for phase causality and changes no historical CR2 acceptance rule.
The coordinator receipt (local evidence omitted from stage)
records exit 0, 161.209496 s, cgroup peak 804,814,848 bytes (767.53125 MiB),
zero swap/OOM events, sampled scratch peak 55,619,318 bytes, and scratch
removal. Retained run evidence observed here totals 23,624,881 file bytes /
24,596,480 allocated bytes; this excludes coordinator/source-receipt overhead.
Run 01 failed compilation on missing protobuf key_strindex; run 02 failed
compilation on thread_now. Both failures remain preserved and contain no
native performance measurements; neither is folded into run 03 comparisons.