158 lines
4.2 KiB
Markdown
158 lines
4.2 KiB
Markdown
# 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]
|
||
```
|
||
|