Files
hakmem/docs/archive/ACE_AND_SUPERSLAB.md

479 lines
11 KiB
Markdown
Raw Normal View History

# ACEとSuperSlabの関係性 - 徹底分析
**日付:** 2025-10-26
**分析:** ultrathink モード 🧠
---
## 🎯 現状:完全に独立
WIP: Add TLS SLL validation and SuperSlab registry fallback ChatGPT's diagnostic changes to address TLS_SLL_HDR_RESET issue. Current status: Partial mitigation, but root cause remains. Changes Applied: 1. SuperSlab Registry Fallback (hakmem_super_registry.h) - Added legacy table probe when hash map lookup misses - Prevents NULL returns for valid SuperSlabs during initialization - Status: ✅ Works but may hide underlying registration issues 2. TLS SLL Push Validation (tls_sll_box.h) - Reject push if SuperSlab lookup returns NULL - Reject push if class_idx mismatch detected - Added [TLS_SLL_PUSH_NO_SS] diagnostic message - Status: ✅ Prevents list corruption (defensive) 3. SuperSlab Allocation Class Fix (superslab_allocate.c) - Pass actual class_idx to sp_internal_allocate_superslab - Prevents dummy class=8 causing OOB access - Status: ✅ Root cause fix for allocation path 4. Debug Output Additions - First 256 push/pop operations traced - First 4 mismatches logged with details - SuperSlab registration state logged - Status: ✅ Diagnostic tool (not a fix) 5. TLS Hint Box Removed - Deleted ss_tls_hint_box.{c,h} (Phase 1 optimization) - Simplified to focus on stability first - Status: ⏳ Can be re-added after root cause fixed Current Problem (REMAINS UNSOLVED): - [TLS_SLL_HDR_RESET] still occurs after ~60 seconds of sh8bench - Pointer is 16 bytes offset from expected (class 1 → class 2 boundary) - hak_super_lookup returns NULL for that pointer - Suggests: Use-After-Free, Double-Free, or pointer arithmetic error Root Cause Analysis: - Pattern: Pointer offset by +16 (one class 1 stride) - Timing: Cumulative problem (appears after 60s, not immediately) - Location: Header corruption detected during TLS SLL pop Remaining Issues: ⚠️ Registry fallback is defensive (may hide registration bugs) ⚠️ Push validation prevents symptoms but not root cause ⚠️ 16-byte pointer offset source unidentified Next Steps for Investigation: 1. Full pointer arithmetic audit (Magazine ⇔ TLS SLL paths) 2. Enhanced logging at HDR_RESET point: - Expected vs actual pointer value - Pointer provenance (where it came from) - Allocation trace for that block 3. Verify Headerless flag is OFF throughout build 4. Check for double-offset application in conversions Technical Assessment: - 60% root cause fixes (allocation class, validation) - 40% defensive mitigation (registry fallback, push rejection) Performance Impact: - Registry fallback: +10-30 cycles on cold path (negligible) - Push validation: +5-10 cycles per push (acceptable) - Overall: < 2% performance impact estimated Related Issues: - Phase 1 TLS Hint Box removed temporarily - Phase 2 Headerless blocked until stability achieved 🤖 Generated with Claude Code (https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-12-03 20:42:28 +09:00
### ACEAgentic Context Engineering / 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-64BACE対象外
- ✅ Mid Pool: 2KB-64KB**ACEが最適化**
- ✅ Large Pool: 128KB-1MB**ACEが最適化**
### SuperSlabの範囲
**対象:** Tiny Pool のみ
```c
// hakmem_tiny.c
// SuperSlabはTiny Pool8-64B専用
static inline void* hak_tiny_alloc_superslab(int class_idx) {
// class_idx: 0-78B, 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 Pool16B**
```
Throughput: 163 M ops/sec
Hit Rate: 95%+(推定)
Memory: minimalSuperSlabで効率化済み
→ ACE追加の余地なし
```
**Mid Pool4KB**
```
Throughput: varies by workload
Hit Rate: 65-75%ACEで改善中
Memory: ACEで最適化
→ ACE有効
```
### test_scaling の結果
**Tiny Pool16B**
```
現状: 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):
└─ SuperSlab2MB aligned, bitmap, O(1) lookup
└─ TLS Magazine固定CAP
└─ Phase 7.6: 完全動的化
Mid Pool (2KB-64KB):
└─ Buddy allocator
└─ ACEUCB1学習
└─ 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 1Magazine統合が最優先
**Q: 学習方法は今何ACE**
**A: Phase 7.6はACE不使用**
- ACEはMid/Large専用
- Tiny Poolは固定最適化で十分
- SuperSlabの動的化は設計ベース学習不要
**Q: ACE ultrathink**
**A: 完全に独立、でも補完関係!**
- 各Poolが最適な手法で最適化
- 統一の必要なし
- むしろ独立性が美しい
---
**次:** Step 1Magazine統合の実装を始めましょう🔥🐱