Fix C7 warm/TLS Release path and unify debug instrumentation

This commit is contained in:
Moe Charm (CI)
2025-12-05 23:41:01 +09:00
parent 96c2988381
commit d17ec46628
29 changed files with 1314 additions and 123 deletions

View File

@ -1,4 +1,4 @@
## HAKMEM 状況メモ (2025-12-05 更新)
## HAKMEM 状況メモ (2025-12-05 更新 / C7 Warm/TLS Bind 反映)
### 現在の状態Tiny / Superslab / Warm Pool
- Tiny Front / Superslab / Shared Pool は Box Theory 準拠で 3 層構造に整理済みHOT/WARM/COLD
@ -27,10 +27,26 @@
- `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` の順序を維持)。
- TLS Bind Box の導入:
- `core/box/ss_tls_bind_box.h``ss_tls_bind_one()` を追加し、「Superslab + slab_idx → TLS」のバインド処理`superslab_init_slab` / `meta->class_idx` 設定 / `tiny_tls_bind_slab`)を 1 箇所に集約。
- `superslab_refill()`Shared Pool 経路)および Warm Pool 実験経路から、この Box を経由して TLS に接続するよう統一。
- C7 Warm/TLS Bind 経路の実装と検証:
- `core/front/tiny_unified_cache.c` に C7 専用の Warm/TLS Bind モード0/1/2を追加し、Debug では `HAKMEM_WARM_TLS_BIND_C7` で切替可能にした。
- mode 0: Legacy Warmレガシー/デバッグ用、C7 では carve 0 が多く非推奨)
- mode 1: Bind-onlyWarm から取得した Superslab を TLS Bind Box 経由でバインドする本番経路)
- mode 2: Bind+TLS carveTLS から直接 carve する実験経路)
- Release ビルドでは常に mode=1 固定。Debug では `HAKMEM_WARM_TLS_BIND_C7=0/1/2` で切替。
- Warm Pool / Unified Cache の詳細計測:
- `warm_pool_dbg_box.h` と Unified Cache の計測フックを拡張し、C7 向けに
- Warm pop 試行/ヒット/実 carve 回数
- TLS carve 試行/成功/失敗
- UC ミスを Warm/TLS/Shared 別に分類
を Debug ビルドで観測可能にした。
- `bench_random_mixed.c``HAKMEM_BENCH_C7_ONLY=1` を追加し、C7 サイズ専用の micro-bench を追加。
### 性能の現状Random Mixed, HEAD
- 条件: `bench_random_mixed_hakmem 1000000 256 42`1T, ws=256, RELEASE, 161024B
- HAKMEM: 約 5.0M ops/s
- HAKMEM: 約 27.6M ops/sC7 Warm/TLS 修復後)
- system malloc: 約 90100M ops/s
- mimalloc: 約 120130M ops/s
- 条件: `bench_random_mixed_hakmem 1000000 256 42` +
@ -38,26 +54,27 @@
- HAKMEM Tiny Front: 約 8090M ops/smimalloc と同オーダー)
- 条件: `bench_random_mixed_hakmem 1000000 256 42` +
`HAKMEM_BENCH_MIN_SIZE=129 HAKMEM_BENCH_MAX_SIZE=1024`Tiny C5C7 のみ)
- HAKMEM: 約 4.74.8M ops/s
- HAKMEM: 約 28.0M ops/sWarm/TLS ガード適用後)
- 条件: C7 専用 micro-benchDebug, `HAKMEM_BENCH_C7_ONLY=1 HAKMEM_TINY_PROFILE=full HAKMEM_WARM_C7_MAX=8 HAKMEM_WARM_C7_PREFETCH=4` ほか)
- mode 0Legacy Warm: 約 2.0M ops/s、C7 Warm ヒット 0・Shared Pool ロック多数(`slab_carve_from_ss` が 0 を頻発)
- mode 1Bind-only: 約 20M ops/siters=200K, ws=32、Warm hit ≈100%・Shared Pool ロック 5 回まで減少
- mode 2Bind+TLS carve 実験): mode 1 と同等〜わずかに上UC ミスは増えるが `uc_miss_tls` に集中し、avg_refill は短縮)
- 条件: C7 専用 micro-benchRelease, `HAKMEM_BENCH_C7_ONLY=1 HAKMEM_TINY_PROFILE=full HAKMEM_WARM_C7_MAX=8 HAKMEM_WARM_C7_PREFETCH=4`
- HAKMEM: 約 18.8M ops/s空スラブ強制ガード + リセット導入後、Debug と同オーダーまで回復)
- 結論:
- Tiny front 自体8128Bは十分速く、mimalloc と同オーダーまで出ている。
- 1291024B の Tiny C5C7 経路で Unified Cache hit=0 / Shared Pool ロック多発というボトルネックがあり
Random Mixed 全体の性能を支配している
- C5C7 経路は「満杯 C7 slab を Warm に再供給していた」問題を空スラブ限定ガードRelease/Debug 共通リセットで解消し
C7-only Release も ~18.8M ops/s に回復。Random Mixed Release も 27M クラスまで改善
### 次にやること(優先タスクC7 Page Box の実効性検証とチューニング
1. **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=` 未設定 vs `7`)で比較する。
2. **C7 の Unified Cache 容量・バッチサイズのチューニング**
- `HAKMEM_TINY_UNIFIED_C7``unified_cache_refill()``max_batch` 設定を変えつつ、
Page Box ON 時の C7 ヒット率・Shared Pool ロック回数・throughput を観測し、C7 にとって最適な容量/バッチサイズを探る。
3. **Page Box を C5/C6 に拡張するかの判断**
- C7 で十分な効果Shared Pool ロック大幅減 + throughput 向上)が得られた場合、
`HAKMEM_TINY_PAGE_BOX_CLASSES=5,6,7` を試し、C5/C6 も Tiny-Plus 化したときの安定性・性能を確認する。
- 問題がなければ、デフォルトプロファイルを「C5C7 Page Box 有効」に近づけるかを検討する。
### 次にやること(広い条件での安定化確認
1. `HAKMEM_BENCH_MIN_SIZE=129 HAKMEM_BENCH_MAX_SIZE=1024` や通常の `bench_random_mixed_hakmem 1000000 256 42`
空スラブ限定ガードが副作用なく動くかを継続確認(現状 Release で 2728M ops/s を確認済み)。
2. ドキュメント更新:
- Release だけ C7 Warm が死んでいた根本原因 = 満杯 C7 slab を Shared Pool がリセットせず再供給していた。
- Acquire の空スラブ強制ガードRelease/Debug 共通リセットで C7-only Release が ~18.8M ops/s まで回復した。
3. 次フェーズ案:
- C5/C6 でも同様の Warm/TLS 最適化・空スラブガードを適用するか、
- Random Mixed 全体のボトルネックShared Pool ロック/Wrapper/mid-size path など)を洗うかを選択。
### メモ
- ページフォルト問題は Prefault Box + ウォームアップで一定水準まで解消済みで、現在の主ボトルネックはユーザー空間の箱Unified Cache / free / Pool側に移っている。