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マガジン/mini‑mag/SLL)の保持分だけ、Systemより~0.5–0.65MBほど高めのRSSになるケースがある。 - ただし、保持分はフラッシュ/回収ポリシー次第で下げられる余地がある。 Planned steps (stage A: conservative, opt‑in) 1) Bench preset flush - 実装済: 環境変数 HAKMEM_TINY_FLUSH_ON_EXIT=1 で、プロセス終了時に全クラスのTLSマガジン/mini‑mag/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のauto‑tune - スイープ結果から、16/32Bは小さめcap(128/256)が有利、64Bはやや大きめ(512)が有利。 - グローバルcapではなく、クラス別下限capを導入(tiny_effective_capのテーブル化)。 5) SLL flushポリシーの導入 - SLL長がcap/2を超えたら一部を即座にマガジンへ移し、フラッシュ時の回収を容易にする。 How to measure - Throughput: scripts/run_tiny_hot_sweep.sh(size/batch/cycles) - RSS (steady-state, during run): scripts/measure_rss_tiny.sh - 例)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_...`。