Files
hakmem/docs/analysis/PHASE90_STRUCTURAL_REVIEW_AND_GAP_TRIAGE_SSOT.md

146 lines
5.4 KiB
Markdown
Raw Normal View History

# Phase 90: Structural Review & Gap Triagemimalloc/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込み、性能比較に使わない
- 現行SSOTPhase 89: `docs/analysis/PHASE89_SSOT_MEASUREMENT.md`
非目標:
- 長時間 soak5分/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 baselineStandard / 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 matrixlayout差を最小化、設計差を浮かせる
目的: 「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同一カウンタで “差分の形” を固定)
目的: “速い/遅い” を命令/分岐/メモリのどれで負けているかに落とす。
### hakmemlinked
```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_PRELOADtcmalloc/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-GOPhase 90
Phase 90 は “計測と設計判断の SSOT 化” が成果物。
- **GO**: Step 0〜4 が再現可能(ログが揃い、差分の形が説明できる)
- **NO-GO**: `HAKMEM_PROFILE` 未指定/ENV漏れ等で結果が破綻先に SSOT 儀式を修正)