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

4.3 KiB
Raw Blame 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_HUGETLBMAP_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: 既存ヘッダと一致する場合は再書き込みを避け、必要最小限だけ書く。
    • offbench 専用): 既存ヘッダが正しければ書かず、壊れているときだけ最小限を書き戻すfree の整合性確保のための最低限。guard/memset もスキップ。
    • ENV: HAKMEM_TINY_HEADER_MODE=full|light|off(未指定は full。旧 HAKMEM_TINY_WRITE_HEADER=0off 相当として互換維持。
  • 実験結果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と長時間安定性テストを必須にする。