Files
hakmem/docs/analysis/SMALLOBJECT_V4_BOX_DESIGN.md

54 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.

# SmallObject HotBox v4 Box Design (Phase v4-1 スケルトン)
## Overview
- 目的: 16〜1024B〜2KiB の small-object を統合する v4 の箱を用意し、v3 の成功パターンC7-onlyを一般化する足場を作る。
- 中期目標: mimalloc の 70〜80% に迫ること。現状は C7-only v3 + front v3 + fast classify で Mixed 161024B がまだ 30〜40% 程度。
- 位置付け: v3 = prototype、v2 = archiveインターフェース参考のみ。v4 は構造を整理しつつホット/コールド境界を明確にする。
## Box 構造
- **HotBox_v4**: per-thread `SmallHeapCtx``SmallClassHeap[current/partial/full]``SmallPageMeta` を持つ。ホットパスはここに閉じ込める。
- **ColdIface_v4**: `refill_page` / `retire_page` / `remote_push` / `remote_drain` を 1 箱に集約し、内部で Superslab / Warm / Remote を呼ぶ薄いラッパ。
- **SuperslabBox / RemoteBox**: 既存の Superslab/WarmPool/Remote を Cold 側の箱として再利用Hot から直接触らない)。
- **PolicyBox / LearningBox**: small-object 用の `SmallPolicySnapshot`block_size/route_kind 等を上位で更新し、Hot は snapshot を読むだけにする。
## Phase ロードマップ
- **v4-1**: 型と入口だけ追加。挙動は v3/v1 のままで、コンパイルが通る足場を用意。
- **v4-2**: C7-only を v4 に寄せ、v3 互換の挙動で動かすENV ゲート付き、v4 が優先)。
- **v4-3**: C7-only を v4 自前の freelist/current/partial で動かすCold は Tiny v1 経由。v3 はベンチ用に残し ENV で A/B。
- **v4-3.1 (今回)**: C7 v4 で current/partial 再利用を強化し、prepare_calls を v3 並みに抑制。C7-only ベンチで v4 が v3 比 +1% 程度まで回復。
- **v4-4**: C6 v4 パイロットC6-heavy 専用 opt-in。C7 v4 を維持しつつ C6 を v4 に載せる。
- **v4-5**: C5 v4 パイロットC5-heavy 専用 opt-in。Mixed 標準は C5 v1 のまま。
- **PF2 (今回)**: v4 状態での pf/OS ベースライン取得と small-object Segment Box の箱だけ追加(挙動不変)。
- **v4-6 / PF3 以降**: Segment/Page/Block レイアウトと pf 削減、WarmPool チューニングを v4 用に調整。
## 現行 v3/v2 の扱い
- v3: C7-only front v3 の prototype として構造だけ再利用する。性能・安定のベースライン。
- v2: archive として残し、インターフェース案のみ参照。ホットパスには混ぜない。
## 次ステップの入口
- `core/box/smallobject_hotbox_v4_box.h`: v4 のページ/クラス/TLS 型と TLS アクセサ宣言。
- `core/box/smallobject_cold_iface_v4.h`: ColdIface の関数ポインタ箱C7 専用 refill/retire を v1 Tiny に繋ぐ)。
- `core/box/tiny_route_env_box.h`: `TINY_ROUTE_SMALLHEAP_V4` を追加し、ENV `HAKMEM_SMALL_HEAP_V4_ENABLED` / `HAKMEM_SMALL_HEAP_V4_CLASSES` から C7 を v4 route に載せられる(未指定なら OFF
- `core/front/malloc_tiny_fast.h`: route switch に v4 の case を足し、C7 v4 が ON のときは v4 経路(現在は C7 自前 freelist, それ以外は v1/v3 へフォールバック、OFF 時は従来の v3/v1。
- `core/box/smallsegment_v4_box.h` / `core/box/smallsegment_v4_env_box.h`: PF2 で追加した small-object Segment Box の足場(型と ENV だけ、挙動不変)。設計メモは `docs/analysis/SMALLOBJECT_SEGMENT_V4_DESIGN.md` にまとめる。
## A/B と運用
- Phase v4-3.1 時点の健康診断:
- C7-only A/B (ws=400, iters=1M, size=1024 固定):
- v3: 41.67M ops/s, prepare_calls=5,077
- v4: 42.13M ops/s, prepare_calls=4,701current/partial 再利用で 3.4x→約1.0x に改善)
- Mixed 161024B (MIXED_TINYV3_C7_SAFE, ws=400, iters=1M):
- v3 route: 40.66M ops/s
- v4 route: 40.01M ops/s-1.6% 以内、回帰なし)
- どちらも segv/assert なし。C7 v4 の prepare 増加は解消済み。Mixed ではまだ v3 がわずかに優勢だが許容範囲。
- Phase v4-4 (C6 v4 パイロット):
- ENV: `HAKMEM_SMALL_HEAP_V4_ENABLED=1`, `HAKMEM_SMALL_HEAP_V4_CLASSES=0x40`C6-only v4。Mixed では標準 OFF0x80= C7-only
- C6-heavy ベンチ (ws=400, iters=1M, size 257768):
- C6 v1: 28.69M ops/s
- C6 v4: 30.07M ops/s+4.8%segv/assert なし
- Mixed 161024B はデフォルトで C6 v1 のままC6 v4 は研究箱)。今後 C6 v4 の安定度を見つつ拡張予定。
- Phase v4-5 (C5 v4 パイロット; C5-heavy 専用 opt-in):
- ENV: `HAKMEM_SMALL_HEAP_V4_ENABLED=1`, `HAKMEM_SMALL_HEAP_V4_CLASSES=0x20`C5-only v4。C7 v4 / C6 v4 とは独立にビットで切替。
- 目的: C5-heavy ワークロードで v4 が v1 を上回るか確認。Mixed 標準は C5 v1 のままC5 v4 は研究箱)。
- ステータス: 実装済み。C5-heavy / Mixed の A/B は未実施。segv/assert の有無と throughput を確認してから昇格判断。