Files
hakmem/docs/analysis/PERF_ANALYSIS_TINY_FRONT_FLATTEN_PHASE42.md

275 lines
23 KiB
Markdown
Raw Normal View History

# Phase42 Front Route Flatten ベースライン計測
- ビルド: `make bench_random_mixed_hakmem -j4`
## C7-only (ws=64, iters=20000, v2 OFF)
- ENV: `HAKMEM_BENCH_C7_ONLY=1 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_STATS_BOX=1 HAKMEM_TINY_STATS_BATCH=0 HAKMEM_TINY_LARSON_FIX=1`
- 結果: `Throughput = 41365988 ops/s`
- 備考: HEAP_STATS のダンプは出ず要調査。FRONT_CLASS: cls7 alloc=11016。
## Mixed 161024B (ws=256, iters=20000, v2 OFF)
- ENV: `HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_TINY_FRONT_CLASS_STATS=1`
- 結果: `Throughput = 43538552 ops/s`
- 備考: FRONT_CLASS alloc countscls2:147, cls3:341, cls4:720, cls5:1420, cls6:2745, cls7:5692。HEAP_STATS ダンプは出ず。
## Tiny-only 8128B (ws=256, iters=20000, v2 OFF) ※任意測定
- ENV: `HAKMEM_BENCH_MIN_SIZE=8 HAKMEM_BENCH_MAX_SIZE=128 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_TINY_FRONT_CLASS_STATS=1`
- 結果: `Throughput = 65979164 ops/s`
- 備考: FRONT_CLASS alloc countscls2:147, cls3:341, cls4:720, cls5:9857。HEAP_STATS ダンプは出ず。
# Phase65 後半: 長尺 v2 ON/OFF A/Bws=400, iters=1M, PROFILE=C7_SAFE
- 共通 ENV: `HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_TINY_HEAP_STATS=1 HAKMEM_TINY_HEAP_STATS_DUMP=1 HAKMEM_TINY_HOTHEAP_V2_STATS=1`
## C7-only
- v2 OFF (`HOTHEAP_V2=0`): **38.24M ops/s**, HEAP_STATS[7] fast=550099 slow=1。
- v2 ON (`HOTHEAP_V2=1`, classes=0x80): **38.68M ops/s**, HEAP_STATS[7] fast=550099 slow=1。v2 stats: refill=1、fail/fallback=0。
## Mixed 161024B
- v2 OFF: **41.78M ops/s**, HEAP_STATS[7] fast=283169 slow=1。
- v2 ON: **41.94M ops/s**, HEAP_STATS[7] fast=283169 slow=1。v2 stats: refill=1、fail/fallback=0。
- 所感: 長尺では v2 ON/OFF とも slow≈1 に収束し、性能も ±5% 以内(むしろ微プラス)。短尺で見える refill≈50 はウォームアップ由来と判断。
### Phase65/66 サマリ表1M / ws=400, PROFILE=C7_SAFE
| プロファイル | v2 OFF ops/s | v2 ON ops/s | HEAP_STATS[7] slow | 備考 |
|-----------------------|-------------:|------------:|--------------------:|-------------------------|
| C7-only (C7-only ベンチ) | 38.24M | 38.68M | 1 | v2 は微プラス・refill=1 |
| Mixed 161024B | 41.78M | 41.94M | 1 | v2 は微プラス・refill=1 |
---
# Phase43 (HEAP_STATS 再有効化の再計測) ※v2 OFF
- HEAP_STATS 用 ENV を明示 (`HAKMEM_TINY_HEAP_STATS=1 HAKMEM_TINY_HEAP_STATS_DUMP=1`) したが、現状はダンプが出ていない。fast/slow の値は別途要確認。
## C7-only (ws=64, iters=20000)
- ENV: `HAKMEM_BENCH_C7_ONLY=1 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_STATS_BOX=1 HAKMEM_TINY_STATS_BATCH=0 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_TINY_HEAP_STATS=1 HAKMEM_TINY_HEAP_STATS_DUMP=1 HAKMEM_TINY_FRONT_CLASS_STATS=1`
- Throughput: `37,777,547 ops/s`
- HEAP_STATS cls7: fast=11015 slow=1 / free_fast_local=8726、C7_PAGE_STATS: prepare_calls=1 prepare_with_current_null=1
- FRONT_CLASS: cls7 alloc=11016 free=8726
## Mixed 161024B (ws=256, iters=20000)
- ENV: `HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_TINY_HEAP_STATS=1 HAKMEM_TINY_HEAP_STATS_DUMP=1 HAKMEM_TINY_FRONT_CLASS_STATS=1`
- Throughput: `42,029,698 ops/s`
- HEAP_STATS cls7: fast=5691 slow=1 / free_fast_local=4573cls5/6 未出力)
- FRONT_CLASS alloc: cls2=147 cls3=341 cls4=720 cls5=1420 cls6=2745 cls7=5692
## Tiny-only 8128B (ws=256, iters=20000)
- ENV: `HAKMEM_BENCH_MIN_SIZE=8 HAKMEM_BENCH_MAX_SIZE=128 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_TINY_HEAP_STATS=1 HAKMEM_TINY_HEAP_STATS_DUMP=1 HAKMEM_TINY_FRONT_CLASS_STATS=1`
- Throughput: `65,890,043 ops/s`
- HEAP_STATS: 出力なしcls7 も 0→ クラス0〜6は計測対象外の可能性。要調査。
### メモ
- C7-only では HEAP_STATS/PAGE_STATS が出ることを確認。Mixed/Tiny-only では cls7 以外の HEAP_STATS が落ちておらず、環境/計測対象の条件を再確認する余地あり。
# Phase63: C6 v2 A/BC6-heavy / Mixed, C7 SAFE
- 共通 ENV: `HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_HOTHEAP_V2_STATS=1 HAKMEM_TINY_HEAP_STATS=1 HAKMEM_TINY_HEAP_STATS_DUMP=1`
## C6-heavy (min=257/max=768, ws=400, iters=1M)
- v2 OFF (`HOTHEAP_V2=0`): **42.15M ops/s**, HEAP_STATS[7] fast=283169 slow=1。
- v2 ON (`HOTHEAP_V2=1`, classes=0x40): **29.69M ops/s**。HEAP_STATS[6] fast=266914 slow=16。HOTHEAP_V2_STATS cls6 route_hits=0 / free_fb_v1=266930実質 v1 経路、fail=0。
## Mixed 161024B (ws=400, iters=1M)
- C7 v2 only (`classes=0x80`): **45.07M ops/s**。HEAP_STATS[7] fast=283170 slow=2276、v2 alloc_lease/refill=2276。
- C6+C7 v2 (`classes=0xC0`): **35.65M ops/s**。HEAP_STATS[6] fast=137306 slow=1 / cls7 slow=2276。HOTHEAP_V2_STATS cls6 route_hits=0、cls7 refills=2276。
- 所感: C6 v2 は初回 A/B で大幅マイナスかつ v2 ルートが当たっていない。C7 v2 もこのプロファイルでは refill が 2,276 件と多く throughput 低下。v2 は研究箱のまま、デフォルトは v2 OFF。
# Phase43'': 計測専用で C6/C7 を TinyHeap に載せた場合v2 OFF
## Mixed 161024B (ws=256, iters=20000, class mask=0xC0, C6+C7)
- ENV: `HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_HEAP_CLASSES=0xC0 HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_C6_HOT=1 HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_TINY_HEAP_STATS=1 HAKMEM_TINY_HEAP_STATS_DUMP=1 HAKMEM_TINY_FRONT_CLASS_STATS=1`
- Throughput: `32,227,500 ops/s`(性能は大幅に低下、計測専用)
- HEAP_STATS:
- cls6: fast=2744 slow=1 free_fast_local=2745
- cls7: fast=5691 slow=1 free_fast_local=4572
- FRONT_CLASS alloc: cls2=147 cls3=341 cls4=720 cls5=1420 cls6=2745 cls7=5692
## Tiny-only 8128B (ws=256, iters=20000, class mask=0xC0, C6+C7)
- ENV: `HAKMEM_BENCH_MIN_SIZE=8 HAKMEM_BENCH_MAX_SIZE=128 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_HEAP_CLASSES=0xC0 HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_C6_HOT=1 HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_TINY_HEAP_STATS=1 HAKMEM_TINY_HEAP_STATS_DUMP=1 HAKMEM_TINY_FRONT_CLASS_STATS=1`
- Throughput: `63,341,251 ops/s`
- HEAP_STATS: 出力なし(対象クラスが 5 未満中心のため?)
### 所感
- C6 を TinyHeap 経由にすると Mixed で大きくマイナス32M。cls6/7 の slow はいずれも 1 なので、性能低下はフロント/ホットパスの命令数増が主因と見られる。
- 計測目的でのみクラスマスクを広げるのは有効だが、本番プロファイルは C7 のみ TinyHeap (0x80) を維持するのが安全。
# Phase48: first-touch/page-fault 実験用プロファイルの固定
- 評価は以下で統一し、pf/sys A/B の基準にする:
- `HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1`
- perf stat メトリクス: ops/s, page-faults, task-clock(user/sys), cycles, instructions
- 目的: HugePage/first-touch 削減などの実験をこのプロファイルで比較し、pf がどれだけ減るかを確認する。
# Phase45: 161024B perf stat A/BHAKMEM vs mimalloc vs system, ws=400, iters=1,000,000, v2 OFF, C7 SAFE
共通ENV: `HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024`
| Allocator | Throughput (ops/s) | cycles | instructions | IPC | task-clock | user/sys | page-faults |
|-----------|-------------------:|-------:|-------------:|----:|-----------:|---------:|------------:|
| HAKMEM (C7_SAFE, v2 OFF) | 40,623,450 | 181,136,824 | 372,126,696 | 2.05 | 46.82 ms | 29.4 ms / 18.5 ms | 6,659 |
| mimalloc | 112,895,946 | 38,800,615 | 59,184,115 | 1.53 | 10.66 ms | 10.31 ms / 1.41 ms | 146 |
| system malloc | 92,111,481 | 52,144,974 | 107,607,240 | 2.06 | 12.54 ms | 12.27 ms / 1.36 ms | 133 |
所感/次手候補:
- HAKMEM は sys 時間と page-fault が顕著pf が mimallocの ~45x, sys 時間が高い。pf/sys 寄りのボトルネックが支配的に見える。
- 次の箱候補:
- pf/sys 改善を狙う: Superslab/Warm Pool/pagefault 周りのCold Box見直し。
- 命令数削減: front整理は済みなので、Tiny v1ホットパスや mid/large を軽くする路線も候補。
### メモ
- HEAP_STATSfast/slowのダンプが出ない状態。今後のベンチでは `HAKMEM_TINY_HEAP_STATS[_DUMP]` の有効化経路を再確認する必要あり。
# Phase46: pf/sys 内訳の初期確認HAKMEM, 161024B, ws=400, iters=1,000,000, v2 OFF, C7_SAFE
- `perf record -o perf.data.pf -e page-faults -- ./bench_random_mixed_hakmem 1000000 400 1`
- `perf report --stdio -i perf.data.pf`
- サマリ: page-fault サンプルの ~96% が `__memset_avx2_unaligned_erms`(初回タッチ系)。カーネル側の munmap/madvise 由来はほぼ見えず、残っている 6.6k faults は first-write が中心と推定。
- 基準プロファイル(以降 pf/sys A/B の基準にする想定):
- `HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1`
- TODO / 次の箱候補:
- WarmPool / Superslab 再利用が十分効いているかの stats 確認(該当 ENV を後続で調査)。
- empty Superslab を即 OS 返却していないかのポリシー確認。
- pf/sys 系の変更は上記プロファイルで揃えて A/B を取る。
# Phase46': WarmPool stats 1 回だけ確認Mixed 161024B, ws=256, iters=20k, v2 OFF, C7_SAFE
- ENV: `HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_WARM_POOL_STATS=1`
- 結果stderr 抜粋):
- WarmPool-STATS: C7 hits=173 / misses=1 / prefilled=1約 99.4% ヒット。C2/C3/C4/C6 は warmup/prefill の 1 miss/1 prefill のみ。C0/C1/C5 は 0。
- WARM logs: `REL_C7_WARM_PREFILL calls=1 slabs=1`, `REL_C7_CARVE attempts=173 success=173`, `REL_C7_WARM pop=174 push=173`.
- Throughput: 43,809,979 ops/sws=256, iters=20k
- 所感:
- C7 は warm pool でほぼヒットしており、残り pf は first-write 優位という推定と矛盾しない。
- 他クラスの warm pool はほぼ未使用prefill 1 回のみ。Mixed での pf/sys は C7 以外の Superslab 利用状況も別途見る必要あり。
# Phase49: Mixed 161024B userland-only CPU パス観測v2 OFF, C7_SAFE
- ENV: `HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1`
- perf stat1M iters, ws=400, userlandのみ: throughput=41,000,086 ops/s, cycles=126,239,279, instructions=324,810,642IPC≈2.57, branch-misses=1,186,675, time=0.0438suser 0.0295s / sys 0.0143s
- perf recordcycles:u, 1M/400上位シンボルself%基準、子なし集計):
- free 24.3%libc wrapper経由の前段処理
- malloc 18.0%
- main 15.3%(ベンチハーネス)
- tiny_heap_page_pop 8.8%TinyHeapBox hot pop
- hak_super_lookup 7.9%frontからの Superslab 判定)
- tiny_heap_page_becomes_empty 5.9%empty 処理)
- __memset_avx2_unaligned_erms 4.0%(ユーザランド側の初期化)
- tiny_region_id_write_header 2.4%
- 所感: ベンチ前段の malloc/free/main が重いが、TinyHeapBox 側では pop / super_lookup / empty が目立つ。Phase50 では TinyHeapBoxpop/empty + super_lookup 周辺)の枝削減を優先候補にする。
# Phase47: Superslab OS ポリシーと OS 呼び出し可視化
- Superslab取得パス: LRU pop → 旧 cache pop → ss_os_acquire(mmap、必要なら MAP_POPULATE / prefault touch) の順。mmap 成功時に g_ss_mmap_count + SS_OS_STATS alloc を更新。
- Superslab解放パス: registry unregister → LRU push成功時は MADV_DONTNEED で lazy zero、今回 madvise カウント追加)→ 旧 cache push → どちらも満杯なら即 munmapSS_OS_STATS free を加算。ss_cache が容量縮小で munmap した場合も free をカウント。
- 新 ENV: `HAKMEM_SS_OS_STATS=1` で alloc/free/madvise を destructor 1 行でダンプ(`[SS_OS_STATS] alloc=… free=… madvise=…`。基準プロファイル161024B, ws=400, iters=1M, C7_SAFE, v2 OFFで 1 回回して OS 呼び出し回数を確認予定。
- SS_OS_STATS161024B, ws=400, iters=1M, C7_SAFE, v2 OFF: alloc=2 / free=3 / madvise=2 / mmap_total=2 → OS 呼び出しは少数。残る 6.6k pf は first-write 優位と見るのが妥当。
# Phase47: C6-heavy CPU ホットパスの初期観測v2 OFF, C7_SAFE
- ベンチ (ws=256, iters=20k, C6-heavy):
- ENV: `HAKMEM_BENCH_MIN_SIZE=257 HAKMEM_BENCH_MAX_SIZE=768 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_TINY_FRONT_CLASS_STATS=1 HAKMEM_TINY_HEAP_STATS=1 HAKMEM_TINY_HEAP_STATS_DUMP=1`
- Throughput: `39,457,304 ops/s`
- FRONT_CLASS: cls6 alloc/free=5373、cls7 alloc=5692 free=4573
- HEAP_STATS cls7: fast=5691 slow=1、C7_PAGE_STATS prepare_calls=1
- perf stat (1M, ws=400, same ENV):
- Throughput: `41,295,709 ops/s`
- cycles=175,790,796 / instructions=368,496,560 (IPC≈2.10) / task-clock=42.36 ms (user 27.26 ms / sys 16.13 ms) / branch-misses=2,206,657
- perf record (cycles, 1M, ws=400):
- ホットスポットは匿名ページフォルト経路に集中(`__memset_avx2_unaligned_erms``handle_mm_fault``do_anonymous_page` が包含 60%超)。
- ユーザランド側では `free`/`malloc` が目立つがカーネルの first-touch が支配的。
- 所感: C6-heavy でも pf/sys が依然大きく、C6/Tiny フロントより先に first-touch/zero の扱いを考える必要があるprefault/warm 再利用の検討)。
# Phase50: Tiny ヘッダモード (full/light/off) A/Bfirst-touch 実験の一部)
- 目的: `tiny_region_id_write_header` のヘッダ書き込み/guard 初期化を軽量化することで page-fault / cycles がどこまで動くかを確認。
- 実装概要:
- ENV `HAKMEM_TINY_HEADER_MODE=full|light|off` を追加(未指定は full
- `full`: 従来どおり region_id ヘッダと guard/初期化を常に書き戻す。
- `light`: 既存ヘッダと一致する場合は再書き込みを避け、差分のみ最小限書く。
- `off`: 既存ヘッダが壊れている場合のみ最小限のヘッダを書き戻し、guard 呼び出しや追加初期化はスキップfree 整合性の最低限のみ保証)。旧 `HAKMEM_TINY_WRITE_HEADER=0` は off 相当として互換維持。
- `FIRST_TOUCH_PAGEFAULT_REDUCTION_PLAN.md` に 3 モードの設計と ENV を明記bench 専用 opt-in モードとして扱う)。
## Mixed 161024B (ws=400, iters=1M, PROFILE=C7_SAFE, v2 OFF, LARSON_FIX=1)
- 共通 ENV: `HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1`
- HEADER_MODE=full:
- Throughput: **42,399,649 ops/s**
- cycles: 176,079,783
- page-faults: 6,662
- task-clock: 42.16 msuser 25.1 ms / sys 17.8 ms
- HEADER_MODE=light:
- Throughput: **38,752,779 ops/s**
- cycles: 187,089,553
- page-faults: 6,661
- task-clock: 44.16 msuser 31.5 ms / sys 13.2 ms
- HEADER_MODE=off:
- Throughput: **39,330,655 ops/s**
- cycles: 183,795,801
- page-faults: 6,662
- task-clock: 43.43 msuser 29.3 ms / sys 15.2 ms
### 所感(ヘッダモード実験)
- page-fault 回数は full/light/off いずれも ≈6.66k とほぼ同一で、ヘッダ書き込み軽量化では first-touch page-fault は減らない。
- cycles/ops はむしろ full が最も良く、light/off はそれぞれ約 -9% / -7% 程度の性能低下。判定・分岐コストがヘッダ書き込み削減効果を上回っている。
- 結論として、現時点の実装では **運用デフォルトは full のままが最良**。light/off は bench 専用の実験モードとして残し、本番プロファイルでは使用しない前提とする。
# Phase52: Superslab HugePage 実験 (Mode A) 初期結果
- 目的: Superslab を HugePage (2MB) で確保する実験経路を追加し、page-fault / sys 時間がどこまで動くかを見る(研究専用)。
- 実装概要:
- ENV:
- `HAKMEM_SS_HUGEPAGE_EXPERIMENT=1` で HugePage 経路を opt-inデフォルト 0
- `HAKMEM_SS_HUGEPAGE_SIZE` でページサイズを指定(現状は "2M" 前提で実装)。
- `ss_os_acquire` 周辺に HugePage 試行を追加し、`MAP_HUGETLB | MAP_HUGE_2MB``mmap` を試し、失敗時は即通常の 1MB Superslab 経路にフォールバック。
- SS_OS_STATS に `huge_alloc` / `huge_fail` を追加し、`HAKMEM_SS_OS_STATS=1``[SS_OS_STATS] alloc=.. free=.. madvise=.. huge_alloc=.. huge_fail=..` を 1 行出力。
## Mixed 161024B (ws=400, iters=1M, PROFILE=C7_SAFE, v2 OFF, LARSON_FIX=1)
- 共通 ENV: `HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_HOTHEAP_V2=0 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_SS_OS_STATS=1`
- HugePage OFF:
- Throughput: **41,464,379 ops/s**
- cycles: 180,862,510
- page-faults: 6,660
- SS_OS_STATS: `alloc=2 free=4 madvise=2 mmap_total=2 fallback_mmap=0 huge_alloc=0 huge_fail=0`
- HugePage ON (`HAKMEM_SS_HUGEPAGE_EXPERIMENT=1`, `HAKMEM_SS_HUGEPAGE_SIZE=2M`):
- Throughput: **41,372,856 ops/s**
- cycles: 177,305,948
- page-faults: 6,662
- SS_OS_STATS: `alloc=2 free=4 madvise=2 mmap_total=2 fallback_mmap=0 huge_alloc=0 huge_fail=0`
### 所感HugePage 実験初期結果)
- 現状の Superslab サイズ/条件では HugePage 経路が一度もヒットせず(`huge_alloc=0` / `huge_fail=0`)、通常 Superslab 経路のみが使用されている。
- そのため HugePage ON/OFF で throughput / cycles / page-fault はほぼ同一となり、初期実装の段階では効果は「ゼロに近い」。
- 2MB Superslab 専用クラスを設計するか、サイズ条件を緩めて HugePage を実際に使うかを決めないと、Mode A の効果は評価できない。
- 一方で pf はすでに ≈6.6k と小さく、たとえ HugePage でさらに削っても全体への寄与は限定的なため、現時点では **CPU ホットパス側の最適化を優先し、HugePage 実験は research-only の位置付けに留める** のが妥当と見える。
## Phase59: C7 HotHeap v2 Mixed A/BC7-only route ON/OFF
- プロファイル: `HAKMEM_BENCH_MIN_SIZE=16 HAKMEM_BENCH_MAX_SIZE=1024 HAKMEM_TINY_HEAP_PROFILE=C7_SAFE HAKMEM_TINY_C7_HOT=1 HAKMEM_TINY_LARSON_FIX=1 HAKMEM_TINY_HEAP_STATS=1 HAKMEM_TINY_HEAP_STATS_DUMP=1 HAKMEM_TINY_HOTHEAP_CLASSES=0x80`
- v2 OFF (`HAKMEM_TINY_HOTHEAP_V2=0`):
- Throughput: **45,113,732 ops/s**
- HEAP_STATS[7]: fast=5691 slow=1
- C7_PAGE_STATS: prepare_calls=1current を握り続けている)
- v2 ON (`HAKMEM_TINY_HOTHEAP_V2=1`, `HAKMEM_TINY_HOTHEAP_V2_STATS=1`):
- Throughput: **46,209,226 ops/s**(約 +2.4%
- HEAP_STATS[7]: fast=5692 slow=45
- HOTHEAP_V2_C7_STATS: route_hits=5692, alloc_fast=5692, alloc_lease=45 (=refill=45), cold_refill_fail=0, free_fast=4376, page_retired=4, fallback_v1=0
- 所感:
- Mixed でも v2 ON で微増(+2〜3%だが、slow_prepare/alloc_lease が 45 と多く、current/partial を使い切る前に refill が走っている可能性がある。
- cold_refill_fail/fallback は 0 のため、境界は安定。次は v2 内で空ページを握るrefill の発生頻度を下げる調整が必要。
## Phase60: C7 HotHeap v2 空ページ保持ポリシーpartial 温存)初期ベンチ
- 変更点: `max_partial_pages` を C7 用に 2 へ設定し、free で `used==0` のページは retire せず partial へ温存。partial が上限を超えたときだけ retire。partial push/pop/peak/retire_v2 を v2 stats に追加。
- C7-only (ws=64, iters=20k, PROFILE=C7_SAFE):
- v2 OFF: **41.94M ops/s**, HEAP_STATS[7] fast=11015 slow=1。
- v2 ON: **50.43M ops/s**, HEAP_STATS[7] fast=11016 slow=48。HOTHEAP_V2_C7_STATS: alloc_lease=48 (=refill), partial_push/pop/peak=0, retire_v2=0。
- メモ: workload が常時多数の live ブロックを持つため page が空にならず、partial_push/retire はまだ発火していない。slow≈refill となっており、ページ容量/同時 live 数が原因と推定。
- Mixed 161024B (ws=256, iters=20k, PROFILE=C7_SAFE):
- v2 OFF: **42.82M ops/s**, HEAP_STATS[7] fast=5691 slow=1。
- v2 ON: **47.71M ops/s**, HEAP_STATS[7] fast=5692 slow=42。HOTHEAP_V2_C7_STATS: alloc_lease=42 (=refill), partial_push/pop/peak=0, retire_v2=0。
- 所感:
- slow_prepare は「refill したページ数」と一致しており、空ページ保持ポリシーはまだ効く場面に遭遇していない(ページが一度も空にならないワークロード)。
- v2 は C7-only/Mixed ともプラスを維持(+20% 近い向上だが、refill=slow が 40〜50 回発生。partial を効かせるには「空になるページ」が出るプロファイルで検証するか、ページ容量/lease 戦略の見直しが必要。
- 備考(容量と live 数):
- C7 の page capacity は 32 blocks約 32KiBで、ws=64/256/400 の Mixed では常時多数の live ブロックが存在するため、空 page がほぼ発生しない。partial/retire は保険として温存しつつ、現行ベンチでは出番がない前提で扱う。
## Phase61: C7 v2 長尺 Mixed (ws=400, iters=1M) 安定性確認
- プロファイル: Mixed 161024B, ws=400, iters=1M, PROFILE=C7_SAFE, C7_HOT=1, v2 classes=0x80, LARSON_FIX=1, STATS_BOX=on, STATS_BATCH=0。
- v2 OFF: **41.58M ops/s**。HEAP_STATS[7] fast=283169 slow=1。cold_refill_fail=0, fallback_v1=0。
- v2 ON: **42.41M ops/s**(約 +2%。HEAP_STATS[7] fast=283169 slow=1。v2 stats dumpはなしfail/fallbackなし
- 所感:
- 長尺でも v2 ON で安定稼働し、+2% 程度の改善を維持。slow_prepare は 1 に張り付き、短尺で見えていた refill 多発は長尺では再現せず。
- 引き続き v2 は C7-only の研究箱(デフォルト OFFのまま、Mixed でも回帰しないことを確認。
### Phase61(短尺再確認): Mixed 161024B (ws=256, iters=20k)
- v2 OFF: **43.27M ops/s**, HEAP_STATS[7] fast=5691 slow=1。
- v2 ON (C7-only v2, classes=0x80, v2 stats ON): **44.57M ops/s**(約 +3%、HEAP_STATS[7] fast=5691 slow=1、cold_refill_fail/fallback=0。C7_PAGE_STATS: prepare_calls=1 で安定。
- 所感: 20k/256 でも slow_prepare は 1 に収まり、v2 ON で軽いプラスを維持。長尺と同様に安定。partial/retire ポリシーは依然発火せず(ページが空にならない負荷のため)、本線 Mixed では v2 を研究箱として継続しつつ、さらなる薄型化/slow圧縮を検討。