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