Major Features: - Debug counter infrastructure for Refill Stage tracking - Free Pipeline counters (ss_local, ss_remote, tls_sll) - Diagnostic counters for early return analysis - Unified larson.sh benchmark runner with profiles - Phase 6-3 regression analysis documentation Bug Fixes: - Fix SuperSlab disabled by default (HAKMEM_TINY_USE_SUPERSLAB) - Fix profile variable naming consistency - Add .gitignore patterns for large files Performance: - Phase 6-3: 4.79 M ops/s (has OOM risk) - With SuperSlab: 3.13 M ops/s (+19% improvement) This is a clean repository without large log files. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
479 lines
11 KiB
Markdown
479 lines
11 KiB
Markdown
# ACEとSuperSlabの関係性 - 徹底分析
|
||
|
||
**日付:** 2025-10-26
|
||
**分析:** ultrathink モード 🧠
|
||
|
||
---
|
||
|
||
## 🎯 現状:完全に独立
|
||
|
||
### ACE(Adaptive Cache Engine)の範囲
|
||
|
||
**対象:** Mid Pool & Large Pool
|
||
|
||
```c
|
||
// hakmem_policy.c:14-21
|
||
pol->tiny_cap[0] = 2048; // ← Tiny Pool(固定CAP)
|
||
pol->tiny_cap[1] = 1024;
|
||
// ... (ACE管理外)
|
||
|
||
// hakmem_policy.c:43-50
|
||
uint16_t mid_defaults[7] = { 64, 64, 64, 32, 16, 32, 32 }; // ← ACE管理
|
||
uint16_t large_defaults[5] = { 8, 8, 4, 2, 1 }; // ← ACE管理
|
||
```
|
||
|
||
**サイズ範囲:**
|
||
- ❌ Tiny Pool: 8-64B(ACE対象外)
|
||
- ✅ Mid Pool: 2KB-64KB(**ACEが最適化**)
|
||
- ✅ Large Pool: 128KB-1MB(**ACEが最適化**)
|
||
|
||
### SuperSlabの範囲
|
||
|
||
**対象:** Tiny Pool のみ
|
||
|
||
```c
|
||
// hakmem_tiny.c
|
||
// SuperSlabはTiny Pool(8-64B)専用
|
||
static inline void* hak_tiny_alloc_superslab(int class_idx) {
|
||
// class_idx: 0-7(8B, 16B, 24B, 32B, 40B, 48B, 56B, 64B)
|
||
}
|
||
```
|
||
|
||
**結論:** ACEとSuperSlabは**完全に独立** ✅
|
||
|
||
---
|
||
|
||
## 🧠 ACEの4学習軸(復習)
|
||
|
||
### 1. 器の数(サイズクラス数)
|
||
|
||
**Mid Pool例:**
|
||
```c
|
||
// 固定5クラス
|
||
2KB, 4KB, 8KB, 16KB, 32KB
|
||
|
||
// + DYN1(動的1枠) ← Phase 6.21で無効化
|
||
// 理由:「動的1個だけ = 固定と同じ」(あなたの指摘通り!)
|
||
|
||
// + Bridgeクラス(固定追加)
|
||
40KB, 52KB // 32KB-64KBのギャップ埋め
|
||
```
|
||
|
||
**学習メカニズム:**
|
||
- ヒストグラムからピーク検出
|
||
- 最適な境界を自動設定
|
||
- でも**現在は固定7クラスに変更**(Phase 6.21)
|
||
|
||
### 2. 器の形(サイズ境界・W_MAX丸め)
|
||
|
||
**W_MAX = 許容度:**
|
||
```c
|
||
// 例: W_MAX = 1.4
|
||
24KB要求 → 32KBクラスを許可(24 ≤ 1.4 × 32 = 44.8)
|
||
```
|
||
|
||
**学習:** UCB1バンディットで最適W_MAX探索
|
||
|
||
### 3. 器の量(CAP/在庫量)
|
||
|
||
**目標ヒット率ベースの調整:**
|
||
```c
|
||
Mid Pool: 目標65%ヒット率
|
||
→ 不足なら CAP += 4ページ
|
||
→ 過剰なら CAP -= 2ページ
|
||
|
||
Large Pool: 目標55%ヒット率
|
||
→ 同様に調整
|
||
```
|
||
|
||
**これが最も重要な学習!**
|
||
|
||
### 4. 器の配置(しきい値)
|
||
|
||
**THPしきい値:**
|
||
```c
|
||
デフォルト: 2MB
|
||
学習で最適化: 512KB-4MB
|
||
```
|
||
|
||
**Canary方式:**
|
||
- 5%でトライアル
|
||
- 改善確認後に本採用
|
||
|
||
---
|
||
|
||
## ❌ なぜACEをTiny Poolに適用しないのか?
|
||
|
||
### 理由1: サイズ範囲が小さすぎる
|
||
|
||
**Tiny Pool:** 8B, 16B, 24B, 32B, 40B, 48B, 56B, 64B
|
||
- 8段階のみ
|
||
- 各サイズが8Bずつ(密集)
|
||
- 動的化の余地がほぼない
|
||
|
||
**Mid Pool:** 2KB-64KB
|
||
- 範囲が広い(32倍)
|
||
- 動的最適化の価値あり
|
||
|
||
### 理由2: TLS Magazineで十分
|
||
|
||
**Tiny Poolの最適化戦略:**
|
||
```c
|
||
// Magazine CAP(固定)
|
||
pol->tiny_cap[0] = 2048; // 8B: 2048個
|
||
pol->tiny_cap[1] = 1024; // 16B: 1024個
|
||
// ...
|
||
|
||
// 小さいサイズ = 多くキャッシュ
|
||
// 大きいサイズ = 少なくキャッシュ
|
||
```
|
||
|
||
この固定CAPで**ヒット率90%以上**達成済み!
|
||
|
||
### 理由3: SuperSlabで十分高速
|
||
|
||
**SuperSlabの強み:**
|
||
- O(1) pointer-to-slab lookup
|
||
- TLS-local allocation(ロック不要)
|
||
- Bitmapによる高速ブロック検索
|
||
|
||
**ACE追加の価値:**
|
||
- CAP調整?→ Magazine CAPで十分
|
||
- サイズクラス最適化?→ 8B刻みで最適
|
||
- しきい値調整?→ 適用対象なし
|
||
|
||
**結論:** ACE不要 ✅
|
||
|
||
---
|
||
|
||
## 🔮 将来的な統合の可能性
|
||
|
||
### 可能性1: Tiny Magazine CAPの動的化
|
||
|
||
**現状:** 固定CAP
|
||
```c
|
||
pol->tiny_cap[0] = 2048; // 固定
|
||
pol->tiny_cap[1] = 1024;
|
||
```
|
||
|
||
**ACE適用:**
|
||
```c
|
||
// ヒット率ベースのCAP調整
|
||
if (tiny_hit_rate[0] < 0.90) {
|
||
pol->tiny_cap[0] += 256; // CAP増加
|
||
}
|
||
if (tiny_hit_rate[0] > 0.95 && tiny_cap[0] > 1024) {
|
||
pol->tiny_cap[0] -= 128; // CAP削減(メモリ節約)
|
||
}
|
||
```
|
||
|
||
**価値:**
|
||
- ⭐⭐☆☆☆(低)
|
||
- 理由:現状のヒット率がすでに高い
|
||
|
||
### 可能性2: SuperSlabサイズの最適化
|
||
|
||
**現状:** 固定2MB
|
||
```c
|
||
#define SUPERSLAB_SIZE (2 * 1024 * 1024) // 固定
|
||
```
|
||
|
||
**ACE適用:**
|
||
```c
|
||
// ワークロード適応型サイズ
|
||
if (small_workload) {
|
||
superslab_size = 512KB; // 小規模WL
|
||
} else {
|
||
superslab_size = 4MB; // 大規模WL
|
||
}
|
||
```
|
||
|
||
**UCB1学習:**
|
||
```c
|
||
// 各サイズでトライアル
|
||
512KB, 1MB, 2MB, 4MB, 8MB
|
||
|
||
// 報酬 = (ヒット率 × 性能) - (メモリコスト)
|
||
reward = hit_rate * throughput - (memory_mb / 100);
|
||
|
||
// 最適サイズを選択
|
||
best_size = argmax(ucb1_score);
|
||
```
|
||
|
||
**価値:**
|
||
- ⭐⭐⭐⭐☆(中~高)
|
||
- 理由:メモリ効率とキャッシュ効率のトレードオフ
|
||
- でも**Phase 7.6で動的割当実装後**なら、固定サイズでも問題少ない
|
||
|
||
### 可能性3: Tiny Poolサイズクラスの動的化
|
||
|
||
**現状:** 固定8クラス
|
||
```c
|
||
static size_t g_tiny_class_sizes[8] = {
|
||
8, 16, 24, 32, 40, 48, 56, 64
|
||
};
|
||
```
|
||
|
||
**ACE適用:**
|
||
```c
|
||
// ヒストグラムベースの最適化
|
||
// 例: 12Bが多い → 8,12,16,24,32... に変更
|
||
if (histogram[12] > threshold) {
|
||
add_dynamic_class(12);
|
||
}
|
||
```
|
||
|
||
**問題点:**
|
||
- ✅ Mid Poolと同じ「動的1個問題」
|
||
- ✅ 8B刻みですでに密集
|
||
- ✅ 追加の価値が薄い
|
||
|
||
**価値:**
|
||
- ⭐☆☆☆☆(極めて低)
|
||
- 理由:固定8クラスで十分カバー
|
||
|
||
---
|
||
|
||
## 🎓 ACEの本質:なぜMid/Largeで有効か?
|
||
|
||
### Mid/Large Poolの特徴
|
||
|
||
**サイズ範囲が広い:**
|
||
```
|
||
Mid: 2KB - 64KB (32倍の範囲)
|
||
Large: 128KB - 1MB (8倍の範囲)
|
||
```
|
||
|
||
**ワークロード依存性が高い:**
|
||
- あるアプリ:4KBが多い
|
||
- 別のアプリ:16KBが多い
|
||
- ワークロードで最適CAP/境界が変わる
|
||
|
||
**ACEの価値:**
|
||
- ✅ ワークロード適応
|
||
- ✅ 自動チューニング
|
||
- ✅ 性能とメモリのバランス
|
||
|
||
### Tiny Poolの特徴
|
||
|
||
**サイズ範囲が狭い:**
|
||
```
|
||
Tiny: 8B - 64B (8倍の範囲、しかも8B刻み)
|
||
```
|
||
|
||
**普遍的なパターン:**
|
||
- 16Bが多い(ポインタ + メタデータ)
|
||
- 32Bが多い(小構造体)
|
||
- ワークロードで大差なし
|
||
|
||
**固定最適化で十分:**
|
||
- ✅ Magazine CAPは固定
|
||
- ✅ SuperSlabで高速
|
||
- ✅ ACE不要
|
||
|
||
---
|
||
|
||
## 📊 数値的根拠
|
||
|
||
### bench_comprehensive_hakmem の結果
|
||
|
||
**Tiny Pool(16B):**
|
||
```
|
||
Throughput: 163 M ops/sec
|
||
Hit Rate: 95%+(推定)
|
||
Memory: minimal(SuperSlabで効率化済み)
|
||
|
||
→ ACE追加の余地なし
|
||
```
|
||
|
||
**Mid Pool(4KB):**
|
||
```
|
||
Throughput: varies by workload
|
||
Hit Rate: 65-75%(ACEで改善中)
|
||
Memory: ACEで最適化
|
||
|
||
→ ACE有効!
|
||
```
|
||
|
||
### test_scaling の結果
|
||
|
||
**Tiny Pool(16B):**
|
||
```
|
||
現状: 40.8 MB RSS (168% overhead)
|
||
Phase 7.6: 17-20 MB RSS (30-50% overhead)
|
||
|
||
→ SuperSlab動的化で解決
|
||
→ ACE不要
|
||
```
|
||
|
||
---
|
||
|
||
## 🔄 Phase 7.6とACEの関係
|
||
|
||
### Phase 7.6: SuperSlab完全動的化
|
||
|
||
**範囲:** Tiny Pool
|
||
**手法:** Bitmap-based lazy allocation + eager deallocation
|
||
**ACE使用:** ❌ なし
|
||
|
||
**理由:**
|
||
- SuperSlabサイズは固定2MB(十分)
|
||
- Magazine CAPは固定(十分)
|
||
- サイズクラスは固定8個(十分)
|
||
|
||
### ACE: Mid/Large Pool最適化
|
||
|
||
**範囲:** Mid/Large Pool
|
||
**手法:** UCB1 + ヒストグラム学習
|
||
**SuperSlab使用:** ❌ なし
|
||
|
||
**理由:**
|
||
- Mid/LargeはBuddy allocator
|
||
- SuperSlabはTiny専用
|
||
- 完全に独立
|
||
|
||
---
|
||
|
||
## 🎯 結論:独立性のメリット
|
||
|
||
### 設計の美しさ
|
||
|
||
**各層が最適化手法を持つ:**
|
||
```
|
||
Tiny Pool (8-64B):
|
||
└─ SuperSlab(2MB aligned, bitmap, O(1) lookup)
|
||
└─ TLS Magazine(固定CAP)
|
||
└─ Phase 7.6: 完全動的化
|
||
|
||
Mid Pool (2KB-64KB):
|
||
└─ Buddy allocator
|
||
└─ ACE(UCB1学習)
|
||
└─ Bridge classes(固定最適化)
|
||
|
||
Large Pool (128KB-1MB):
|
||
└─ Buddy allocator
|
||
└─ ACE(ヒット率ベース)
|
||
└─ THP support
|
||
```
|
||
|
||
**独立性の利点:**
|
||
- ✅ 各層が独立して最適化できる
|
||
- ✅ 相互干渉なし
|
||
- ✅ メンテナンス容易
|
||
- ✅ 段階的改善可能
|
||
|
||
### Phase 7.6の位置づけ
|
||
|
||
**ACEとは別の最適化:**
|
||
- ACE = Mid/Large の**学習ベース**最適化
|
||
- Phase 7.6 = Tiny の**設計ベース**最適化
|
||
|
||
**補完関係:**
|
||
- どちらも「動的最適化」
|
||
- でも手法が異なる
|
||
- お互いに干渉しない
|
||
|
||
**論文的価値:**
|
||
- ACE: "Learning-based adaptive caching"
|
||
- Phase 7.6: "Bitmap-based dynamic allocation"
|
||
- **両方を持つことで包括的な最適化を実証!**
|
||
|
||
---
|
||
|
||
## 🚀 Phase 8以降の可能性
|
||
|
||
### 統一学習フレームワーク?
|
||
|
||
**仮想的な設計:**
|
||
```c
|
||
// Phase 8: Unified Learning Framework?
|
||
|
||
struct HakmemLearner {
|
||
// Tiny Pool学習
|
||
TinyLearner tiny; // Magazine CAP, SuperSlab size?
|
||
|
||
// Mid Pool学習(既存ACE)
|
||
ACELearner mid;
|
||
|
||
// Large Pool学習(既存ACE)
|
||
ACELearner large;
|
||
|
||
// グローバル最適化
|
||
GlobalOptimizer global; // メモリ全体のバランス
|
||
};
|
||
```
|
||
|
||
**でも今は不要:**
|
||
- Tiny Poolは固定で十分高性能
|
||
- Mid/LargeはACEで最適化済み
|
||
- 統一の価値が薄い
|
||
|
||
### より現実的な拡張
|
||
|
||
**Phase 7.6完成後の次ステップ:**
|
||
|
||
1. **Magazine flushの最適化**
|
||
```c
|
||
// Magazine満杯時のspill戦略を学習?
|
||
// でも現状で十分...
|
||
```
|
||
|
||
2. **SuperSlab初期化の遅延度調整**
|
||
```c
|
||
// プリフェッチ vs 完全遅延
|
||
// UCB1で最適戦略選択?
|
||
```
|
||
|
||
3. **Cross-pool最適化**
|
||
```c
|
||
// Tiny/Mid境界の動的調整
|
||
// 64B vs 2KBのしきい値学習?
|
||
```
|
||
|
||
**優先度:** 低(現状で十分)
|
||
|
||
---
|
||
|
||
## 📚 まとめ
|
||
|
||
### 現状
|
||
|
||
| Pool | サイズ | 最適化手法 | 学習 | 状態 |
|
||
|------|--------|-----------|------|------|
|
||
| Tiny | 8-64B | SuperSlab + Magazine | ❌ | Phase 7.6で完全動的化中 |
|
||
| Mid | 2KB-64KB | Buddy + Bridge | ✅ ACE | 完成 |
|
||
| Large | 128KB-1MB | Buddy + THP | ✅ ACE | 完成 |
|
||
|
||
### Phase 7.6の立ち位置
|
||
|
||
**ACEとは独立:**
|
||
- ✅ 対象が異なる(Tiny vs Mid/Large)
|
||
- ✅ 手法が異なる(設計最適化 vs 学習最適化)
|
||
- ✅ お互いに干渉しない
|
||
|
||
**補完関係:**
|
||
- ACE: ワークロード適応型学習
|
||
- Phase 7.6: Bitmap柔軟性活用
|
||
- **両方で包括的最適化!**
|
||
|
||
### あなたの質問への回答
|
||
|
||
**Q: Magazineが先?**
|
||
→ **A: YES!** Step 1(Magazine統合)が最優先
|
||
|
||
**Q: 学習方法は今何?ACE?**
|
||
→ **A: Phase 7.6はACE不使用**
|
||
- ACEはMid/Large専用
|
||
- Tiny Poolは固定最適化で十分
|
||
- SuperSlabの動的化は設計ベース(学習不要)
|
||
|
||
**Q: ACE ultrathink**
|
||
→ **A: 完全に独立、でも補完関係!**
|
||
- 各Poolが最適な手法で最適化
|
||
- 統一の必要なし
|
||
- むしろ独立性が美しい
|
||
|
||
---
|
||
|
||
**次:** Step 1(Magazine統合)の実装を始めましょう!🔥🐱
|