Files
hakmem/docs/analysis/FIRST_TOUCH_PAGEFAULT_REDUCTION_PLAN.md

52 lines
4.3 KiB
Markdown
Raw Normal View History

# FIRST_TOUCH_PAGEFAULT_REDUCTION_PLAN
## 現状サマリ(基準プロファイル: 161024B, ws=400, iters=1M, C7_SAFE, v2 OFF
- HAKMEM: ~6,600 page-faults / ~40.6M ops/s, user≈29 ms / sys≈18.5 ms
- mimalloc: ~150 page-faults / ~112.9M ops/s
- system malloc: ~130 page-faults / ~92.1M ops/s
- Superslab OS 呼び出しHAKMEM_SS_OS_STATS=1: alloc=2 / free=3 / madvise=2 → OS mmap/munmap は支配的でない
- WarmPool (C7): ヒット ~99% でほぼ効いている。残存 pf は first-write が主因と推定。
## 方針(研究用 / デフォルト OFF
- Mode A: Superslab を HugePage / 大きめサイズで確保し、first-write そのものを減らす実験
- Mode B: allocator 側の初期書き込み(ヘッダ/ゼロ埋めを減らし、first-touch をアプリ側に寄せる実験
- いずれも ENV で opt-in。デフォルトは OFF本番プロファイルは現状維持
## Mode A: HugePage / 大きめ Superslab 実験 Box実験実装済み
- Box 案: SuperSlabHugePageBoxCold 側で実験用)
- ENV:
- `HAKMEM_SS_HUGEPAGE_EXPERIMENT=1` で HugePage を試行(デフォルト 0
- `HAKMEM_SS_HUGEPAGE_SIZE` でページサイズ指定(未指定なら 2MB を仮定)
- 実装Phase52:
- ss_os_acquire が ENV ON のときだけ `MAP_HUGETLB``MAP_HUGE_2MB` も併用できる環境では付与)を試し、失敗時は静かに通常 mmap にフォールバック。Stats で huge_alloc / huge_fail を出力。
- Superslab サイズが 2MB と一致するときのみ HugePage を試す(その他サイズは従来経路)。
## Mode B: allocator 側 first-write 削減案
- ヘッダ書き込みを減らすオプションC5/C6/C7 region_id/guard ヘッダを実験的に省略)。安全性とトレードオフなので研究用 BOX (FirstTouchPolicyBox) に閉じ込める。
- ゼロ初期化の重複を洗う:
- どこで memset/clear をしているかTiny front / mid / Superslabを列挙し、アプリが必ず書く領域を allocator 側で二重初期化していないか確認。
- Box Theory ルール:
- ポリシーは FirstTouchPolicyBox に集約し、ホットパスは policy snapshot を読むだけにする。
- Tiny ヘッダ/初期化の 3 モードbench 専用 ENV 実装済み):
- `full`(デフォルト): region_id_write_header を常に書き戻す(従来どおり)。
- `light`: 既存ヘッダと一致する場合は再書き込みを避け、必要最小限だけ書く。
- `off`bench 専用): 既存ヘッダが正しければ書かず、壊れているときだけ最小限を書き戻すfree の整合性確保のための最低限。guard/memset もスキップ。
- ENV: `HAKMEM_TINY_HEADER_MODE=full|light|off`(未指定は full。旧 `HAKMEM_TINY_WRITE_HEADER=0``off` 相当として互換維持。
- 実験結果Mixed 161024B, ws=400, iters=1M, C7_SAFE, v2 OFF:
- HEADER_MODE=full: ≈42.40M ops/s, page-faults ≈6,662, cycles ≈176M。
- HEADER_MODE=light: ≈38.75M ops/s, page-faults ≈6,661, cycles ≈187M。
- HEADER_MODE=off: ≈39.33M ops/s, page-faults ≈6,662, cycles ≈184M。
- 所感:
- pf 回数は 3 モードとも ≈6.66k でほぼ同一。ヘッダ write 軽量化では first-touch page-fault は減らない。
- cycles/ops は full が最良で、light/off は判定・分岐コストの増加により約 7〜9% の性能低下。
- 現時点では運用デフォルトは full のままが最良。light/off は bench 専用の research モードとして維持し、本番プロファイルでは使用しない。
## 評価プロファイル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`
- メトリクス: ops/s, page-faults, user/sysperf stat: cycles,instructions,task-clock,page-faults
- このプロファイルで Mode A/B を A/B し、pf がどこまで下がるかを見る。
## ガードレール
- HugePage / header-skip / zero-skip は研究専用でデフォルト OFF。ENV 明示なしでは有効化しない。
- 本番プロファイルに入れる場合は Fail-Fast / Guard明示 opt-inと長時間安定性テストを必須にする。