Files
hakmem/docs/design/MEM_EFFICIENCY_PLAN.md

49 lines
3.2 KiB
Markdown
Raw Normal View History

Memory Efficiency Plan (Tiny focus)
Current observations (direct link, Tiny hotset)
- RSS microbench (steady-state) via scripts/measure_rss_tiny.sh:
- 64B, live=20k, iters=1000
- HAKMEM (LD): peak≈3532 kB, end≈3532 kB
- System : peak≈2972 kB, end≈2972 kB
- 32B, live=30k, iters=1000
- HAKMEM (LD): peak≈3532 kB, end≈3532 kB
- System : peak≈3004 kB, end≈3004 kB
- 16B, live=40k, iters=1000
- HAKMEM (LD): peak≈3572 kB, end≈3572 kB
- System : peak≈2928 kB, end≈2928 kB
Interpretation
- TinyのキャッシュTLSマガジン/minimag/SLLの保持分だけ、Systemより~0.50.65MBほど高めのRSSになるケースがある。
- ただし、保持分はフラッシュ/回収ポリシー次第で下げられる余地がある。
Planned steps (stage A: conservative, optin)
1) Bench preset flush
- 実装済: 環境変数 HAKMEM_TINY_FLUSH_ON_EXIT=1 で、プロセス終了時に全クラスのTLSマガジン/minimag/SLLをフラッシュし、続けて空スラブをトリムhak_tiny_trim
- 目的: ベンチ終了時のRSS残量を低減測定容易に
- 注意: 現行の scripts/measure_rss_tiny.sh はベンチ終了直前にRSSを出力するため、退出時フラッシュの効果は数値に反映されません。退出後に親側でRSSを採取する/usr/bin/time -v 等)か、ベンチ自身で flush+trim を呼んだ後にRSSを測るモードを後日追加予定。
2) Idle flush hook安全側、オプション
- 低頻度タイマまたは呼び出しN回毎に薄く走査して、高水位超過時に各TLSキャッシュを縮小capの逓減を強化
- 初期はTiny専用、クラス単位でしきいを設ける。
3) 空スラブ回収conservative
- 既に空になったslabを検出して、free_slabsからdetach→release_slabへロック下
- ミスコストを避けるため、検出頻度を抑え、capが低い時のみ有効化。
Planned steps (stage B: tuning)
4) MAG_CAPのautotune
- スイープ結果から、16/32Bは小さめcap128/256が有利、64Bはやや大きめ512が有利。
- グローバルcapではなく、クラス別下限capを導入tiny_effective_capのテーブル化
5) SLL flushポリシーの導入
- SLL長がcap/2を超えたら一部を即座にマガジンへ移し、フラッシュ時の回収を容易にする。
How to measure
- Throughput: scripts/run_tiny_hot_sweep.shsize/batch/cycles
- RSS (steady-state, during run): scripts/measure_rss_tiny.sh <size> <live_count> <iters>
-64B, live=20k: bash scripts/measure_rss_tiny.sh 64 20000 1000
- Max RSS (process-level): scripts/run_memory_efficiency.sh [cycles]
- 直リンク tiny-hot を /usr/bin/time -v で包み、Maximum resident set size(kB) をCSV出力
- HAKMEM_TINY_FLUSH_ON_EXIT=0/1 を切り替えて、退出時フラッシュの効果もA/B可能
Notes
- LD_PRELOADの安定性はHarden中。RSS測定は直リンク/LDのどちらでも実施可能だが、LDではreallocの混在に注意現状は安全フォールバックで回避
- 退出フラッシュを試すには: `HAKMEM_TINY_FLUSH_ON_EXIT=1 ./bench_...`