Files
hakmem/docs/archive/RANDOM_MIXED_SUMMARY.md

149 lines
5.9 KiB
Markdown
Raw Normal View History

Wrap debug fprintf in !HAKMEM_BUILD_RELEASE guards (Release build optimization) ## Changes ### 1. core/page_arena.c - Removed init failure message (lines 25-27) - error is handled by returning early - All other fprintf statements already wrapped in existing #if !HAKMEM_BUILD_RELEASE blocks ### 2. core/hakmem.c - Wrapped SIGSEGV handler init message (line 72) - CRITICAL: Kept SIGSEGV/SIGBUS/SIGABRT error messages (lines 62-64) - production needs crash logs ### 3. core/hakmem_shared_pool.c - Wrapped all debug fprintf statements in #if !HAKMEM_BUILD_RELEASE: - Node pool exhaustion warning (line 252) - SP_META_CAPACITY_ERROR warning (line 421) - SP_FIX_GEOMETRY debug logging (line 745) - SP_ACQUIRE_STAGE0.5_EMPTY debug logging (line 865) - SP_ACQUIRE_STAGE0_L0 debug logging (line 803) - SP_ACQUIRE_STAGE1_LOCKFREE debug logging (line 922) - SP_ACQUIRE_STAGE2_LOCKFREE debug logging (line 996) - SP_ACQUIRE_STAGE3 debug logging (line 1116) - SP_SLOT_RELEASE debug logging (line 1245) - SP_SLOT_FREELIST_LOCKFREE debug logging (line 1305) - SP_SLOT_COMPLETELY_EMPTY debug logging (line 1316) - Fixed lock_stats_init() for release builds (lines 60-65) - ensure g_lock_stats_enabled is initialized ## Performance Validation Before: 51M ops/s (with debug fprintf overhead) After: 49.1M ops/s (consistent performance, fprintf removed from hot paths) ## Build & Test ```bash ./build.sh larson_hakmem ./out/release/larson_hakmem 1 5 1 1000 100 10000 42 # Result: 49.1M ops/s ``` Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 13:14:18 +09:00
# Random Mixed ボトルネック分析 - 返答フォーマット
## Random Mixed ボトルネック分析
### 1. Cycles 分布
| Layer | Target Classes | Hit Rate | Cycles | Status |
|-------|---|---|---|---|
| Ring Cache | C2-C3 only | 0% (OFF) | N/A | Not enabled |
| HeapV2 | C0-C3 | 88-99% | Low (2-3) | Working ✅ |
| TLS SLL | C0-C7 | 0.7-2.7% | Medium (8-12) | Fallback only |
| **SuperSlab refill** | **All classes** | **~2-5% miss** | **High (50-200)** | **BOTTLENECK** 🔥 |
| UltraHot | C1-C2 | N/A | Medium | OFF (Phase 19) |
- **Ring Cache**: Low (2-3 cycles) - ポインタチェイス削減(未使用)
- **HeapV2**: Low (2-3 cycles) - Magazine供給C0-C3のみ有効
- **TLS SLL**: Medium (8-12 cycles) - Fallback層、複数classで枯渇
- **SuperSlab refill**: High (50-200 cycles) - Metadata走査+carving支配的
- **UltraHot**: Medium - デフォルトOFFPhase 19で削除
**ボトルネック**: **SuperSlab refill** (50-200 cycles/refill) - Random Mixed では class切り替え多発により TLS SLL が頻繁に空になり、refill多発
---
### 2. FrontMetrics 状況
- **実装**: ✅ ある (`core/box/front_metrics_box.{h,c}`)
- **HeapV2**: 88-99% ヒット率 → C0-C3 では本命層として機能中
- **UltraHot**: デフォルト OFF Phase 19-4で +12.9% 改善のため削除)
- **FC/SFC**: 実質無効化
**Fixed vs Mixed の違い**:
| 側面 | Fixed 256B | Random Mixed |
|------|---|---|
| 使用クラス | C5 のみ | C3, C5, C6, C7 (混在) |
| Class切り替え | 0 (固定) | 頻繁 (毎iteration) |
| HeapV2適用 | 非適用 | C0-C3のみ部分|
| TLS SLL hit率 | High | Low複数class枯渇|
| Refill頻度 | **低いC5 warm保持** | **高いclass毎に空** |
**死んでいる層**: **C4-C7 (128B-1KB) が全く最適化されていない**
- C0-C3: HeapV2 ✅
- C4: Ring ❌, HeapV2 ❌, UltraHot ❌ → 素のTLS SLL + refill
- C5: Ring ❌, HeapV2 ❌, UltraHot ❌ → 素のTLS SLL + refill
- C6: Ring ❌, HeapV2 ❌, UltraHot ❌ → 素のTLS SLL + refill
- C7: Ring ❌, HeapV2 ❌, UltraHot ❌ → 素のTLS SLL + refill
Random Mixed で使用されるクラスの **50%以上** が完全未最適化!
---
### 3. Class別プロファイル
**使用クラス** (bench_random_mixed.c:77 分析):
```c
size_t sz = 16u + (r & 0x3FFu); // 16B-1040B
→ C2 (16-31B), C3 (32-63B), C4 (64-127B), C5 (128-255B), C6 (256-511B), C7 (512-1024B)
```
**最適化カバレッジ**:
- Ring Cache: 4個クラス対応済みC0-C7だが **デフォルト OFF**
- `HAKMEM_TINY_HOT_RING_ENABLE=0` (有効化されていない)
- HeapV2: 4個クラス対応C0-C3
- C4-C7 に拡張可能だが Phase 17-1 実験で +0.3% のみ効果
- 素のTLS SLL: 全クラスfallback
**素のTLS SLL 経路の割合**:
- C0-C3: ~88-99% HeapV2TLS SLL は2-12% fallback
- **C4-C7: ~100% TLS SLL + SuperSlab refill**(最適化なし)
---
### 4. 推奨施策(優先度順)
#### 1. **最優先**: Ring Cache C4/C7 拡張
- **効果推定**: **High (+13-29%)**
- **理由**:
- Phase 21-1 で実装済み(`core/front/tiny_ring_cache.h`
- C2-C3 未使用(デフォルト OFF
- **ポインタチェイス削減**: TLS SLL 3mem → Ring 2mem (-33%)
- Random Mixed の C4-C7 (50%) をカバー可能
- **実装期間**: **低** (ENV 有効化のみ、≦1日)
- **リスク**: **低** (既実装、有効化のみ)
- **期待値**: 19.4M → 22-25M ops/s (25-28%)
- **有効化**:
```bash
export HAKMEM_TINY_HOT_RING_ENABLE=1
export HAKMEM_TINY_HOT_RING_C4=128
export HAKMEM_TINY_HOT_RING_C5=128
export HAKMEM_TINY_HOT_RING_C6=64
export HAKMEM_TINY_HOT_RING_C7=64
```
#### 2. **次点**: HeapV2 を C4/C5 に拡張
- **効果推定**: **Low to Medium (+2-5%)**
- **理由**:
- Phase 13-A で実装済み(`core/front/tiny_heap_v2.h`
- Magazine supply で TLS SLL hit rate 向上
- **制限**: Phase 17-1 実験で +0.3% のみdelegation overhead = TLS savings
- **実装期間**: **低** (ENV 変更のみ)
- **リスク**: **低**
- **期待値**: 19.4M → 19.8-20.4M ops/s (+2-5%)
- **判断**: Ring Cache の方が効果的Ring を優先)
#### 3. **長期**: C7 (1KB) 専用 HotPath
- **効果推定**: **Medium (+5-10%)**
- **理由**: C7 は Random Mixed の ~16% を占める
- **実装期間**: **高**(新規実装)
- **判断**: 後回しRing Cache + Phase 21-2 後に検討)
#### 4. **超長期**: SuperSlab Shared Pool (Phase 12)
- **効果推定**: **VERY HIGH (+300-400%)**
- **理由**: 877 SuperSlab → 100-200 削減(根本解決)
- **実装期間**: **Very High**(アーキテクチャ変更)
- **期待値**: 70-90M ops/sSystem の 70-90%
- **判断**: Phase 21 完了後に着手
---
## 最終推奨(フォーマット通り)
### 優先度付き推奨施策
1. **最優先**: **Ring Cache C4/C7 有効化**
- 理由: ポインタチェイス削減で +13-29% 期待、実装済み(有効化のみ)
- 期待: 19.4M → 22-25M ops/s (25-28% of system)
2. **次点**: **HeapV2 C4/C5 拡張**
- 理由: TLS refill 削減で +2-5% 期待、ただし Ring より効果薄
- 期待: 19.4M → 19.8-20.4M ops/s (+2-5%)
3. **長期**: **C7 専用 HotPath 実装**
- 理由: 1KB 単体の最適化、実装コスト大
- 期待: +5-10%
4. **超長期**: **Phase 12 (Shared SuperSlab Pool)**
- 理由: 根本的なメタデータ圧縮(構造的ボトルネック攻撃)
- 期待: +300-400% (70-90M ops/s)
---
**本分析の根拠ファイル**:
- `/mnt/workdisk/public_share/hakmem/core/front/tiny_ring_cache.h` - Ring Cache 実装
- `/mnt/workdisk/public_share/hakmem/core/front/tiny_heap_v2.h` - HeapV2 実装
- `/mnt/workdisk/public_share/hakmem/core/tiny_alloc_fast.inc.h` - Allocation fast path
- `/mnt/workdisk/public_share/hakmem/core/box/tls_sll_box.h` - TLS SLL 実装
- `/mnt/workdisk/public_share/hakmem/CURRENT_TASK.md` - Phase 19-22 実装状況