Files
hakmem/AGENTS.md
Moe Charm (CI) 79674c9390 Phase v10: Remove legacy v3/v4/v5 implementations
Removal strategy: Deprecate routes by disabling ENV-based routing
- v3/v4/v5 enum types kept for binary compatibility
- small_heap_v3/v4/v5_enabled() always return 0
- small_heap_v3/v4/v5_class_enabled() always return 0
- Any v3/v4/v5 ENVs are silently ignored, routes to LEGACY

Changes:
- core/box/smallobject_hotbox_v3_env_box.h: stub functions
- core/box/smallobject_hotbox_v4_env_box.h: stub functions
- core/box/smallobject_v5_env_box.h: stub functions
- core/front/malloc_tiny_fast.h: remove alloc/free cases (20+ lines)

Benefits:
- Cleaner routing logic (v6/v7 only for SmallObject)
- 20+ lines deleted from hot path validation
- No behavioral change (routes were rarely used)

Performance: No regression expected (v3/v4/v5 already disabled by default)

Next: Set Learner v7 default ON, production testing

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 06:09:12 +09:00

22 KiB
Raw Blame History

AGENTS: 箱理論Box Theory設計ガイドライン

本リポジトリでは、変更・最適化・デバッグを一貫して「箱理論Box Theory」で進めます。すべてを“箱”で分け、境界で接続し、いつでも戻せるように積み上げることで、複雑性を抑えつつ失敗コストを最小化します。


何が効くのか(実績)

  • Rust/inkwell: 複雑なライフタイム管理 ↓
  • 箱理論適用: 650行 → 100行SSA構築

なぜ効果があるか:

  • PHI/Block/Value を「箱」として扱い、境界変換点を1箇所に集約
  • 複雑な依存関係を箱の境界で切ることで単体検証が容易
  • シンプルな Python/llvmlite で 2000行で完結道具に依存せず“箱”で分割して繋ぐ

補足C 実装時の利点)

  • C の場合は static inline により箱間のオーバーヘッドをゼロに近づけられる(インライン展開)

🎯 AI協働での合言葉5原則

  1. 「箱にする」: 設定・状態・橋渡しは Box 化
    • 例: TLS 状態、SuperSlab adopt、remote queue などは役割ごとに箱を分離
  2. 「境界を作る」: 変換は境界1箇所で
    • 例: adopt → bind、remote → freelist 統合、owner 移譲などの変換点を関数1箇所に集約
  3. 「戻せる」: フラグ・feature で切替可能に
    • #ifdef FEATURE_X / 環境変数 で新旧経路を A/B 可能に(回帰や切り戻しを即時化)
  4. 「見える化」: ダンプ/JSON/DOT で可視化
    • 1回だけのワンショットログ、統計カウンタで“芯”を掴む常時ログは避ける
  5. 「Fail-Fast」: エラー隠さず即座に失敗
    • ENOMEM/整合性違反は早期に露呈させる(安易なフォールバックで隠さない)

要するに: 「すべてを箱で分けて、いつでも戻せるように積み上げる」設計哲学にゃ😺🎁


適用ガイド(このリポジトリ)

  • 小さく積むBox 化)

    • Remote Free Queue, Partial SS Adopt, TLS Bind/Unbind を独立した“箱”として定義
    • 箱の API は最小・明確init/publish/adopt/drain/bind など)
  • 参照してほしい設計ドキュメント

    • HAKMEM_V2_GENERATION_SUMMARY.mdULTRA + MID v3 + v6/v7 研究箱までの“第1章”まとめ
    • docs/analysis/SMALLOBJECT_V7_DESIGN.mdSmallObject v7 / HAKMEM v3 コアの層構造と箱割り)
    • docs/analysis/V7_ARCHITECTURE_DECISION_MATRIX.mdv7 世代の設計オプションと意思決定マトリクス)
  • 境界は1箇所

    • Superslab 再利用の境界は superslab_refill() に集約publish/adopt の接点)
    • Free の境界は “same-thread / cross-thread” の判定1回
  • 切替可能(戻せる)

    • 新経路は #ifdef / 環境変数でオンオフA/B と回帰容易化)
    • 例: HAKMEM_TINY_PHASE6_ULTRA_SIMPLEHAKMEM_DEBUG_VERBOSEHAKMEM_TINY_* env
  • 見える化(最小限)

    • 1回だけのデバッグ出力ワンショットと統計カウンタで芯を掴む
    • 例: [SS OOM]、[SS REFILL] のワンショットログ、alloc/freed/bytes の瞬間値
  • Fail-Fast

    • ENOMEM・整合性違反はマスクせず露出。フォールバックは“停止しないための最後の手段”に限定
  • 運用ルールPool flatten

    • Pool v1 flatten / Zero Mode は LEGACY mid/smallmid ベンチ専用の箱。C7_SAFE プロファイルでは flatten を触らない(安定性優先のため常時 OFF

実装規約C向けの具体

  • static inline を多用し箱間の呼び出しをゼロコスト化
  • 共有状態は _Atomic で明示、CAS ループは局所化MPSC push/pop はユーティリティ化)
  • 競合制御は「箱の内側」に閉じ込め、外側はシンプルに保つ
  • 1つの箱に 1つの責務publish/adopt、drain、bind、owner 移譲 など)

チェックリストPR/レビュー時)

  • 箱の境界は明確か変換点が1箇所に集約されているか
  • フラグで戻せるかA/B が即時に可能か)
  • 可視化のフックは最小か(ワンショット or カウンタ)
  • Fail-Fast になっているか(誤魔化しのフォールバックを入れていないか)
  • C では static inline でオーバーヘッドを消しているか

この AGENTS.md は、箱理論の適用・コーディング・デバッグ・A/B 評価の“共通言語”です。新しい最適化や経路を足す前に、まず箱と境界を設計してから手を動かしましょう。


Learning LayerACE / ELO / Learnerの箱化ポリシー

ACE/ELO/CAP Learner などの「学習する機能」も、Tiny や Superslab と同様に Box として扱います。 ホットパスを汚さず、いつでも FROZEN/OFF に戻せるようにすることが原則です。

  • 学習は上層の箱に閉じ込める

    • L0 Tiny / L1 Superslab / TLS SLL / Remote Queue は 学習ロジックを持たない
    • ELO / ACE Controller / CAP Learner は「ポリシー箱」として、ノブやしきい値だけを更新する。
    • ホットパス側は「現在のポリシー値」を読むだけにし、学習の有無を意識しない。
  • FROZEN / LEARN / OBSERVE を明確に分ける

    • FROZEN: 学習 OFF。固定ポリシーのみ使用デフォルト運用
    • LEARN: バックグラウンドでポリシー更新を行う(ベンチ / 研究用)。
    • OBSERVE: Tiny などの下層の箱を「観測だけ」するモード(動作は変えない)。
    • モード切り替えは HAKMEM_MODE / HAKMEM_ACE_ENABLED / HAKMEM_LEARN 等の ENV から行い、いつでも戻せるようにする。
  • ドキュメントと設計の窓口

    • 学習レイヤ全体の構造と責務は docs/analysis/LEARNING_LAYER_OVERVIEW.md にまとめる。
    • 各学習 BoxELO / ACE Controller / CAP Learnerの詳細仕様や A/B 結果は、docs/analysis / docs/benchmarks / docs/paper 配下に箱ごとに整理する。
    • AGENTS.md では「学習は必ず別箱」「ホットパスを汚さない」「ENV で切り戻せる」というルールだけを守る。

研究箱ポリシー: SmallObject v6Headerless 設計検証)

SmallObject v6C6-only headerless allocationは、「header elimination の実現可能性」を実証する研究箱です。以下のルールで管理します。

v6 の現在地

  • 状態: 凍結(デフォルト OFF、ENV opt-in の研究用)
  • 性能: baseline ±数% で相当 = 基本的な設計目標は達成
  • 設計成果:
    • RegionIdBox が薄く保たれたptr 分類のみ)
    • TLS-scope segment registration + same-page cache で lookup overhead を軽減
    • Headerless allocation が実装可能なことを実証

凍結後の方針

  1. コード保持: v6 実装コードは削除しない。参考設計として保持。
  2. デフォルト OFF: デフォルトプロファイルには一切関与しない。
  3. 研究用のみ: ENV 環境変数 HAKMEM_SMALL_HEAP_V6_* で明示的に有効化する場合のみ動作。
  4. 今後のリソース: v6 の P2/P3 最適化は後回しに。mid/pool v3 による C6-heavy 本格改善に注力する。
  5. ドキュメント: SmallObject v6 の詳細は docs/analysis/SMALLOBJECT_CORE_V6_DESIGN.md に集約。CURRENT_TASK.md は概要のみ。

凍結をすり抜ける条件

v6 に手を入れるのは以下の場合に限定:

  • クリティカルなバグ修正deadlock / segfault
  • 基盤TLS 登録、segment allocationに関わる変更の伝播
  • 「mid/pool v3 で成功した パターンを v6 にも適用」といった、mid と v6 の共通化

Tiny 向け「積み方 v2」(層を下から固める)

下層の箱が壊れている状態で上層を積むと必ず崩れます。まず下から順に箱を“堅牢化”してから上を載せる、を徹底します。

層と責務

  • Box 1: Atomic Ops (最下層)

    • 役割: stdatomic.h による CAS/Exchange の秩序付けAcquire/Release
    • ルール: メモリ順序を箱内で完結させる(外側に弱い順序を漏らさない)。
  • Box 2: Remote Queue (下層)

    • 役割: cross-thread free の MPSC スタックpush/exchangeとカウント管理。
    • API: ss_remote_push(ss, slab_idx, ptr) -> transitioned(0/1)ss_remote_drain_to_freelist(ss, slab_idx)ss_remote_drain_light(ss)
    • 不変条件 (Invariants):
      • push はノードの next を書き換える以外に副作用を持たないfreelist/owner へは触れない)。
      • head は SuperSlab 範囲内Fail-Fast 範囲検証)。
      • remote_counts[s] は push/drain で単調に整合するdrain 後は 0
    • 境界: freelist への統合は必ず drain 関数内1 箇所。publish/adopt からの直接 drain は禁止。
  • Box 3: Ownership (中層)

    • 役割: slab の所有者遷移(owner_tid)。
    • API: ss_owner_try_acquire(meta, tid) -> boolowner_tid==0 の時のみ CAS で取得)、ss_owner_release(meta, tid)ss_owner_is_mine(meta, tid)
    • 不変条件:
      • Remote Queue は owner に触らないBox 2→3 への侵入禁止)。
      • Acquire 成功後のみ “同一スレッド” の高速経路を使用する。
    • 境界: bind 時にのみ acquire/release を行う(採用境界 1 箇所)。
  • Box 4: Publish / Adopt (上層)

    • 役割: 供給の提示publishと消費adopt
    • API: tiny_publish_notify(class, ss, slab)tiny_mailbox_publish()tiny_mailbox_fetch()ss_partial_publish()ss_partial_adopt()
    • 不変条件:
      • publish は “通知とヒント” のみfreelist/remote/owner に触れない)。
      • ss_partial_publish() は unsafe drain をしない。必要なら drain は採用側境界で実施。
      • publish 時に owner_tid=0 を設定してもよいが、実際の acquire は採用境界でのみ行う。
    • 境界: adopt 成功直後にだけ drain → bind → owner_acquire を行う(順序は必ずこの 1 箇所)。

実装ガイド(境界の 1 か所化)

  • Refill 経路(superslab_refill() / tiny_refill_try_fast())でのみ:
    1. sticky/hot/bench/mailbox/reg を “peek して” 候補を得る
    2. 候補が見つかったら当該 slab で ss_remote_drain_to_freelist() を 1 回だけ実行(必要時)
    3. freelist が非空であれば tiny_tls_bind_slab()ss_owner_try_acquire() の順で確定
    4. 確定後にのみ publish/overflow は扱う(不要な再 publish/drain はしない)

Do / Dont壊れやすいパターンの禁止

  • Dont: Remote Queue から publish を直接呼ばない条件分岐を増やす(通知の濫用)。
  • Dont: publish 側で drain / owner をいじる。
  • Do: Remote Queue は push と count 更新のみ。publish は通知のみ。採用境界で drain/bind/owner を一度に行う。

デバッグ・トリアージ順序FailFast

  1. Box 2Remote単体: push→drain→freelist の整合をアサート(範囲検証 ON, remote_counts 符合)。
  2. Box 3Ownership単体: owner_tid==0 からの acquire/release を並行で連続試験。
  3. Box 4Publish/Adopt単体: publish→mailbox_register/fetch の通電fetch ヒット時のみ adopt を許可)。
  4. 全体: adopt 境界でのみ drain→bind→owner_acquire を踏んでいるかリングで確認。

可視化と安全化(最小構成)

  • Tiny Ring: TINY_RING_EVENT_REMOTE_PUSH/REMOTE_DRAIN/MAILBOX_PUBLISH/MAILBOX_FETCH/BIND を採用境界前後に記録。
  • EnvA/B・切戻し:
    • HAKMEM_TINY_SS_ADOPT=1/0publish/adopt 全体の ON/OFF
    • HAKMEM_TINY_RF_FORCE_NOTIFY=1(初回通知の見逃し検出)
    • HAKMEM_TINY_MAILBOX_SLOWDISC(_PERIOD)(遅延登録の発見)
    • HAKMEM_TINY_MUST_ADOPT=1mmap 直前の採用ゲート)

最小テスト(箱単位の smoke

  • Remote Queue: 同一 slab へ N 回 ss_remote_push()ss_remote_drain_to_freelist()remote_counts==0 と freelist 長の一致。
  • Ownership: 複数スレッドで ss_owner_try_acquire() の成功が 1 本だけになること、release 後に再取得可能。
  • Publish/Mailbox: tiny_mailbox_publish()tiny_mailbox_fetch() のヒットを 1 回保証。fetch_null のとき used 拡張が有効。

運用の心得

  • 下層Remote/Ownershipに疑義がある間は、上層Publish/Adoptを “無理に” 積み増さない。
  • 変更は常に A/B ガード付きで導入し、SIGUSR2/リングとワンショットログで芯を掴んでから上に進む。

健康診断ランと注意事項Superslab / madvise / Pool 用)

このリポジトリは Superslab / madvise / Pool v1 flatten など OS 依存の経路を多用します。
「いつの間にか壊れていた」を防ぐために、次の“健康診断ラン”と注意事項を守ってください。

※ 開発マシンと OS 環境は、基本的にセッションを通じて同一構成(同一ハードウェア・同一カーネル設定)を維持して運用しています。性能の変化は「コード差分」か「明示的に変更した ENV」の影響として扱い、マシン側の揺らぎで説明しない方針です。

  • Perf / ベンチ計測の原則

    • ホットパスTiny front / SmallObject v3/v4 / Pool / Superslabに手を入れるときは、必ず 変更前と変更後で同じプロファイルのベンチと perf を 1 本ずつ取ってから評価すること「perf を見ずに最適化しない」)。
    • Mixed 161024B は HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE、mid/smallmid は HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 を基準とし、A/B は原則この 2 本で行う。
    • 新しい箱を追加したら、CURRENT_TASK.md / docs/analysis 配下に A/B の ops/s と主要 self% を必ずメモしてから次の箱に進む。
  • DSO 領域には触らないSuperslab OS Box のフェンス)

    • core/box/ss_os_acquire_box.hss_os_madvise_guarded()libc/libm/ld.so など DSO 領域を dladdr で検出したら即スキップ します。
    • DSO に対する madvise 試行は バグ扱いg_ss_madvise_disabled / DSO-skip ログを必ず 1 回だけ出し、以降は触らない前提です。
    • 開発/CI では(必要なら)HAKMEM_SS_MADVISE_DSO_FAILFAST=1 を使って、「DSO に一度でも触ろうとしたら即 abort」するチェックランを追加してください。
  • madvise / vm.max_map_count 用 健康診断ラン

    • 目的: Superslab OS Box が ENOMEM(vm.max_map_count) に達しても安全に退避できているか、DSO 領域を誤って触っていないかを確認する。
    • 推奨コマンドC7_SAFE + mid/smallmid, Superslab/madvise 経路の smoke 用):
      HAKMEM_BENCH_MIN_SIZE=257 \
      HAKMEM_BENCH_MAX_SIZE=768 \
      HAKMEM_TINY_HEAP_PROFILE=C7_SAFE \
      HAKMEM_TINY_C7_HOT=1 \
      HAKMEM_TINY_HOTHEAP_V2=0 \
      HAKMEM_SMALL_HEAP_V3_ENABLED=1 \
      HAKMEM_SMALL_HEAP_V3_CLASSES=0x80 \
      HAKMEM_POOL_V2_ENABLED=0 \
      HAKMEM_POOL_V1_FLATTEN_ENABLED=0 \
      HAKMEM_SS_OS_STATS=1 \
      ./bench_mid_large_mt_hakmem 5000 256 1
      
    • チェックポイント:
      • 終了時に [SS_OS_STATS] ... madvise_enomem=0 madvise_disabled=0 が理想(環境次第で ENOMEM は許容、ただし disabled=1 になっていれば以降の madvise は止まっている)。
      • DSO-skip や DSO Fail-Fast ログが出ていないこと(出た場合は ptr 分類/経路を優先的にトリアージ)。
  • Pool v1 flatten のプロファイル注意

    • LEGACY プロファイル専用の最適化です。HAKMEM_TINY_HEAP_PROFILE=C7_SAFE / C7_ULTRA_BENCH のときは コード側で強制OFF されます。
    • flatten を触るときの健康診断ランLEGACY想定:
      HAKMEM_BENCH_MIN_SIZE=257 \
      HAKMEM_BENCH_MAX_SIZE=768 \
      HAKMEM_TINY_HEAP_PROFILE=LEGACY \
      HAKMEM_POOL_V2_ENABLED=0 \
      HAKMEM_POOL_V1_FLATTEN_ENABLED=1 \
      HAKMEM_POOL_V1_FLATTEN_STATS=1 \
      ./bench_mid_large_mt_hakmem 1 1000000 400 1
      
    • チェックポイント:
      • [POOL_V1_FLAT] alloc_tls_hit / free_tls_hit が増えていることflatten 経路が効いている)。
      • free_fb_*page_null / not_mine / other少数に収まっていること。増えてきたら owner 判定/lookup 側を優先トリアージする。
  • C6 は Phase C6-FREEZE 中(標準では Tiny/SmallObject/ULTRA に載せない)

    • 標準プロファイルMIXED_TINYV3_C7_SAFE / C6_HEAVY_LEGACY_POOLV1は C6 を mid/pool の通常クラスとして扱う。C6_HOT や smallheap(v3/v4)/ULTRA はすべて研究用の opt-in に限定。
    • C6 を触るときは ENV_PROFILE_PRESETS.md の研究プリセットC6_SMALL_HEAP_V3_EXPERIMENT / C6_SMALL_HEAP_V4_EXPERIMENT など)から開始し、標準プリセットに混ぜ込まないこと。
    • mid/smallmid の性能を攻めるときは、まず pool/mid 側の HotBox 設計SmallObject v4 や mid 用 ULTRAを考え、C6 専用の特別扱いは後段フェーズまで凍結する。
  • C7 ULTRA は UF-3 セグメント版が標準ENV で OFF に戻せる)

    • HAKMEM_TINY_C7_ULTRA_ENABLED デフォルト ON。2MiB セグメント64KiB ページ, mask 判定)上で carve/push。セグメント外の ptr は必ず既存 v3 free にフォールバックする。
    • ON/OFF の前後で必ず健康診断ランを 1 回ずつ取り、差分が出たらまず ULTRA 側を疑う。
    • ヘッダ軽量化(HAKMEM_TINY_C7_ULTRA_HEADER_LIGHTは研究箱。Mixed/C7-only の A/B を取ってから触ること。デフォルトは OFF。
    • 将来的にヘッダレス設計を広げるときは、まず C7 ULTRA の勝ちパターンを small-object v416〜2KiBにコピーし、各サイズクラスを一つの SmallObjectHotBox v4 に統合してから mid/pool 側を触る。
  • 一般ルール(壊れたらまず健康診断ラン)

    • Tiny / Superslab / Pool に手を入れたあと、まず上記の健康診断ランを 1 回だけ回してから長尺ベンチ・本番 A/B に進んでください。
    • 健康診断ランが落ちる場合は 新しい最適化を積む前に Box 境界ptr 分類 / Superslab OS Box / Pool v1 flatten Boxを優先的に直します。
    • ベンチや評価を始めるときは、docs/analysis/ENV_PROFILE_PRESETS.md のプリセットMIXED_TINYV3_C7_SAFE / C6_HEAVY_LEGACY_POOLV1 / DEBUG_TINY_FRONT_PERFから必ずスタートし、追加した ENV はメモを残してください。単発の ENV を散らすと再現が難しくなります。
    • 健康診断ラン(簡易チェック)は次の 2 本を必ず通す:
      • Tiny/Mixed: HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE ./bench_random_mixed_hakmem 1000000 400 1 35〜38M ops/s / segv/assert なしで OK
      • mid/smallmid C6: HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 ./bench_mid_large_mt_hakmem 1 1000000 400 1 約29M ops/s / segv/assert なしで OK
    • まとめて実行する場合は scripts/verify_health_profiles.sh を 1 回叩けば OKスループットは目安表示のみ、exit code だけで判定)。

V7 世代の設計メモへの導線mimalloc に追いつく箱を作るとき)

v7 / HAKMEM v3 の設計・実装を触るときは、必ず次の設計ドキュメントから読み始めてください。

  • docs/analysis/HAKMEM_V2_GENERATION_SUMMARY.md

    • v2 世代ULTRA + MID v3 + v6/v7 研究箱)のまとめと L0〜L3 の層構造。
    • 「ここまでが第1世代・ここから先を v3/v7 で攻める」という地図。
  • docs/analysis/SMALLOBJECT_V7_DESIGN.md

    • SmallObjectHotBox_v7 / SmallSegment_v7 / RegionIdBox の型と責務。
    • v7-0〜v7-4 のフェーズと、「v3 世代でどのクラスを誰が担当するか」の前提。
  • docs/analysis/V7_ARCHITECTURE_DECISION_MATRIX.md

    • mimalloc と v7 の比較表Free List / Size Class / Lookup / Header 等)。
    • v7-5aC6 極限最適化)と v7-5bmulti-class 拡張)どちらから攻めるかの判断基準。
    • Intrusive LIFO / headerless / Stats cold path など、次世代で検討する論点一覧。

これら 3 つを「設計の正」として扱い、v7 をいじるときは必ず A/B 用プロファイルと Box 境界を先に決めてからコードを触ってください。


Tiny/ULTRA 層の「完成世代」宣言2025-12-11

Tiny/ULTRA 層は C4C7 ULTRA + v3 backend を前提とした「完成世代」として扱う。 今後の大きい変更は Headerless 系v6 out-of-band header/ mid/pool v3 新設計 といった独立ラインでのみ検討。 Tiny/ULTRA 層本体への追加最適化は Small patch level のみPhase SO-BACKEND-OPT-2 等の Header write 削減)を想定。 詳細は docs/analysis/PERF_EXEC_SUMMARY_ULTRA_PHASE_20251211.md 参照。


v6 研究箱ルールPhase V6-HDR-0 以降)

基本方針

v6 は C6-only headerless core の研究ラインとして、Tiny/ULTRA 完成世代とは独立して運用する。

固定事項

  1. C7 ULTRA は触らない

    • TinyC7UltraBox / C7UltraSegmentBox は frozen。v6 から C7 を呼び出さない。
    • C7 の最適化が必要な場合は ULTRA 側で対応v6 スコープ外)。
  2. v6 は C6-only

    • HAKMEM_SMALL_CORE_V6_ENABLED=1 + HAKMEM_SMALL_CORE_V6_CLASSES=0x40 (C6 のみ)
    • C5/C4 への拡張は研究完了後に検討Phase V6-HDR-1 以降)
  3. Headerless 設計

    • alloc 時に header byte を書かない(SMALL_V6_HEADERLESS=1
    • free 時は RegionIdBox で ptr 分類 → page_meta へ直接アクセス
  4. デフォルト OFF

    • HAKMEM_SMALL_CORE_V6_ENABLED=0 がデフォルト
    • 本線 Mixed / C6-heavy は v6 OFF で計測(回帰しない)

ENV 一覧

ENV Default 説明
HAKMEM_SMALL_CORE_V6_ENABLED 0 v6 core 有効化
HAKMEM_SMALL_CORE_V6_CLASSES 0x40 有効クラス (0x40=C6)
HAKMEM_SMALL_V6_OBSERVE 0 free 入口のログ出力
HAKMEM_PAGE_STATS_V6_ENABLED 0 page lifetime stats
HAKMEM_REGION_ID_V6_OBSERVE 0 RegionIdBox lookup ログ

4層 Box Theory

L0: ULTRA lanes (C7 frozen)
L1: TLS Box (SmallTlsLaneV6 / SmallHeapCtxV6)
L2: Segment / ColdIface (SmallSegmentV6 / ColdIfaceV6)
L3: Policy / RegionIdBox / PageStatsV6

詳細は docs/analysis/SMALLOBJECT_CORE_V6_DESIGN.md 参照。