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

6.8 KiB
Raw Blame History

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
    • 大きな解放(>=64KiBhak_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リング容量Midmake 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: ヘッダ書込み/検証スキップ(危険。ページ記述子の所有者判定と併用前提)