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/B(C7-only 20k/ws=64, PROFILE=C7_SAFE, HOT=1, HEAP_STATS=ON) -------------------------------------------------------------------- - STATS_BOX=0: 42.99M ops/s(cls7 fast=11015 / slow=1) - STATS_BOX=1: 42.92M ops/s(cls7 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=64(PROFILE=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/s(fast/slow 同一) - STATS_BOX=1, BATCH=1: 35.10M ops/s(大幅マイナス) - STATS_BOX=1, BATCH=1, META_MODE=2(ULTRA bench): 48.55M ops/s - Mixed 16–1024B 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 で試すときのみ併用を許容。