Files
hakmem/docs/analysis/COLD_TINY_STATS_BOX_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.9 KiB
Raw Blame History

Cold Tiny Stats Box (初期メモ)

目的

  • Tiny のホットパス (TinyHeap/Front) では「page->used の増減だけ」に集中し、Superslab/Tier/Guard 用の meta->used / ss_active_* / 学習系カウンタの更新は Cold 側に押し出す。
  • C7 SAFE で導入した page 内 delta + flush を一般化し、「Stats Box」がイベントを受け取って統計を更新する構造に寄せる。

境界の考え方

  • Hot 側 (TinyHeap / TinyFront / HotBox):
    • やること: page->used の増減、必要なら「EVENT_ALLOC / EVENT_FREE」などの軽い通知を 1 回投げるだけ。
    • やらないこと: meta->used / ss_active_* / Tier 判定用カウンタを直接いじる。
  • Cold Stats Box 側:
    • Hot からのイベントをバッファ or 簡易カウンタで受け取り、
    • Superslab/Tier/Guard が参照する統計値に反映する(当面は flush 境界で即時更新。次フェーズでバッチ化を検討)。

C7 SAFE との関係

  • C7 SAFE ではすでに page 内に used_delta/active_delta を持ち、empty/threshold/attach 時に flush して meta/active を更新する「ミニ Aggregator」がある。
  • 本フェーズ以降は「flush 部分だけを Stats Box に委譲」→「Stats Box で pending に貯め、所定のトリガでまとめて meta/active を反映」という二段構えに進化させる。
  • 将来的には Stats Box 内で本格的なバッチ更新・学習カウンタ更新を担う余地を残す。

遅延の許容と不変条件C7 基準)

  • Superslab/Tier/Guard が前提にする不変条件:
    • meta->used / ss_active_* は「ページが Superslab を離れる前」に必ず整合した値に戻っていること。
    • Tier 判定や Guard/OOM 判定は「一時的に +α(最大 K ページぶん」までなら許容するが、K は環境から明示的に決める。
  • 今回の方針:
    • 1 ページあたり最大「capacity×16」程度までの pending なら遅延を許容ENV で ON のときのみ)。
    • ページが empty になり Superslab/Tier に返る直前、または pending が閾値を超えたときに必ず flush。
    • Superslab を完全 release する前に pending=0 になるempty で flush を強制するため、Tier/Guard の破綻は避ける。

ENV / A/B ポリシー

  • HAKMEM_TINY_STATS_BOX=0/1 で Stats Box 経由を切替。
    • 0: これまで通り TinyHeap 内で meta/active を直接更新。
    • 1: C7 SAFE の flush を Stats Box 経由に分離。
  • HAKMEM_TINY_STATS_BATCH=0/1 で meta/active の適用タイミングを切替Stats Box が有効な場合のみ有効)。
    • 0: flush ごとに即 meta->used / ss_active_* を更新(従来挙動)。
    • 1: flush で得た delta を page pending に貯め、閾値/empty/release/destructor でまとめて反映。
  • 当面は C7 のみ対象。他クラスや C6 への適用は次フェーズ以降の検討事項。

初期 A/BC7-only 20k/ws=64, PROFILE=C7_SAFE, HOT=1, HEAP_STATS=ON

  • STATS_BOX=0: 42.99M ops/scls7 fast=11015 / slow=1
  • STATS_BOX=1: 42.92M ops/scls7 fast=11015 / slow=1
  • いずれも delta summary=0 で挙動差なし(場所だけ Box に分離)。

今フェーズの実装(概要)

  • Stats Box に page 単位の pending(used_delta/active_delta) を追加。
  • C7 SAFE の flush は「delta を Stats Box に渡すだけ」に変更し、Stats Box が
    • STATS_BATCH=0: 即座に meta/active 更新。
    • STATS_BATCH=1: pending に加算し、閾値超え/empty でまとめて meta/active へ反映。
  • Hot 側TinyHeap/C7 SAFEのコード量は変えず、Cold 側だけで更新タイミングを差し替えられる形にした。

Phase27 A/Bバッチ有効時の影響

  • C7-only 20k/ws=64PROFILE=C7_SAFE, HOT=1, LARSON_FIX=1, HEAP_STATS=ON
    • STATS_BOX=0: 43.31M ops/s
    • STATS_BOX=1, BATCH=0: 43.06M ops/sfast/slow 同一)
    • STATS_BOX=1, BATCH=1: 35.10M ops/s大幅マイナス
    • STATS_BOX=1, BATCH=1, META_MODE=2ULTRA bench: 48.55M ops/s
  • Mixed 161024B 20k/ws=256
    • LEGACY: 40.92M ops/s
    • C7_SAFE + STATS_BOX=1, BATCH=0: 42.72M ops/s
    • C7_SAFE + STATS_BOX=1, BATCH=1: 35.27M ops/s
  • 判断: BATCH=1 は C7-only/Mixed とも大きく劣化。bench 専用に留め、標準は STATS_BOX=1 & BATCH=0または STATS_BOX=0とする。

標準設定 (v1)

  • 推奨: PROFILE=C7_SAFE 時は HAKMEM_TINY_STATS_BOX=1 HAKMEM_TINY_STATS_BATCH=0 を標準とし、レガシー比較時は STATS_BOX=0 でも可。
  • Bench/実験: HAKMEM_TINY_STATS_BATCH=1 は bench 専用C7-only/Mixed とも大幅マイナス。C7_ULTRA_BENCH で試すときのみ併用を許容。