Files
hakmem/docs/specs/ENV_VARS.md
Moe Charm (CI) 52386401b3 Debug Counters Implementation - Clean History
Major Features:
- Debug counter infrastructure for Refill Stage tracking
- Free Pipeline counters (ss_local, ss_remote, tls_sll)
- Diagnostic counters for early return analysis
- Unified larson.sh benchmark runner with profiles
- Phase 6-3 regression analysis documentation

Bug Fixes:
- Fix SuperSlab disabled by default (HAKMEM_TINY_USE_SUPERSLAB)
- Fix profile variable naming consistency
- Add .gitignore patterns for large files

Performance:
- Phase 6-3: 4.79 M ops/s (has OOM risk)
- With SuperSlab: 3.13 M ops/s (+19% improvement)

This is a clean repository without large log files.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-05 12:31:14 +09:00

107 lines
6.8 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.

# ENV Vars (Runtime Controls)
学習・キャッシュ・ラッパー挙動などのランタイム制御一覧です。
## 学習CAP / 窓 / 予算)
- `HAKMEM_LEARN=1` — CAP学習ON別スレッド
- `HAKMEM_LEARN_WINDOW_MS` — 学習窓(既定 1000ms
- `HAKMEM_TARGET_HIT_MID` / `HAKMEM_TARGET_HIT_LARGE` — 目標ヒット率(既定 0.65 / 0.55
- `HAKMEM_CAP_STEP_MID` / `HAKMEM_CAP_STEP_LARGE` — CAPの更新ステップ既定 4 / 1
- `HAKMEM_BUDGET_MID` / `HAKMEM_BUDGET_LARGE` — 合計CAPの上限0=無効)
## Mid/Large CAP手動上書き
- `HAKMEM_CAP_MID=a,b,c,d,e` — 2/4/8/16/32KiB のCAPページ
- `HAKMEM_CAP_LARGE=a,b,c,d,e` — 64/128/256/512KiB/1MiB のCAPバンドル
## 可変MidクラスDYN1
- `HAKMEM_MID_DYN1=<bytes>` — 可変クラス1枠を有効化例: 14336
- `HAKMEM_CAP_MID_DYN1=<pages>` — DYN1専用CAP
- `HAKMEM_DYN1_AUTO=1` — サイズ分布ピークから自動割り当て(固定クラスと衝突しない場合のみ)
- `HAKMEM_HIST_SAMPLE=N` — サイズ分布のサンプリング2^N に1回
## ラッパー挙動LD_PRELOAD
- `HAKMEM_WRAP_L2=1` / `HAKMEM_WRAP_L25=1` — ラッパー内でもMid/L2.5使用を許可(安全に留意)
- `HAKMEM_POOL_TLS_FREE=0/1` — Mid free をTLS返却1=既定)
- `HAKMEM_POOL_MIN_BUNDLE=<n>` — Mid補充の最小バンドル既定2
- `HAKMEM_POOL_REFILL_BATCH=1-4` — Phase 6.25: Mid Pool refill 時のページ batch 数既定2、1=batch無効
- `HAKMEM_WRAP_TINY=1` — ラッパー内でもTinyを許可magazineのみ/ロック回避)
- `HAKMEM_WRAP_TINY_REFILL=1` — ラッパー内で小規模trylockリフィル許可安全性優先で既定OFF
## 丸め許容W_MAX
- `HAKMEM_WMAX_MID` / `HAKMEM_WMAX_LARGE` — 丸め許容(例: 1.4
- `HAKMEM_WMAX_LEARN=1` — W_MAX学習ON簡易: ラウンドロビン)
- `HAKMEM_WMAX_CANDIDATES_MID` / `HAKMEM_WMAX_CANDIDATES_LARGE` — 候補(例: "1.4,1.6,1.7"
- `HAKMEM_WMAX_DWELL_SEC` — 候補切替の最小保持秒数既定10
## プロファイル
- `HAKMEM_PROF=1` / `HAKMEM_PROF_SAMPLE=N` — 軽量サンプリング・プロファイラ
- `HAKMEM_ACE_SAMPLE=N` — L1ヒット/ミス/L1フォールバックのサンプル率
## カウンタのサンプリング(ホットパス書込みの削減)
- `HAKMEM_POOL_COUNT_SAMPLE=N` — Midの`hits/misses/frees`を2^Nに1回だけ更新既定10=1/1024
- `HAKMEM_TINY_COUNT_SAMPLE=N` — Tinyの`alloc/free`カウントを2^Nに1回だけ更新既定8=1/256
## セーフティ
- `HAKMEM_SAFE_FREE=1` — free時 mincore ガード(オーバーヘッド注意)
## Mid TLS 二段(リング+ローカルLIFO
- `HAKMEM_POOL_TLS_RING=0/1` — TLSリング有効化既定1
- `HAKMEM_TRYLOCK_PROBES=K` — 非空シャードへのtrylock試行回数既定3
- `HAKMEM_RING_RETURN_DIV=2|3|4` — リング満杯時の吐き戻し率2=1/2, 3=1/3
- `HAKMEM_TLS_LO_MAX=<n>` — TLSローカルLIFOの上限既定256
- `HAKMEM_SHARD_MIX=1` — site→shardの分散ハッシュを強化splitmix64
## L2.5LargePool専用
- `HAKMEM_L25_RUN_BLOCKS=<n>` — bump-runのブロック数を上書きクラス共通。既定はクラス別に約2MiB/ラン64KB:32, 128KB:16, 256KB:8, 512KB:4, 1MB:2
- `HAKMEM_L25_RUN_FACTOR=<n>` — ラン長の倍率1..8)。`RUN_BLOCKS` 指定時は無効
- `HAKMEM_L25_PREF=remote|run` — TLSミス時の順序。`remote`=リモートドレイン優先、`run`=bump-run優先既定: remote
- `HAKMEM_WRAP_L25=0/1` — ラッパー内でもL2.5使用を許可既定0
- `HAKMEM_L25_TC_SPILL=<n>` — free時のTransfer Cacheスピル閾値既定32、0=無効)
- `HAKMEM_L25_BG_DRAIN=0/1` — BGスレッドで remote→freelist を定期ドレイン既定0
- `HAKMEM_L25_BG_MS=<n>` — BGドレイン間隔ミリ秒, 既定5
- `HAKMEM_L25_TC_CAP=<n>` — TCリング容量既定64, 8..64
- `HAKMEM_L25_RING_TRIGGER=<n>` — remote-firstの起動トリガリング残がn以下の時だけ、既定2
- `HAKMEM_L25_OWNER_INBOUND=0/1` — owner直帰モードcrossthread freeはページownerのinboundへ積む。allocは自分のinboundから少量drainしてTLSへ
- `HAKMEM_L25_INBOUND_SLOTS=<n>` — inboundスロット数既定512, 128..2048 目安)。ビルド既定より大きい値は切り捨て
## ログ抑制
- `HAKMEM_INVALID_FREE_LOG=0/1` — 無効freeログ出力のON/OFF既定0=抑制)
注: 上記の TLS/RING/PROBES/LO_MAX は L2.5LargePoolにも適用されます同名ENVで連動
## バッチ系madvise/munmap のバックグラウンド化)
- `HAKMEM_BATCH_BG=0/1` — バックグラウンドスレッドでバッチをフラッシュ既定1=ON
- 大きな解放(>=64KiB`hak_batch_add()` に蓄積→しきい値到達/定期でBGが flush
- ホットパスから madvise/munmap を外し、TLBフラッシュ/システムコールをBGへ移譲
## タイミング計測Debug Timing
- `HAKMEM_TIMING=1` — カテゴリ別の集計をstderrにダンプ終了時
- 主要カテゴリ(抜粋):
- Mid(L2): `pool_lock`, `pool_refill`, `pool_tc_drain`, `pool_tls_ring_pop`, `pool_tls_lifo_pop`, `pool_remote_push`, `pool_alloc_tls_page`
- L2.5: `l25_lock`, `l25_refill`, `l25_tls_ring_pop`, `l25_tls_lifo_pop`, `l25_remote_push`, `l25_alloc_tls_page`, `l25_shard_steal`
- 使い方(例):
- `HAKMEM_TIMING=1 LD_PRELOAD=./libhakmem.so mimalloc-bench/bench/larson/larson 10 65536 1048576 10000 1 12345 4`
## Mid Transfer CacheTC
- `HAKMEM_TC_ENABLE=0/1` — TCを有効化既定1
- `HAKMEM_TC_UNBOUNDED=0/1` — ドレイン個数の上限を無効化既定1
- `HAKMEM_TC_DRAIN_MAX=<n>` — 1回のallocでドレインする最大個数既定64程度、0で無制限
- `HAKMEM_TC_DRAIN_TRIGGER=<n>` — リング残量がn未満のときのみドレイン既定2
## MF2: Per-Page ShardingPhase 7.2
- `HAKMEM_MF2_ENABLE=0/1` — MF2 Per-Page Sharding有効化既定0=無効)
- mimalloc方式: 各64KBページが独立したfreelistを保持、O(1)ページ検索
- 期待性能: Mid 4T +50% (13.78 → 20.7 M/s)
## ビルド時Makefile
- `RING_CAP=<8|16|32>` — TLSリング容量Mid`make shared RING_CAP=16` など
## しきい値mmap
- `HAKMEM_THP_LEARN=1`(将来)/ `thp_threshold` は FrozenPolicy 側に保持(既定 2MiB
## ヘッダ書込みMid, 実験的)
- `HAKMEM_HDR_LIGHT=0|1|2`
- 0: フルヘッダmagic/method/size/alloc_site/class_bytes/owner_tid
- 1: 最小ヘッダmagic/method/size のみ。owner未設定
- 2: ヘッダ書込み/検証スキップ(危険。ページ記述子の所有者判定と併用前提)