146 lines
5.4 KiB
Markdown
146 lines
5.4 KiB
Markdown
|
|
# 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 儀式を修正)
|
|||
|
|
|