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:
@ -91,47 +91,28 @@
|
||||
- Mixed 16–1024B (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(C6 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/6(C6/C5 v4 の診断と一時凍結)** ✅ 完了
|
||||
- C5 v4:
|
||||
- C5-heavy (129–256B): v4 OFF **54.4M** → v4 ON **48.7M ops/s**(−10〜11% 回帰)。既存 Tiny/front v3 経路が速い。
|
||||
- Mixed 16–1024B では C5+C6 v4 ON で +2〜3% 程度の微改善だが、本線として採用するほどのメリットは無い。
|
||||
- C6 v4:
|
||||
- 正しい C6-only ベンチ(MIN=256 MAX=510)で v4 OFF **~58–67M** → v4 ON **~48–50M 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 v4(C5/C6 向け)は当面 **研究箱のまま凍結**し、本線の mid/smallmid 改善は別設計(small-object v5 / mid-ULTRA / pool 再設計)として検討する。
|
||||
- Mixed/C7 側は引き続き「C7 v3 + C7 ULTRA」を基準に A/B を行い、mid/pool 側は現行 v1 を基準ラインとして据え置く。
|
||||
|
||||
3. **Phase v4-mid-5(C6 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 16–1024B 全体を 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/s(fastlist 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-SEGV(C6 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/s(−8.5% 回帰のみ、安定)
|
||||
- Mixed 16–1024B: 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/*` を参照してください。
|
||||
|
||||
|
||||
Reference in New Issue
Block a user