Files
hakmem/docs/archive/ACE_AND_SUPERSLAB.md
Moe Charm (CI) 0546454168 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

479 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ACEとSuperSlabの関係性 - 徹底分析
**日付:** 2025-10-26
**分析:** ultrathink モード 🧠
---
## 🎯 現状:完全に独立
### 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統合の実装を始めましょう🔥🐱