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>
This commit is contained in:
Moe Charm (CI)
2025-12-11 02:39:32 +09:00
parent e486dd2c55
commit bdfa32d869
2 changed files with 110 additions and 42 deletions

View File

@ -91,47 +91,28 @@
- 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-4C6 v4 perf 可視化** ✅ 完了
- **重要な発見**: `bench_mid_large_mt_hakmem` は 8〜32 KiB を生成するため、C6 v4 を測定できていなかった。
- 正しい C6-only ベンチ (`bench_random_mixed_hakmem` + `MIN=256 MAX=510`):
- v4 OFF: **66.7M ops/s**
- v4 ON: **48.0M ops/s** (28% 回帰)
- perf: `small_heap_alloc_fast_v4` が上位に出てこない。v4 alloc が正しく呼ばれていない可能性
- 次ステップ: v4 route が正しく呼ばれているか確認・修正が必要
2. **Phase v4-mid-4/5/6C6/C5 v4 の診断と一時凍結** ✅ 完了
- C5 v4:
- C5-heavy (129256B): v4 OFF **54.4M** → v4 ON **48.7M ops/s**10〜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/s**15〜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-5C6 v4 alloc パス修正と診断** ✅ 完了
- **問題**: Phase v4-mid-4 で `small_heap_alloc_fast_v4` が perf に出現せず、v4 route が正しく呼ばれているか不明だった。
- **修正**: 箱化モジュール化の原則に従い、統計 box (`smallobject_hotbox_v4_stats_box.h`) を追加し、alloc/free 経路にカウンタを仕込んだ。
- **診断結果** (C6-only bench, MIN=256 MAX=510):
- v4 OFF: **58.2M ops/s**
- v4 ON: **49.5M ops/s** (15% 回帰)
- Stats: C6 alloc 25,063 calls (100% success, 0 fallback), C6 free 25,062 calls (100% page_found)
- **結論**: v4 route は正しく動作しているが、v4 実装が pool v1 より遅い。次フェーズで perf を取り、ホットスポットを特定する必要がある
4. **Phase v4-mid-6 以降**
- C6 v4 の perf プロファイルを取り、ホットスポットrefill/retire/freelist 操作など)を特定
- C7 ULTRA で成功したパターンmask 判定・TLS freelistを v4 に統合
- mid/smallmid で `mid_desc_lookup / hak_super_lookup` の self% を段階的に削り、Mixed 161024B 全体を mimalloc の 50〜60M ops/s に近づけていく。
5. **ヘッダレスの統合(後フェーズ)**
- いまは C7 ULTRA だけが Segment+mask 基盤で動いている。
- small-object v4 が安定したら、C7 ULTRA のヘッダレス設計を SmallHeapCtx v4 にも展開するptr→page→class→page meta でヘッダ不要に近づける)。
- そのうえで header/light/off は別箱HeaderBoxとして opt-in できるようにする。
---
### Phase v4-mid-6: C6 v4 TLS Fastlist (2025-12-11)
- **実装**:
- `core/smallobject_hotbox_v4.c` に C6 専用の TLS fastlist (`g_small_c6_fast`) を追加。
- `small_heap_alloc_fast_v4` / `free` の冒頭で fastlist をチェックし、O(1) で処理するパスを実装。
- 安全のため ENV `HAKMEM_SMALL_HEAP_V4_FASTLIST=1` でのみ有効化(デフォルト OFF
- `small_heap_free_fast_v4` のフォールバック時に `hak_pool_free` を呼ぶよう修正(メモリリーク防止)。
- **評価**:
- `bench_mid_large_mt_hakmem` (C6-heavy): v4 ON で完走、約 22M ops/sfastlist OFF時と同等
- `bench_random_mixed_hakmem` (Mixed 16-1024B): v4 ON にすると fastlist ON/OFF に関わらず SEGV が発生することを確認Phase v4-mid-5 時点からの潜在的な不安定性)。
- 結論: Fastlist 機構は実装済みだが、v4 自体が Mixed ワークロードで不安定なため、機能は ENV ゲートで封印してマージする。
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 を使用)
---
@ -153,4 +134,3 @@
まとめて叩きたいときは `scripts/verify_health_profiles.sh`(存在する場合)を利用し、
詳細な perf/フェーズログは `CURRENT_TASK_ARCHIVE_20251210.md` と各 `docs/analysis/*` を参照してください。