2025-12-10 17:58:42 +09:00
|
|
|
|
# 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 16–1024B がまだ 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% 程度まで回復。
|
2025-12-10 19:14:38 +09:00
|
|
|
|
- **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 用に調整。
|
2025-12-10 17:58:42 +09:00
|
|
|
|
|
|
|
|
|
|
## 現行 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。
|
2025-12-10 19:14:38 +09:00
|
|
|
|
- `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` にまとめる。
|
2025-12-10 17:58:42 +09:00
|
|
|
|
|
|
|
|
|
|
## 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,701(current/partial 再利用で 3.4x→約1.0x に改善)
|
|
|
|
|
|
- Mixed 16–1024B (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 がわずかに優勢だが許容範囲。
|
2025-12-10 18:18:05 +09:00
|
|
|
|
- Phase v4-4 (C6 v4 パイロット):
|
|
|
|
|
|
- ENV: `HAKMEM_SMALL_HEAP_V4_ENABLED=1`, `HAKMEM_SMALL_HEAP_V4_CLASSES=0x40`(C6-only v4)。Mixed では標準 OFF(0x80= C7-only)。
|
|
|
|
|
|
- C6-heavy ベンチ (ws=400, iters=1M, size 257–768):
|
|
|
|
|
|
- C6 v1: 28.69M ops/s
|
|
|
|
|
|
- C6 v4: 30.07M ops/s(+4.8%)segv/assert なし
|
|
|
|
|
|
- Mixed 16–1024B はデフォルトで C6 v1 のまま(C6 v4 は研究箱)。今後 C6 v4 の安定度を見つつ拡張予定。
|
2025-12-10 19:14:38 +09:00
|
|
|
|
- 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 を確認してから昇格判断。
|