52 lines
4.3 KiB
Markdown
52 lines
4.3 KiB
Markdown
|
|
# FIRST_TOUCH_PAGEFAULT_REDUCTION_PLAN
|
|||
|
|
|
|||
|
|
## 現状サマリ(基準プロファイル: 16–1024B, 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 案: SuperSlabHugePageBox(Cold 側で実験用)
|
|||
|
|
- 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 16–1024B, 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/sys(perf 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)と長時間安定性テストを必須にする。
|