Files
hakmem/docs/analysis/C6_HOTBOX_DESIGN.md
Moe Charm (CI) 8f18963ad5 Phase 36-37: TinyHotHeap v2 HotBox redesign and C7 current_page policy fixes
- Redefine TinyHotHeap v2 as per-thread Hot Box with clear boundaries
- Add comprehensive OS statistics tracking for SS allocations
- Implement route-based free handling for TinyHeap v2
- Add C6/C7 debugging and statistics improvements
- Update documentation with implementation guidelines and analysis
- Add new box headers for stats, routing, and front-end management
2025-12-08 21:30:21 +09:00

4.8 KiB
Raw Blame History

C6_HOTBOX_DESIGN

目的: class6 を C7 SAFE と同じ TinyHeap ベースでホット化するための箱を定義する。まずは SAFEmeta きちんと保持だけを対象とし、ULTRAmeta を大胆に省く)は C6 ではやらない。

境界(箱の責務)

  • 内側 (C6 HotBox): TinyHeapBox 上での heap → page → block 管理、current_page ポリシー。
  • 外側 (Cold Box): Superslab / Tier / Guard / Stats。TLS SLL とは原則切断TinyHeap クラスには SLL を使わせない)。

ENV / A/B 切替

  • HAKMEM_TINY_HEAP_BOX … TinyHeap front 全体の ON/OFF。
  • HAKMEM_TINY_HEAP_CLASSES … クラスごとの TinyHeap マスク。デフォルトは 0x80 (C7 のみ)。
  • HAKMEM_TINY_C6_HOT … C6 Hot front を有効化するスイッチ1 で C6 専用直線パスを許可)。
  • HAKMEM_TINY_C6_META_MODE … 0=OFF, 1=SAFE当面は SAFE のみ。ULTRA はやらない)。
  • 注意: meta_mode=1 は現時点では bench/実験専用。長めの C6-heavy でクラッシュする既知事象があり、通常運用は meta_mode=0 または C6 TinyHeap OFF を推奨する。
  • デバッグ用meta_mode=1 時の Fail-Fast/可視化):
    • HAKMEM_TINY_C6_DEBUG_POP=1 … pop まわりの Fail-Fast を有効化。
    • HAKMEM_TINY_C6_DELTA_TRACE=1 … delta を触った箇所を last_delta_site に記録。
    • HAKMEM_TINY_C6_DELTA_DEBUG=1 … destructor で delta サマリを dump。
    • HAKMEM_TINY_C6_DELTA_TRACE=1 が有効なときは delta サイト (ALLOC/FREE/ATTACH/EMPTY/THRESHOLD) をページに刻み、 HAKMEM_TINY_C6_DEBUG_POP=1 では pop/free の Fail-Fast範囲外 freelist/ss mismatch/cap0 等)と 512 行までの debug log を出す。

現状の事実2025-12 時点)

  • C6 TinyHeapHAKMEM_TINY_HEAP_CLASSES=0x40)は C6-heavy / Mixed どちらも回帰気味(最新測定 2025-12-05
    • C6-heavy (min=257/max=768, ws=256, iters=20k, debug OFF)
      • LEGACY: 41.74M ops/sHEAP_STATS 0
      • TinyHeap mode0 (C6_META_MODE=0): 36.07M ops/scls6 fast=5381 / slow_prepare=1
      • TinyHeap mode1 (C6_META_MODE=1 SAFE): 28.86M ops/scls6 fast=2692 / slow_prepare=2690
    • Mixed 161024B (ws=256, iters=20k)
      • LEGACY: 40.90M ops/s
      • C7_SAFE (C6 OFF): 40.96M ops/scls7 fast=5691 / slow=1
      • C6+C7 SAFE (HEAP_CLASSES=0xC0、両方 meta_mode=1): 27.21M ops/scls6 fast=1388 / slow=1366、cls7 fast=5664 / slow=19
  • mode0 は slow_prepare≈1 でも約 -14%C6-heavyと大きくマイナス、mode1 は slow_prepare が増えてさらに悪化。現状は bench/実験専用マスク0x40/0xC0とし、通常は LEGACY か C7_SAFE のみを推奨。
  • slow_prepare が小さいまま回帰するため、原因は Front/Hot の命令コストや meta 更新コストdelta/flush 実装の重さにあると推定。mode1 は delta/flush を触ることで slow_prepare も増えやすい点に注意。
  • meta_mode=1 の暫定防御Phase2122:
    • attach で meta->freelist を範囲チェックし、OOB は NULL に潰す。
    • empty→release で meta->freelist を NULL にし、debug 時は page->free_list に poison。
    • pop で freelist OOB / ss mismatch / cap0 などを Fail-Fast。
    • 上記後、C6-heavy iters=1000/1500/2000/20000 で再現していた SIGSEGV は出なくなり、delta サマリは 0/0/0ただし bench 専用扱いは継続)。

要件と設計方針

  • 当面は SAFE のみmeta/active を delta + flush で正確寄りに保つ。ULTRA は C6 では導入しない。
  • A/B できるように:
    • C6 Hot front: HAKMEM_TINY_C6_HOT=1 で直線パスを有効化。
    • C6 TinyHeap ON/OFF: HAKMEM_TINY_HEAP_CLASSES のビットで切替(デフォルトは OFF
  • Box Theory 準拠:
    • HotBoxTinyHeap 内部)と Cold BoxSuperslab/Tier/Guard/Statsの境界は 1 箇所。
    • TLS SLL は C6 HotBox からは触らない。

今後のフォーカス

  • C7 SAFE で効いた current_page 固定+ delta/閾値 flush を C6 に横展開するかを検討。
  • Front/Hot の命令数を減らすため、C6 専用の直線フロントGate → Heap 一本化)を C7 と対称に整える。
  • 成果の指標:
    • C6-heavy で LEGACY と同等以上を目指す。
    • Mixed 161024B で C6 を載せてもマイナスが小さい±1M 以内)こと。

v1 の結論と凍結方針

  • v1 では C6 TinyHeap/Hot はどのモードでも C6-heavy/Mixed で明確なマイナス。meta_mode=1 は bench/実験専用とし、通常は mode0 か OFF を推奨。
  • C6 の本格的な再設計は TinyHeap v2C5C7 をまとめて組み直す箱で行う。C6 を触るときは bench/実験マスク (0x40/0xC0) とデバッグ ENV を明示的に有効にする。