# Phase P0: Soft CAP 実装・安全実行プリセット 目的: Mid/L2.5 のリフィル強度を `FrozenPolicy` の CAP で制御し、過剰補充とフォールバックを抑制。併せてベンチスクリプトに外部タイムアウトを導入し、長時間ハングを防止。 ## 実装概要 - Mid Pool (`hakmem_pool.c`) - Soft CAP 連動のバンドル制御を `refill_freelist()` に実装。 - `pol->mid_cap[*]` と `pages_by_class[*]` の差分で `bundles` を 1..4 に調整。 - CAP 以上では `bundles=1`(最小)。CAP 未満では不足に応じて下限(min bundle)を確保。 - CAP 超過時の簡易ステアル(±1..4 シャード)で過剰リフィル回避。 - L2.5 Large Pool (`hakmem_l25_pool.c`) - Soft CAP 連動の簡易バンドル(1..2)を `refill_freelist()` に追加。 - 既定は `1`、CAP 未満で不足が大きい場合のみ `2` まで前補充。 - CAP 超過時は `1` に固定。CAP 超でもアロケーションは枯渇させない(ソフトCAP)。 - CAP 超過時は先に隣接シャードから 1–2 段ステアルを試行(`hak_l25_pool_try_alloc`)。 ## 環境変数(P0関連) - `HAKMEM_POOL_MIN_BUNDLE`(Mid): 最小バンドル数(既定 2、推奨 A/B: 3–4) - `HAKMEM_L25_MIN_BUNDLE`(L2.5): 最小バンドル数(既定 1、範囲 1..2) ## ベンチスクリプトの安全化(外部タイムアウト) - `scripts/run_bench_suite.sh` - 既定 `RUNTIME=1`、`BENCH_TIMEOUT=RUNTIME+3`、`KILL_GRACE=2` - すべての実行を `timeout -k` でラップ - `scripts/save_prof_sweep.sh`: 同上(保存スイープ) - `scripts/ab_sweep_mid.sh`: 同上(Mid A/B) - 付属: `scripts/kill_bench.sh`(検出→TERM→KILL) ## 推奨プリセット(短時間) - 保存スイープ(1s, 1/4T, sample=1/256) - `BENCH_TIMEOUT=6 scripts/save_prof_sweep.sh -d 1 -t 1,4 -s 8` - Mid A/B(WRAP L1=OFF, 学習OFF) - `RUNTIME=1 THREADS=1,4 BENCH_TIMEOUT=5 scripts/ab_sweep_mid.sh` - 小スイート(system/mimalloc/hakmem) - `RUNTIME=1 THREADS=1,4 BENCH_TIMEOUT=6 scripts/run_bench_suite.sh` ## 現時点の観測(1秒計測の例) - Mid CAP 基本: 既定 `64,64,64,32,16` が良好(大CAPは競合・リフィル増で不利) - DYN1=14,336B: `CAP_MID_DYN1=64` が安定(ワークロード依存、要A/B) - 推奨: `HAKMEM_POOL_MIN_BUNDLE=4` をA/Bで検証(Mid 4Tが伸びる傾向) 以降(P1): Water-filling のヒステリシス/ドウェル、W_MAX/THP 閾値の Canary 採用を追加し、BEST 構成の安定化を図る。