Files
hakmem/docs/archive/PHASE_7_8_SUMMARY.md
Moe Charm (CI) 52386401b3 Debug Counters Implementation - Clean History
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>
2025-11-05 12:31:14 +09:00

11 KiB
Raw Blame History

Phase 7-8 総括レポート: Tiny Pool メモリ効率化の完全記録

📋 Executive Summary

期間: Phase 7.6 - Phase 8.1 目標: mimalloc並みのメモリ効率達成 結果: Gap 68%削減、System malloc比 -22%勝利 🏆

最終成果1M × 16B test

╔════════════════════════════════════════════════════════════╗
║           Phase 7-8 Final Achievement                     ║
╚════════════════════════════════════════════════════════════╝

Starting (Pre-Phase 7):   40.9 MB
After Phase 8.1:          31.0 MB
Total reduction:          -9.9 MB (-24%) ✨

vs mimalloc (25.0 MB):    +6.0 MB (+24%) ← 許容範囲
vs System (39.6 MB):      -8.6 MB (-22%) ← 大勝利! 🏆

Gap to mimalloc closed:   68% (15.8 MB → 6.0 MB)

🎯 Phase別詳細成果

Phase 7.6: SuperSlab Dynamic Deallocation

実装内容:

  • Empty SuperSlab検出機構
  • Dynamic deallocation (munmap)
  • Reserved SuperSlabs設計 (RESERVE=2)

成果:

Before: 40.9 MB
After:  33.0 MB
削減:   -7.9 MB (-19%) ✨

技術的ブレークスルー:

  • total_active_blocksによる正確なempty検出
  • Magazine cache統合spill時にカウント更新
  • Reserve pool設計性能維持

課題発見:

  • Magazine cache (2048 blocks)がempty検出を阻害
  • 2個のPhantom SuperSlabs残存

Phase 7.7: Magazine Flush API

実装内容:

void hak_tiny_magazine_flush(int class_idx);
void hak_tiny_magazine_flush_all(void);

成果:

Before: 33.0 MB
After:  32.9 MB
削減:   -0.1 MB (測定誤差範囲)

真の効果smaps解析で判明:

  • Phantom SuperSlabs完全解消2個 → 0個
  • 実RSS削減: 30.4 MB → 14.4 MB (flush後)
  • ru_maxrss累積maxでは効果が見えない

Battle Test結果:

HAKMEM:   32.9 MB (116% overhead)
mimalloc: 25.1 MB (64% overhead)
System:   39.6 MB (159% overhead)

Gap: 7.8 MB (31%)

Phase 8: Ultrathink調査 - Gap完全解明

重大発見:

従来想定(間違い):

Gap 7.8 MB = Magazine cache 4 MB + System overhead 3 MB
→ Two-level Magazine計画

実態(調査結果):

Gap 7.8 MB = Reserved SuperSlabs 4 MB (51%)
            + その他 3.8 MB (49%)

Magazine cache = たった 0.03 MB (0.4%)

完全なOverhead内訳:

Total overhead:        7.7 MB (100%)

├─ Reserved SuperSlabs:     4.0 MB (52%) ← Phase 7.6設計
├─ SuperSlab fragmentation: 1.0 MB (13%)
├─ Program baseline:        2.0 MB (26%)
├─ Slab metadata:           0.4 MB (5%)
├─ TLS structures:          0.1 MB (1%)
└─ その他:                   0.2 MB (3%)

戦略的転換:

  • Two-level Magazine → 効果minimal0.03 MB
  • Reserved SuperSlabs削減 → 最大効果4 MB

Phase 8.1: Reserved SuperSlabs削減 (2→1)

実装内容:

// たった1行変更
#define EMPTY_SUPERSLAB_RESERVE 1  // Was: 2

成果:

Before: 32.9 MB (Reserve=2)
After:  31.0 MB (Reserve=1)
削減:   -1.9 MB (-5.8%) ✨

性能検証:

Re-allocation Cycling Benchmark:
  Reserve=0:  20.3-21.5 M ops/sec
  Reserve=1:  21.0-21.8 M ops/sec
  向上:       +1.4~4.4% ✅

結論: Reserve=1 が最適バランス

Reserve=0 実験:

  • Memory: 31.1 MB (削減効果なし)
  • Performance: -1.4~4.4% (低下)
  • 結論: Reserve=1 が perfect balance

🔍 調査手法の進化

Phase 7.6: 基本的な測定

ツール:

  • getrusage() による ru_maxrss測定
  • Debug counters (g_superslab_alloc_count等)

限界:

  • ru_maxrssは累積最大値解放が見えない
  • 内訳不明

Phase 7.7: Battle Test導入

改善:

  • 3-way比較 (HAKMEM vs mimalloc vs System)
  • 複数スケール測定 (100K - 5M)

新発見:

  • System malloc完勝
  • mimalloc差は縮小傾向

Phase 8: smaps詳細解析

ブレークスルーツール:

// investigate_mystery_4mb.c
- ru_maxrss vs RSS比較
- Magazine flush効果の可視化

// investigate_smaps_detailed.c
- /proc/self/smaps完全解析
- Memory region別内訳
- Baseline overhead発見

重大発見:

  1. ru_maxrss vs smaps RSS:

    • Peak: 30.4 MB (smaps) vs 30.2 MB (ru_maxrss)
    • Flush後: 14.4 MB (smaps) vs 30.2 MB (ru_maxrss)
    • Flush効果: -16 MBru_maxrssでは見えない
  2. Baseline 4MB = Reserved SuperSlabs:

    • Program起動時に既に2個のSuperSlabs確保
    • Phase 7.6の意図的設計
  3. Magazine cache実態:

    • 想定: 4 MB
    • 実測: 0.03 MB
    • 130倍の見積もり誤差

📊 技術的知見

1. ru_maxrss の落とし穴

問題:

  • 累積最大値を返す
  • メモリ解放を反映しない
  • Battle testでは誤解を招く

解決:

  • /proc/self/smaps 直接解析
  • Real-time RSS測定

教訓:

メモリ最適化では smaps が必須!


2. Reserved vs Performance トレードオフ

Phase 7.6設計:

#define EMPTY_SUPERSLAB_RESERVE 2  // 4 MB overhead

意図:

  • Re-allocation高速化
  • mmap syscall回避
  • Latency安定化

Phase 8.1最適化:

#define EMPTY_SUPERSLAB_RESERVE 1  // 2 MB overhead

結果:

  • Memory: -1.9 MB
  • Performance: +1.4~4.4%
  • Perfect balance達成

教訓:

Reserve設計は測定ベースで最適化せよ


3. Magazine Capacity の過剰設計

発見:

Magazine capacity: 2048 blocks (class 0)
実使用率: < 0.1%

確保: 32 KB
実使用: < 0.03 KB
無駄率: 99.9%

原因:

  • 過去の性能最適化で大容量化
  • 実workload分析不足

Phase 9候補:

  • Two-level Magazine性能目的
  • Hot: 64-256 (実使用に合わせる)
  • Locality最適化

教訓:

容量設計は実測ベース、想定に頼るな


4. 調査→実装の反復の重要性

Phase 8の教訓:

調査前の想定:

Gap = Magazine cache (4 MB) + System overhead (3 MB)
→ Two-level Magazine実装計画
→ 期待効果: -3-4 MB

調査後の実態:

Gap = Reserved SuperSlabs (4 MB) + その他
Magazine = 0.03 MB
→ Reserve削減計画
→ 実効果: -1.9 MB

もし調査せずに実装していたら:

  • Two-level Magazine実装3日間
  • 効果: -0.03 MBほぼゼロ
  • 時間の無駄

教訓:

実装前に徹底調査!想定を疑え!


🎯 残存Gap分析6.0 MB

内訳

Total gap to mimalloc: 6.0 MB (24%)

├─ Reserved SuperSlab (1個):   2.0 MB (33%)
│   → Reserve=0は効果なし実証済み
│
├─ SuperSlab fragmentation:    1.0 MB (17%)
│   → 2MB alignment必須
│   → Partial release困難
│
├─ Program baseline:           2.0 MB (33%)
│   → libc, global構造体
│   → 削減困難
│
└─ その他 overhead:            1.0 MB (17%)
    → TLS, metadata等
    → 削減余地小

削減可能性評価

Reserve SuperSlab (2 MB):

  • Reserve=0: 効果なし、性能低下
  • 結論: 削減不可

Fragmentation (1 MB):

  • 要件: Partial SuperSlab release
  • 難易度: 高(アーキテクチャ変更)
  • 効果: 不確実
  • 結論: ROI低い

Program baseline (2 MB):

  • 難易度: 非常に高
  • 効果: minimal
  • 結論: 非現実的

結論:

残存Gap 6.0 MB は構造的限界 これ以上の削減は労力対効果が悪い


🏆 Phase 7-8 総合評価

定量的成果

╔════════════════════════════════════════════════════════════╗
║           Quantitative Achievement                        ║
╚════════════════════════════════════════════════════════════╝

メモリ削減:
  Total:              -9.9 MB (-24%)
  Gap削減:            -9.8 MB (-62%)
  Gap close率:        68%

性能:
  Re-alloc cycle:     +1.4~4.4% ✅
  Overhead:           116% → 103% (-13%)

競合比較:
  vs mimalloc:        +24% (許容範囲)
  vs System malloc:   -22% (大勝利) 🏆

定性的成果

達成:

  1. Production-ready quality
  2. System malloc完勝
  3. 性能維持/向上
  4. Overhead 100%台達成

技術的ブレークスルー:

  1. Empty SuperSlab検出機構
  2. Magazine Flush API
  3. smaps詳細解析手法
  4. Reserve最適化手法

知見獲得:

  1. ru_maxrssの落とし穴
  2. Magazine capacity過剰設計
  3. 調査→実装反復の重要性
  4. Reserved vs Performance balance

🚀 今後の展開

完了事項

Tiny Pool最適化完了:

  • メモリ効率: Production-ready
  • 性能: 維持/向上
  • Gap: 許容範囲

未完了事項(重要!)

⚠️ 本来の目標を思い出せ!

全部動的大作戦:

hakmem_pool.c の動的化:
  □ Mid Pool (64KB-512KB) 動的化
  □ Large Pool (>512KB) 完全動的化
  □ メモリ解放の徹底
  □ Idle時の完全返却

Phase 8調査で判明:

  • Program baseline: 2.0 MB
  • この中にMid/Large Pool overheadが含まれる可能性
  • 改善余地あり

Phase 9候補

Option A: 動的大作戦続行

優先度: 最高(本来の目標)

実施項目:

  1. Mid/Large Pool実装調査
  2. 静的確保 vs 動的確保分析
  3. Idle時の解放機構実装
  4. Battle test検証

期待効果:

  • Mid/Large overhead削減
  • Total memory footprint削減
  • 完全動的allocator実現

Option B: Two-level Magazine (性能最適化)

目的変更: メモリ削減 → 性能向上

期待効果:

  • Throughput: +5-10%
  • Locality向上
  • TLS削減: -400 KB

Option C: Production deployment

現状: Production-ready達成

準備項目:

  1. Documentation
  2. Integration test
  3. Deployment guide
  4. Tuning guide

📝 結論

Phase 7-8 は大成功!

実装行数:   ~150 lines
削減効果:   -9.9 MB (-24%)
Gap削減:    68%
性能:       維持/向上
期間:       集中作業で完了

ROI: 🌟🌟🌟🌟🌟

最大の収穫: 調査手法の確立

Before Phase 8:

  • ru_maxrss測定
  • 想定ベースの実装

After Phase 8:

  • smaps詳細解析
  • 実測ベースの最適化
  • 想定を疑う姿勢

この手法は他のコンポーネントにも適用可能!


Next Action

推奨順位:

  1. 🔥 動的大作戦続行 ← 本来の目標!
  2. Production deployment準備
  3. Two-level Magazine (性能向上)

動的大作戦で期待できること:

  • Program baseline 2MB の一部削減
  • 完全動的allocator実現
  • Phase 7-8で確立した調査手法の活用

🎓 Phase 7-8 Lessons Learned

1. 調査なくして最適化なし

想定で実装せず、実測で最適化せよ

2. ツールの限界を知れ

ru_maxrss だけでは真実は見えない smaps, perf, 専用ツール活用

3. 小さな変更、大きな効果

1行変更で -1.9 MB 正しい場所を見つけることが全て

4. Tradeoffを測定せよ

Memory vs Performance 両方測定してバランス点を見つける

5. 完璧を目指すな

Gap 6.0 MB は許容範囲 ROIを考えて撤退判断も重要


Phase 7-8 完了!次は動的大作戦だ!🚀