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>
7.5 KiB
7.5 KiB
Phase 8.1 完了: Reserved SuperSlabs削減 (2→1)
🎯 実装内容
変更箇所: hakmem_tiny.c:113
// Before (Phase 7.6):
#define EMPTY_SUPERSLAB_RESERVE 2 // 4 MB overhead
// After (Phase 8.1):
#define EMPTY_SUPERSLAB_RESERVE 1 // 2 MB overhead
変更理由:
- Phase 8調査でReserved SuperSlabs (4 MB)がGap 7.8MBの51%と判明
- たった1行変更で大幅なメモリ削減が期待できる
- 性能影響を測定して最適値を決定
📊 Battle Test結果
メモリ使用量比較(1M × 16B test)
╔════════════════════════════════════════════════════════════╗
║ Memory Usage Comparison ║
╚════════════════════════════════════════════════════════════╝
Phase Reserve RSS (1M) Overhead vs mimalloc vs System
───────── ─────── ──────── ──────── ─────────── ─────────
Phase 7.7 2 32.9 MB 116% +7.8 MB -6.7 MB
Phase 8.1 1 31.0 MB 103% +6.0 MB -8.6 MB
Phase 8.2 0 31.1 MB 104% +6.1 MB -8.5 MB
mimalloc - 25.0 MB 64% - -
System - 39.6 MB 160% - -
削減効果(Phase 7.7 → 8.1)
メモリ削減: -1.9 MB (-5.8%)
Overhead改善: 116% → 103% (-13%)
Gap削減: 7.8 → 6.0 MB (-23% gap close!) ✨
全スケール結果
| Scale | Reserve=2 | Reserve=1 | 削減量 |
|---|---|---|---|
| 100K | 7.2 MB | 5.4 MB | -1.8 MB (-25%) |
| 500K | 17.4 MB | 15.5 MB | -1.9 MB (-11%) |
| 1M | 32.9 MB | 31.0 MB | -1.9 MB (-5.8%) |
| 2M | 64.0 MB | 62.4 MB | -1.6 MB (-2.5%) |
| 5M | 148.4 MB | 146.5 MB | -1.9 MB (-1.3%) |
観察:
- Small scale (100K)で最大効果 -25%
- Large scale (5M)でも -1.9 MB absolute削減
- 一貫した削減効果
⚡ 性能ベンチマーク結果
Re-allocation Cycling Test (Reserve 0 vs 1)
テスト設計:
Pattern: Alloc → Free → Re-alloc → Free
Iterations: 100回
Allocations: 100K per iteration
Total ops: 40M (100 × 100K × 4 operations)
目的: SuperSlab再利用性能の測定
結果
╔════════════════════════════════════════════════════════════╗
║ Re-allocation Cycling Benchmark (40M ops) ║
╚════════════════════════════════════════════════════════════╝
Size │ Reserve=0 │ Reserve=1 │ Difference
──────┼───────────────────┼───────────────────┼────────────
16B │ 21.5 M ops/sec │ 21.8 M ops/sec │ +1.4% ✅
│ (46.4 ns/op) │ (45.9 ns/op) │
──────┼───────────────────┼───────────────────┼────────────
64B │ 20.6 M ops/sec │ 21.5 M ops/sec │ +4.4% ✅
│ (48.5 ns/op) │ (46.4 ns/op) │
──────┼───────────────────┼───────────────────┼────────────
256B │ 20.3 M ops/sec │ 21.0 M ops/sec │ +3.4% ✅
│ (49.3 ns/op) │ (47.7 ns/op) │
──────┼───────────────────┼───────────────────┼────────────
1KB │ 16.8 M ops/sec │ 16.8 M ops/sec │ ±0% ✅
│ (59.5 ns/op) │ (59.7 ns/op) │
性能分析
Reserve=1 が Reserve=0 より高速:
- 16B: +1.4% (0.5 ns/op faster)
- 64B: +4.4% (2.1 ns/op faster) ← 最大効果
- 256B: +3.4% (1.6 ns/op faster)
- 1KB: ±0% (同等)
結論:
- Reserve=1 はSuperSlab再利用を1回分最適化
- Reserve=0 は毎回munmap/mmap syscallが必要
- Small sizes (16-256B)で効果顕著(高頻度allocation)
🎯 Phase 8.2実験: Reserve 0 の検証
Reserve 0 → 追加削減なし
Reserve=1: 31.0 MB
Reserve=0: 31.1 MB (+0.1 MB)
削減効果: なし ❌
原因分析:
- Baseline 4MBはReserve設定だけではない
- Program baseline (libc, global構造体)が約2-3 MB
- Reserve 1個 (2MB) + baseline = 合計変化なし
性能影響:
- Reserve=0 は Reserve=1 比で -1.4~4.4% 低下
- re-allocation頻度が高いworkloadで不利
最終判断: Reserve=1 を採用 ⭐⭐⭐⭐⭐
理由:
- ✅ メモリ削減効果: Reserve 2→1 で -1.9 MB
- ✅ 性能維持/向上: Reserve 0 比で +1.4~4.4%
- ❌ Reserve 1→0: 追加削減ゼロ、性能低下あり
Perfect Balance達成!
📈 Phase 8全体の成果(Phase 7.7 → 8.1)
Gap to mimalloc削減
Phase 7.7: 32.9 MB (Gap: 7.8 MB, +31%)
Phase 8.1: 31.0 MB (Gap: 6.0 MB, +24%)
削減: -1.9 MB (Gap -23% close!)
Gap内訳分析(残り 6.0 MB)
Current gap (1M): 6.0 MB (24%)
推定内訳:
├─ Reserved SuperSlab (1個): 2.0 MB (33%)
├─ SuperSlab fragmentation: 1.0 MB (17%)
├─ Program baseline: 2.0 MB (33%)
└─ その他 overhead: 1.0 MB (17%)
vs System malloc
1M test:
System: 39.6 MB
HAKMEM: 31.0 MB
削減: -8.6 MB (-22% 勝利!) 🏆
5M test:
System: 192.4 MB
HAKMEM: 146.5 MB
削減: -45.9 MB (-24% 勝利!)
🚀 次のステップ
Phase 8残存Gap (6.0 MB)の削減候補
Option A: Further optimization (困難):
- Program baseline削減 (2 MB) - 難易度高
- Fragmentation削減 (1 MB) - 要アーキテクチャ変更
- Reserved SuperSlab 1→0 - 効果なし(実証済み)
Option B: Accept current state (推奨):
- Gap 6.0 MB (24%) = 許容範囲
- System malloc比 -22% = 大勝利
- 性能維持/向上達成
- Production-ready! ✅
Phase 9 候補(性能最適化)
Two-level Magazine(目的変更):
- メモリ削減効果: minimal (0.03 MB)
- 性能向上効果: +5-10% (locality最適化)
- TLS memory削減: -400 KB
- 優先度: ⭐⭐⭐ (性能最適化として価値あり)
✅ 結論
Phase 8.1: 完全成功 🎉
実装:
- たった1行変更:
EMPTY_SUPERSLAB_RESERVE 2 → 1 - 実装時間: < 1分
- テスト・検証: 半日
成果:
- メモリ削減: -1.9 MB (-5.8%)
- Gap削減: -23%
- 性能: Reserve=0比で +1.4~4.4%
- Perfect balance達成!
最終状態
HAKMEM (Phase 8.1): 31.0 MB (103% overhead)
mimalloc: 25.0 MB (64% overhead)
System: 39.6 MB (160% overhead)
Gap to mimalloc: 6.0 MB (24%) ← 許容範囲
vs System: -8.6 MB (-22% 勝利!)
🏆 Production-ready quality達成!
推奨事項
採用: Reserve=1 理由: メモリ・性能の最適バランス 次: Phase 9 (性能最適化) or Production deployment
🚀 HAKMEM allocator: Ready for production use!