Files
hakmem/docs/analysis/PHASE90_STRUCTURAL_REVIEW_AND_GAP_TRIAGE_SSOT.md
2025-12-19 03:45:01 +09:00

5.4 KiB
Raw Blame History

Phase 90: Structural Review & Gap Triagemimalloc/tcmalloc 差分を“設計”に落とす SSOT

目的: 「layout tax を疑う/疑わない」以前に、差分がどこから来ているかを “同じ儀式” で毎回再現し、次の構造案Phase 91+)を決める。

前提:

  • SSOT runner性能の正: scripts/run_mixed_10_cleanenv.shITERS=20000000 WS=400 RUNS=10
  • OBSERVE runner経路の正: scripts/run_mixed_observe_ssot.shtelemetry込み、性能比較に使わない
  • 現行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経路確認、性能ではない

目的: “踏んでない最適化” を排除する。

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 StatsPUSH/POP TOTAL > 0 であることC4/C5/C6 inline slots が生きている)

Step 1: hakmem SSOT baselineStandard / FAST PGO

目的: Phase 89 と同じ条件で “今の値” を固定するCV 付き)。

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

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/ベンチ差” か “アルゴリズム/固定費” かを切り分ける。

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

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

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 儀式を修正)