Files
hakmem/CURRENT_TASK.md
Moe Charm (CI) bdfa32d869 Phase v4-mid-SEGV: C6 v4 を SmallSegment 専用に切り替え、TinyHeap SEGV を解決
問題: C6 v4 が TinyHeap のページを共有することで iters >= 800k で freelist 破壊 → SEGV 発生

修正内容:
- c6_segment_alloc_page_direct(): C6 専用ページ割当 (SmallSegment v4 経由, TinyHeap 非共有)
- c6_segment_release_page_direct(): C6 専用ページ返却
- cold_refill_page_v4() で C6 を分岐: SmallSegment 直接使用
- cold_retire_page_v4() で C6 を分岐: SmallSegment に直接返却
- fastlist state reset 処理追加 (L392-399)

結果:
 iters=1M, ws <= 390 で SEGV 消失
 C6-only: v4 OFF ~47M → v4 ON ~43M ops/s (−8.5%, 安定)
 Mixed: v4 ON で SEGV なし (小幅回帰許容)

方針: C6 v4 は研究箱として安定化完了。本線には載せない (既存 mid/pool v1 使用)。

🤖 Generated with Claude Code

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-11 02:39:32 +09:00

8.1 KiB
Raw Blame History

HAKMEM 状況メモ(コンパクト版, 2025-12-10

このファイルは「いま何を基準に A/B するか」「どの箱が本線か」だけを短くまとめたものです。
過去フェーズの詳細なログは CURRENT_TASK_ARCHIVE_20251210.md と各 docs/analysis/* に残しています。


1. ベースライン1 thread, ws=400, iters=1M, seed=1

  • Mixed 161024B本線

    • コマンド: HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE ./bench_random_mixed_hakmem 1000000 400 1
    • 主な ENVbench_profile 経由):
      • HAKMEM_TINY_HEAP_PROFILE=C7_SAFE
      • HAKMEM_TINY_C7_HOT=1
      • HAKMEM_SMALL_HEAP_V3_ENABLED=1 / HAKMEM_SMALL_HEAP_V3_CLASSES=0x80C7-only v3
      • HAKMEM_TINY_C7_ULTRA_ENABLED=1UF-3 セグメント版, 2MiB/64KiB
      • HAKMEM_TINY_FRONT_V3_ENABLED=1 / HAKMEM_TINY_FRONT_V3_LUT_ENABLED=1
      • HAKMEM_POOL_V2_ENABLED=0
    • Throughput現 HEAD, Release: 約 4445M ops/s
    • 競合:
      • mimalloc: ~110120M ops/s
      • system: ~90M ops/s
  • C7-only (1024B 固定, C7 v3 + ULTRA)

    • C7 ULTRA OFF: ~38M ops/s
    • C7 ULTRA ON: ~57M ops/s約 +50%以上)
    • C7 向け設計ULTRA セグメント + TLS freelist + mask freeは成功パターンとみなし、今後の small-object v4/mid に展開予定。
  • C6-heavy mid/smallmid (257768B, C6 は mid/pool 経路)

    • コマンド: HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 ./bench_mid_large_mt_hakmem 1 1000000 400 1
    • 現状 Throughput: 約 10M ops/s
    • 過去 Phase82 では LEGACY + flatten で 2327M ops/s を記録しており、現行 HEAD では lookup 層hak_super_lookup/mid_desc_lookup 等)がボトルネック化している状態。

2. いま本線で有効な箱

  1. C7 v3 + C7 ULTRA (UF-3 セグメント版)

    • Hot: TinyC7UltraBoxTLS freelist + 2MiB Segment / 64KiB Page, mask 判定)。
    • Cold: C7UltraSegmentBoxpage_meta[] で page/class/used/capacity を管理)。
    • 特徴:
      • C7-only で ~38M→~57M ops/s。Mixed でも 35M→4445M ops/s まで底上げ。
      • C7 ULTRA 管理外の ptr は必ず C7 v3 free にフォールバック(ヘッダ付き Fail-Fast 経路を維持)。
    • ENV:
      • HAKMEM_TINY_C7_ULTRA_ENABLED=1(デフォルト ON
      • HAKMEM_TINY_C7_ULTRA_HEADER_LIGHT は研究箱(デフォルト 0
  2. SmallObject v3C7-only 本線)

    • C7 ページ単位の freelist + current/partial 管理。ColdIface は Tiny v1 経由で Superslab/Warm/Stats を触る。
    • C7 ULTRA ON 時は「セグメント内 ptr だけ ULTRA が先に食い、残りは v3 free」が基本構造。
  3. mid/pool v1C6 は一旦ここに固定, Phase C6-FREEZE

    • C6 は Tiny/SmallObject/ULTRA で特別扱いしない。
    • C6 専用 smallheap v3/v4/ULTRA・pool flatten はすべて ENV opt-in の研究箱扱い。
    • 現状 C6-heavy は ~10M ops/s。再設計ターゲット。

3. small-object v4 / mid 向けの現状と方針

  • SmallObjectHotBox_v4 の箱構造(設計済み, 部分実装)

    • SmallPageMeta: free_list/used/capacity/class_idx/flags/page_idx/segment
    • SmallClassHeap: current/partial_head/full_head
    • SmallHeapCtx: per-thread で SmallClassHeap cls[NUM_SMALL_CLASSES] を持つ。
    • SmallSegment (v4): 2MiB Segment / 64KiB Page を前提に page_meta[] を持つ。
    • ColdIface_v4: small_cold_v4_refill_page / small_cold_v4_retire_page / small_cold_v4_remote_push/drain の 1 箱。
  • C6-only v4 実装Phase v4-mid-2, 研究箱)

    • C6 の alloc/free を SmallHeapCtx v4 経由で処理し、Segment v4 から refill/retire する経路を実装済み。
    • C6-heavy A/BC6 v1 vs v4:
      • v4 OFF: ~9.4M ops/s
      • v4 ON : ~10.1M ops/s約 +8〜9%
    • Mixed で C6-only v4 を ON にすると +1% 程度(ほぼ誤差内)で回帰なし。
    • デフォルトでは HAKMEM_SMALL_HEAP_V4_ENABLED=0 / CLASSES=0x0 のため標準プロファイルには影響しない。
  • mid/smallmid の今後の狙い

    • 現状C6-heavy ~10M ops/s、lookup 系hak_super_lookup / mid_desc_lookup / classify_ptr / ss_map_lookupが ~40% を占める。
    • 方向性:
      • C7 ULTRA で成功したパターンSegment + Page + TLS freelist + mask freeを small-object v4 に広げて、ptr→page→class を O(1) にする。
      • mid_desc_lookup / hak_super_lookup などの lookup 層を small-object v4 route から外す。
      • C6/C5 は「hot mid クラス」として段階的に v4 に載せ、その他の mid/smallmid は SmallHeap v4 or pool v1 で扱う。

4. 今後のフェーズTODO 概要)

  1. Phase v4-mid-3C5-only v4 研究箱) 完了

    • ENV: HAKMEM_SMALL_HEAP_V4_ENABLED=1 / HAKMEM_SMALL_HEAP_V4_CLASSES=0x20 で C5 を SmallHeap v4 route に載せる。
    • A/B 結果:
      • C5-heavy (129256B): v4 OFF 54.4M → v4 ON 48.7M ops/s (10〜11%回帰)。既存 Tiny/front v3 経路が速い。
      • Mixed 161024B (C6+C5 v4): C6-only 28.3M → C5+C6 28.9M ops/s (+2%, 誤差〜微改善)。回帰なし。
    • 方針: C5-heavy では v4 が劣後するため、C5 v4 は研究箱のまま標準プロファイルには入れない。Mixed では影響小さいため C5+C6 v4 (0x60) も研究箱として利用可能。
  2. Phase v4-mid-4/5/6C6/C5 v4 の診断と一時凍結) 完了

    • C5 v4:
      • C5-heavy (129256B): v4 OFF 54.4M → v4 ON 48.7M ops/s10〜11% 回帰)。既存 Tiny/front v3 経路が速い。
      • Mixed 161024B では C5+C6 v4 ON で +2〜3% 程度の微改善だが、本線として採用するほどのメリットは無い。
    • C6 v4:
      • 正しい C6-only ベンチMIN=256 MAX=510で v4 OFF ~5867M → v4 ON ~4850M ops/s15〜28% 回帰)。
      • stats から C6 alloc/free の 100% が v4 経路を通っていることが確認でき、route/fallback ではなく v4 実装そのものが重いことが判明。
      • ws/iters を増やすと TinyHeap とページ共有する設計起因のクラッシュも残存しており、C6 v4 を現行設計のまま本線に載せるのは難しい。
    • TLS fastlist:
      • C6 用 TLS fastlist を追加したが、v4 ON 時の C6-heavy throughput はほぼ変わらず48〜49M ops/s。根本的な回帰v4のページ管理/構造)を打ち消すには至っていない。
    • 方針:
      • SmallObject v4C5/C6 向け)は当面 研究箱のまま凍結し、本線の mid/smallmid 改善は別設計small-object v5 / mid-ULTRA / pool 再設計)として検討する。
      • Mixed/C7 側は引き続き「C7 v3 + C7 ULTRA」を基準に A/B を行い、mid/pool 側は現行 v1 を基準ラインとして据え置く。
  3. Phase v4-mid-SEGVC6 v4 の SEGV 修正・研究箱安定化) 完了

    • 問題: C6 v4 が TinyHeap のページを共有 → iters >= 800k で freelist 破壊 → SEGV
    • 修正: C6 専用 refill/retire を SmallSegment v4 に切り替え、TinyHeap 依存を完全排除
    • 結果:
      • iters=1M, ws <= 390: SEGV 消失
      • C6-only (MIN=257 MAX=768): v4 OFF ~47M → v4 ON ~43M ops/s8.5% 回帰のみ、安定)
      • Mixed 161024B: v4 ON で SEGV なし(小幅回帰許容)
    • 方針: C6 v4 は研究箱として安定化完了。本線には載せない(既存 mid/pool v1 を使用)。

5. 健康診断ラン(必ず最初に叩く 2 本)

  • Tiny/Mixed 用:

    HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE \
    ./bench_random_mixed_hakmem 1000000 400 1
    # 目安: 44±1M ops/s / segv/assert なし
    
  • mid/smallmid C6 用:

    HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1 \
    ./bench_mid_large_mt_hakmem 1 1000000 400 1
    # 現状: ≈10M ops/s / segv/assert なし(再設計ターゲット)
    

まとめて叩きたいときは scripts/verify_health_profiles.sh(存在する場合)を利用し、
詳細な perf/フェーズログは CURRENT_TASK_ARCHIVE_20251210.md と各 docs/analysis/* を参照してください。