- 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
4.8 KiB
4.8 KiB
C6_HOTBOX_DESIGN
目的: class6 を C7 SAFE と同じ TinyHeap ベースでホット化するための箱を定義する。まずは SAFE(meta きちんと保持)だけを対象とし、ULTRA(meta を大胆に省く)は 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 TinyHeap(
HAKMEM_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/s(HEAP_STATS 0)
- TinyHeap mode0 (
C6_META_MODE=0): 36.07M ops/s(cls6 fast=5381 / slow_prepare=1) - TinyHeap mode1 (
C6_META_MODE=1SAFE): 28.86M ops/s(cls6 fast=2692 / slow_prepare=2690)
- Mixed 16–1024B (ws=256, iters=20k)
- LEGACY: 40.90M ops/s
- C7_SAFE (C6 OFF): 40.96M ops/s(cls7 fast=5691 / slow=1)
- C6+C7 SAFE (
HEAP_CLASSES=0xC0、両方 meta_mode=1): 27.21M ops/s(cls6 fast=1388 / slow=1366、cls7 fast=5664 / slow=19)
- C6-heavy (min=257/max=768, ws=256, iters=20k, debug OFF)
- 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 の暫定防御(Phase21–22):
- 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)。
- C6 Hot front:
- Box Theory 準拠:
- HotBox(TinyHeap 内部)と Cold Box(Superslab/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 16–1024B で C6 を載せてもマイナスが小さい(±1M 以内)こと。
v1 の結論と凍結方針
- v1 では C6 TinyHeap/Hot はどのモードでも C6-heavy/Mixed で明確なマイナス。meta_mode=1 は bench/実験専用とし、通常は mode0 か OFF を推奨。
- C6 の本格的な再設計は TinyHeap v2(C5–C7 をまとめて組み直す箱)で行う。C6 を触るときは bench/実験マスク (0x40/0xC0) とデバッグ ENV を明示的に有効にする。