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]
|
|||
|
|
```
|
|||
|
|
|