Files
hakmem/docs/archive/ENV_VARS_2025-10-24.md

107 lines
6.8 KiB
Markdown
Raw Normal View History

Wrap debug fprintf in !HAKMEM_BUILD_RELEASE guards (Release build optimization) ## Changes ### 1. core/page_arena.c - Removed init failure message (lines 25-27) - error is handled by returning early - All other fprintf statements already wrapped in existing #if !HAKMEM_BUILD_RELEASE blocks ### 2. core/hakmem.c - Wrapped SIGSEGV handler init message (line 72) - CRITICAL: Kept SIGSEGV/SIGBUS/SIGABRT error messages (lines 62-64) - production needs crash logs ### 3. core/hakmem_shared_pool.c - Wrapped all debug fprintf statements in #if !HAKMEM_BUILD_RELEASE: - Node pool exhaustion warning (line 252) - SP_META_CAPACITY_ERROR warning (line 421) - SP_FIX_GEOMETRY debug logging (line 745) - SP_ACQUIRE_STAGE0.5_EMPTY debug logging (line 865) - SP_ACQUIRE_STAGE0_L0 debug logging (line 803) - SP_ACQUIRE_STAGE1_LOCKFREE debug logging (line 922) - SP_ACQUIRE_STAGE2_LOCKFREE debug logging (line 996) - SP_ACQUIRE_STAGE3 debug logging (line 1116) - SP_SLOT_RELEASE debug logging (line 1245) - SP_SLOT_FREELIST_LOCKFREE debug logging (line 1305) - SP_SLOT_COMPLETELY_EMPTY debug logging (line 1316) - Fixed lock_stats_init() for release builds (lines 60-65) - ensure g_lock_stats_enabled is initialized ## Performance Validation Before: 51M ops/s (with debug fprintf overhead) After: 49.1M ops/s (consistent performance, fprintf removed from hot paths) ## Build & Test ```bash ./build.sh larson_hakmem ./out/release/larson_hakmem 1 5 1 1000 100 10000 42 # Result: 49.1M ops/s ``` Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 13:14:18 +09:00
# 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: ヘッダ書込み/検証スキップ(危険。ページ記述子の所有者判定と併用前提)