- Implement tiny_page_box.c/h: per-thread page cache between UC and Shared Pool - Integrate Page Box into Unified Cache refill path - Remove legacy SuperSlab implementation (merged into smallmid) - Add HAKMEM_TINY_PAGE_BOX_CLASSES env var for selective class enabling - Update bench_random_mixed.c with Page Box statistics Current status: Implementation safe, no regressions. Page Box ON/OFF shows minimal difference - pool strategy needs tuning. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
5.3 KiB
5.3 KiB
HAKMEM 状況メモ (2025-12-05 更新)
現在の状態(Tiny / Superslab / Warm Pool)
- Tiny Front / Superslab / Shared Pool は Box Theory 準拠で 3 層構造に整理済み(HOT/WARM/COLD)。
- Tiny Gatekeeper Box(alloc/free)と Tiny Route Box により、USER→BASE 変換と Tiny vs Pool のルーティングを入口 1 箇所に集約。
- Superslab Tier Box(HOT/DRAINING/FREE)+ Release Guard Box により、SuperSlab ライフサイクルと eager FREE の安全な境界を定義。
- Warm Pool 層:
tiny_warm_pool.h: per-thread の HOT SuperSlab プール。warm_pool_stats_box.h: hits/misses/prefilled の統計箱。warm_pool_prefill_box.h: registry スキャン時に Warm Pool を事前充填する cold-path helper。
- Prefault Box(
ss_prefault_box.h)は追加済みだが、4MB MAP_POPULATE 問題を避けるためデフォルト OFF(HAKMEM_SS_PREFAULT=0)に設定。
直近の成果
- Gatekeeper inlining(Phase A-1)完了:
malloc/freeラッパの関数呼び出しを削減しつつ、Box 境界は維持。 - Unified Cache Refill の debug 検証を 1 箇所に集約し、リリースビルドの HOT パスを軽量化:
bench_random_mixed_hakmem 1000000 256 42が約 4.3M → 5.0M ops/s(~+17%)に改善。
- Tiny-only/Tiny Mixed / Non-Tiny の条件差分をドキュメント化・分離:
bench_random_mixed_hakmemにHAKMEM_BENCH_MIN_SIZE/HAKMEM_BENCH_MAX_SIZEを追加し、- 8–128B(Tiny-only)
- 129–1024B(Tiny C5–C7 専用) を個別に測定可能にした。
docs/PERF_ANALYSIS_TINY_MIXED.mdほかに、8–128B/200K/ws=400(旧 Tiny 専用)と現在の 16–1024B/1M/ws=256(Tiny+Non-Tiny 混在)の違いを明記。
- Unified Cache Refill 安全化(Step 1 完了):
core/front/tiny_unified_cache.cのunified_cache_refill()でmax_batch <= 256を保証し、out[256]と常に整合するよう修正。- C5〜C7 の Unified Cache 容量・バッチサイズを増やす実験を行ってもスタック破壊が起きない状態にした。
- Tiny Page Box(C7 Tiny-Plus 層)の導入(Step 2 第1段階完了):
core/box/tiny_page_box.h/core/box/tiny_page_box.cを追加し、HAKMEM_TINY_PAGE_BOX_CLASSESで有効クラスを制御できる Page Box を実装。tiny_tls_bind_slab()からtiny_page_box_on_new_slab()を呼び出し、TLS が bind した C7 slab を per-thread の page pool に登録。unified_cache_refill()の先頭に Page Box 経路を追加し、C7 では「TLS が掴んでいるページ内 freelist/carve」からバッチ供給を試みてから Warm Pool / Shared Pool に落ちるようにした(Box 境界はTiny Page Box → Warm Pool → Shared Poolの順序を維持)。
性能の現状(Random Mixed, HEAD)
- 条件:
bench_random_mixed_hakmem 1000000 256 42(1T, ws=256, RELEASE, 16–1024B)- HAKMEM: 約 5.0M ops/s
- system malloc: 約 90–100M ops/s
- mimalloc: 約 120–130M ops/s
- 条件:
bench_random_mixed_hakmem 1000000 256 42+HAKMEM_BENCH_MIN_SIZE=8 HAKMEM_BENCH_MAX_SIZE=128(Tiny-only, 8–128B)- HAKMEM Tiny Front: 約 80–90M ops/s(mimalloc と同オーダー)
- 条件:
bench_random_mixed_hakmem 1000000 256 42+HAKMEM_BENCH_MIN_SIZE=129 HAKMEM_BENCH_MAX_SIZE=1024(Tiny C5–C7 のみ)- HAKMEM: 約 4.7–4.8M ops/s
- 結論:
- Tiny front 自体(8–128B)は十分速く、mimalloc と同オーダーまで出ている。
- 129–1024B の Tiny C5–C7 経路で Unified Cache hit=0 / Shared Pool ロック多発というボトルネックがあり、 Random Mixed 全体の性能を支配している。
次にやること(優先タスク:C7 Page Box の実効性検証とチューニング)
- C7 Page Box 経路の実効性を計測
- ENV:
HAKMEM_BENCH_MIN_SIZE=129 HAKMEM_BENCH_MAX_SIZE=1024+HAKMEM_MEASURE_UNIFIED_CACHE=1でbench_random_mixed_hakmem 1000000 256 42を実行し、C7 の:- Unified Cache refill 回数・平均 cycles
shared_pool_acquire_slab(C7)のロック回数 を、Page Box ON/OFF(HAKMEM_TINY_PAGE_BOX_CLASSES=未設定 vs7)で比較する。
- ENV:
- C7 の Unified Cache 容量・バッチサイズのチューニング
HAKMEM_TINY_UNIFIED_C7とunified_cache_refill()のmax_batch設定を変えつつ、 Page Box ON 時の C7 ヒット率・Shared Pool ロック回数・throughput を観測し、C7 にとって最適な容量/バッチサイズを探る。
- Page Box を C5/C6 に拡張するかの判断
- C7 で十分な効果(Shared Pool ロック大幅減 + throughput 向上)が得られた場合、
HAKMEM_TINY_PAGE_BOX_CLASSES=5,6,7を試し、C5/C6 も Tiny-Plus 化したときの安定性・性能を確認する。 - 問題がなければ、デフォルトプロファイルを「C5–C7 Page Box 有効」に近づけるかを検討する。
- C7 で十分な効果(Shared Pool ロック大幅減 + throughput 向上)が得られた場合、
メモ
- ページフォルト問題は Prefault Box + ウォームアップで一定水準まで解消済みで、現在の主ボトルネックはユーザー空間の箱(Unified Cache / free / Pool)側に移っている。
- 以降の最適化は「箱を削る」ではなく、「HOT 層で踏む箱を減らし、Tiny 的なシンプル経路をどこまで広げるか」にフォーカスする。