Files
hakmem/docs/analysis/FIRST_TOUCH_PAGEFAULT_REDUCTION_PLAN.md
Moe Charm (CI) 8f18963ad5 Phase 36-37: TinyHotHeap v2 HotBox redesign and C7 current_page policy fixes
- Redefine TinyHotHeap v2 as per-thread Hot Box with clear boundaries
- Add comprehensive OS statistics tracking for SS allocations
- Implement route-based free handling for TinyHeap v2
- Add C6/C7 debugging and statistics improvements
- Update documentation with implementation guidelines and analysis
- Add new box headers for stats, routing, and front-end management
2025-12-08 21:30:21 +09:00

52 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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と長時間安定性テストを必須にする。