# Phase 92: tcmalloc Gap Triage SSOT ## 目的 Phase 89 で検出した tcmalloc との性能ギャップ(hakmem: 52M vs tcmalloc: 58M)を**短時間で**原因分類する。 --- ## 既知事実(Phase 89 から継承) - **hakmem baseline**: 51.36M ops/s (SSOT standard) - **tcmalloc**: 58M ops/s 付近(参考値) - **差分**: -12.8%( hakmem が遅い) --- ## Phase 92 Triage フロー(最短 1-2h) ### 1️⃣ **ケース A:小オブジェクト(C4-C6) vs 大オブジェクト(C7+)** **疑問**: tcmalloc の優位は「小サイズに特化」か「大サイズに強い」か? **実施**: ```bash # C6 のみ(Small, 16-256B) HAKMEM_BENCH_C6_ONLY=1 RUNS=3 ./scripts/run_mixed_10_cleanenv.sh # C7 のみ(Large, 1024B+) HAKMEM_BENCH_C7_ONLY=1 RUNS=3 ./scripts/run_mixed_10_cleanenv.sh ``` **判定**: - C6 > 52M, C7 < 45M → **問題は Large alloc(C7)** - C6 < 50M, C7 < 45M → **問題は均等分散** - C6 > 52M, C7 > 48M → **問題は別(メモリ効率?)** --- ### 2️⃣ **ケース B:Unified Cache vs Inline Slots** **疑問**: tcmalloc 優位は「キャッシュ管理」か「インライン最適化」か? **実施**: ```bash # Inline Slots 全無効 HAKMEM_TINY_C6_INLINE_SLOTS=0 HAKMEM_TINY_C5_INLINE_SLOTS=0 \ HAKMEM_TINY_C4_INLINE_SLOTS=0 RUNS=3 ./scripts/run_mixed_10_cleanenv.sh # Unified Cache のみ(inline slots 全 OFF) HAKMEM_UNIFIED_CACHE_ONLY=1 RUNS=3 ./scripts/run_mixed_10_cleanenv.sh ``` **判定**: - `-inline > 50M` → **inline slots オーバーヘッド** - `-inline < 48M` → **unified cache 自体が遅い** --- ### 3️⃣ **ケース C:フラグメンテーション/再利用効率** **疑問**: LIFO vs FIFO の差、または tcmalloc の再利用戦略の優位性? **実施**: ```bash # LIFO 有効(phase 15) HAKMEM_TINY_UNIFIED_LIFO=1 RUNS=3 ./scripts/run_mixed_10_cleanenv.sh # FIFO(default) RUNS=3 ./scripts/run_mixed_10_cleanenv.sh ``` **判定**: - LIFO > +1% → **FIFO が問題候補** - LIFO = FIFO ± 0.5% → **LIFO/FIFO は neutral** --- ### 4️⃣ **ケース D:ページサイズ/プールサイズ** **疑問**: tcmalloc と hakmem のメモリレイアウト / warm pool size の違い? **実施**: ```bash # 大プール(確保多く、断片化少なく) HAKMEM_WARM_POOL_SIZE=100000 RUNS=3 ./scripts/run_mixed_10_cleanenv.sh # 小プール(確保少なく、効率見直し) HAKMEM_WARM_POOL_SIZE=1000 RUNS=3 ./scripts/run_mixed_10_cleanenv.sh # デフォルト RUNS=3 ./scripts/run_mixed_10_cleanenv.sh ``` **判定**: - pool big > baseline → **プール不足(確保過多)** - pool small < baseline → **プール不足(メモリ不足)** - pool default = baseline → **pool size neutral** --- ## 測定時間見積もり | ケース | 実施数 | 時間/実施 | 合計 | |--------|--------|----------|------| | A (C6/C7) | 2×3=6 | 2 min | 12 min | | B (inline) | 2×3=6 | 2 min | 12 min | | C (LIFO) | 2×3=6 | 2 min | 12 min | | D (pool) | 3×3=9 | 2 min | 18 min | | **合計** | - | - | **54 min** | --- ## 判定マトリクス | ケース | 結果 | 判定 | 次アクション | |--------|------|------|-------------| | A | C6 > 52M, C7 低 | C7 が制限 | Phase 93: C7 最適化 | | B | -inline > 50M | Inline 段階的 OFF | Phase 94: Inline review | | C | LIFO > +1% | LIFO 推奨 | Phase 92b: LIFO 展開 | | D | pool_big > +2% | 確保が重い | Phase 95: Pool tuning | --- ## 記録フォーマット 結果は下記フォーマットで PHASE92_TCMALLOC_GAP_RESULTS.txt に記録: ``` === Phase 92 Triage Results === Baseline (51.36M): [ENTER CONTROL VALUE] ケース A (C6 vs C7): C6-only: [VALUE] ops/s C7-only: [VALUE] ops/s 判定: [CONCLUSION] ケース B (Inline vs Unified): No-inline: [VALUE] ops/s Unified-only: [VALUE] ops/s 判定: [CONCLUSION] ケース C (LIFO vs FIFO): LIFO: [VALUE] ops/s FIFO: [VALUE] ops/s 判定: [CONCLUSION] ケース D (Pool sizing): Pool-big: [VALUE] ops/s Pool-small: [VALUE] ops/s Pool-default: [VALUE] ops/s 判定: [CONCLUSION] === FINAL VERDICT === Primary bottleneck: [A|B|C|D|MIXED] Next phase: Phase 9x [recommendation] ```