# Phase 90: Structural Review & Gap Triage(mimalloc/tcmalloc 差分を“設計”に落とす SSOT) 目的: 「layout tax を疑う/疑わない」以前に、**差分がどこから来ているか**を “同じ儀式” で毎回再現し、次の構造案(Phase 91+)を決める。 前提: - SSOT runner(性能の正): `scripts/run_mixed_10_cleanenv.sh`(`ITERS=20000000 WS=400 RUNS=10`) - OBSERVE runner(経路の正): `scripts/run_mixed_observe_ssot.sh`(telemetry込み、性能比較に使わない) - 現行SSOT(Phase 89): `docs/analysis/PHASE89_SSOT_MEASUREMENT.md` 非目標: - 長時間 soak(5分/30分/60分)は Phase 90 ではやらない。 - “1行の micro-opt” は Phase 90 ではやらない(Phase 91+ の入力だけ作る)。 --- ## Box Theory ルール(Phase 90 版) 1. **境界は1箇所**: 測定の入口はスクリプトで固定(手打ち禁止)。 2. **戻せる**: 比較は同一バイナリ ENV トグル、または “同一バイナリ LD_PRELOAD” を優先。 3. **見える化**: まず OBSERVE で「踏んでる」を確定し、SSOT で数値を取る。 4. **Fail-fast**: `HAKMEM_PROFILE` 未指定など SSOT 違反は即エラー(スクリプト側で強制)。 --- ## Step 0: SSOT Preflight(経路確認、性能ではない) 目的: “踏んでない最適化” を排除する。 ```bash make bench_random_mixed_hakmem_observe HAKMEM_ROUTE_BANNER=1 ./scripts/run_mixed_observe_ssot.sh | tee /tmp/phase90_observe_preflight.log ``` 判定: - `Route assignments` が想定と一致していること(Mixed SSOT の既定は多くが `LEGACY` になりがち) - `Inline Slots Overflow Stats` が **PUSH/POP TOTAL > 0** であること(C4/C5/C6 inline slots が生きている) --- ## Step 1: hakmem SSOT baseline(Standard / FAST PGO) 目的: Phase 89 と同じ条件で “今の値” を固定する(CV 付き)。 ```bash make bench_random_mixed_hakmem ./scripts/run_mixed_10_cleanenv.sh | tee /tmp/phase90_hakmem_standard_10run.log make pgo-fast-full BENCH_BIN=./bench_random_mixed_hakmem_minimal_pgo ./scripts/run_mixed_10_cleanenv.sh | tee /tmp/phase90_hakmem_fastpgo_10run.log ``` 記録(SSOTに必須): - `git rev-parse HEAD` - `Mean/Median/CV` - `HAKMEM_PROFILE` --- ## Step 2: allocator reference(短時間、長時間なし) 目的: “外部強者の位置” を数値で固定する(ただし reference)。 ```bash make bench_random_mixed_system bench_random_mixed_mi RUNS=10 scripts/run_allocator_quick_matrix.sh | tee /tmp/phase90_allocator_quick_matrix.log ``` 注意: - これは **reference**(別バイナリ/LD_PRELOAD が混ざる)。 - SSOT(最適化判断)は必ず Step 1 の同一儀式で行う。 --- ## Step 3: same-binary matrix(layout差を最小化、設計差を浮かせる) 目的: 「hakmemが遅い」の原因が “layout/ベンチ差” か “アルゴリズム/固定費” かを切り分ける。 ```bash make bench_random_mixed_system shared RUNS=10 scripts/run_allocator_preload_matrix.sh | tee /tmp/phase90_allocator_preload_matrix.log ``` 読み方: - `bench_random_mixed_hakmem*`(linked SSOT)と **同じ数値になる必要はない**(経路が違う)。 - ここで見るのは「同一入口(malloc/free)での相対差」。 --- ## Step 4: perf stat(同一カウンタで “差分の形” を固定) 目的: “速い/遅い” を命令/分岐/メモリのどれで負けているかに落とす。 ### hakmem(linked) ```bash perf stat -e cycles,instructions,branches,branch-misses,cache-misses,iTLB-load-misses,dTLB-load-misses \\ ./bench_random_mixed_hakmem 20000000 400 1 2>&1 | tee /tmp/phase90_perfstat_hakmem_linked.txt ``` ### system binary + LD_PRELOAD(tcmalloc/jemalloc/mimalloc) ```bash perf stat -e cycles,instructions,branches,branch-misses,cache-misses,iTLB-load-misses,dTLB-load-misses \\ env LD_PRELOAD=\"$TCMALLOC_SO\" ./bench_random_mixed_system 20000000 400 1 2>&1 | tee /tmp/phase90_perfstat_tcmalloc_preload.txt ``` --- ## Phase 90 の “設計判断” 出力(Phase 91 の入力) Phase 90 はここで終わり。次のどれを採用するかは **Step 1〜4 の差分**で決める。 ### A) 固定費(命令/分岐)が負けている(最頻パターン) 狙い: - per-op の “儀式”(route/policy/env/gate)を hot path から追放 - できる限り **commit-once / fixed mode** へ寄せる(ただし layout tax を避ける形で) 次フェーズ候補: - Phase 91: “Hot path contract” の再定義(どの箱を踏まないか、を SSOT 化) ### B) メモリ系(cache/TLB)が負けている 狙い: - TLS 構造のサイズ/配置、ptr→meta 到達、書き込み順序(dependency chain)を見直す 次フェーズ候補: - Phase 91: TLS struct packing / hot fields co-location(小さく、戻せる) ### C) 同一バイナリ(LD_PRELOAD)では差が小さい 狙い: - linked SSOT 側の “入口/配置/箱列” が重い(もしくはベンチ差分) 次フェーズ候補: - Phase 91: linked SSOT の入口を drop-in と揃える(比較の意味を合わせる) --- ## GO/NO-GO(Phase 90) Phase 90 は “計測と設計判断の SSOT 化” が成果物。 - **GO**: Step 0〜4 が再現可能(ログが揃い、差分の形が説明できる) - **NO-GO**: `HAKMEM_PROFILE` 未指定/ENV漏れ等で結果が破綻(先に SSOT 儀式を修正)