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

75 lines
4.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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 で試すときのみ併用を許容。