Phase FREE-DISPATCHER-OPT-1: free dispatcher 統計計測

**目的**: free dispatcher(29%)の内訳を細分化して計測。

**実装内容**:
- FreeDispatchStats 構造体追加(ENV: HAKMEM_FREE_DISPATCH_STATS, default 0)
- カウンタ: total_calls / domain (tiny/mid/large) / route (ultra/legacy/pool/v6) / env_checks / route_for_class_calls
- hak_free_at / tiny_route_for_class / tiny_route_snapshot_init にカウンタ埋め込み
- 挙動変更なし(計測のみ、ENV OFF 時は overhead ゼロ)

**計測結果**:

Mixed 16-1024B (1M iter, ws=400):
- total=8,081, route_calls=267,967, env_checks=9
- BENCH_FAST_FRONT により大半は早期リターン
- route_for_class は主に alloc 側で呼ばれる(267k calls vs 8k frees)
- ENV check は初期化時の 9回のみ(snapshot 効果)

C6-heavy (257-768B, 1M iter, ws=400):
- total=500,099, route_calls=1,034, env_checks=9
- fg_classify_domain に到達する free が多い
- route_for_class 呼び出しは極小(snapshot 効果)

**結論**:
- ENV check は既に十分最適化されている(初期化時のみ)
- route_for_class は alloc 側での呼び出しが主で、free 側は snapshot で O(1)
- 次フェーズ(OPT-2)では別のアプローチを検討

**ドキュメント追加**:
- docs/analysis/FREE_DISPATCHER_ANALYSIS.md(新規)
- CURRENT_TASK.md に Phase FREE-DISPATCHER-OPT-1 セクション追加

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

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
Moe Charm (CI)
2025-12-11 21:21:40 +09:00
parent 11dc9d390a
commit 118c0e4857
15 changed files with 647 additions and 6 deletions

View File

@ -220,3 +220,123 @@ Step 2.5 が TLS_SLL_PUSH_DUP を「修正」するために追加されたが
- master-80M-unstable から Step 2.5 をリバート
- 複雑な conflict (33行変更) で35+ 回失敗済み
- 推奨しない
---
## Phase PERF-ULTRA-REBASE-2: C4-C7 ULTRA free最適化後のperf再計測 (2025-12-11)
**計測対象**: Mixed 16-1024B, C6-heavy
### 計測条件
- **Mixed 16-1024B**:
- ENV: `HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE`
- ULTRA: C4-C7 全て ON
- ワークロード: iters=1M, ws=400
- perf: -F 5000 --call-graph dwarf -e cycles:u
- **C6-heavy**:
- ENV: `HAKMEM_PROFILE=C6_HEAVY_LEGACY_POOLV1`
- pool v1 + C6/C5/C4 ULTRA
- ワークロード: 1 thread, iters=1M, ws=400
### スループット
- **Mixed**: 42.63M ops/s前回 31.61M から大幅改善、但し ws=400 vs 8192の差
- **C6-heavy**: 26.49M ops/s
### 新しい最大ホットスポットMixed
**WARNING: サンプル数が極めて少ない238 samples**
| 順位 | 関数 | self% | 分類 |
|------|------|-------|------|
| #1 | free | 27.88% | ベンチマーク wrapper |
| #2 | tiny_alloc_gate_fast | 23.57% | alloc gate/front |
| #3 | main | 17.66% | ベンチマーク harness |
| #4 | malloc | 6.94% | ベンチマーク wrapper |
| #5 | header 書き込み合計 | 8.07% | tiny_region_id_write_header |
**ULTRA 関連関数が全て不可視**: tiny_c7_ultra_alloc や ULTRA free 群が上位20に入っていない
### 前フェーズPERF-ULTRA-FREE-OPT-1との比較
- **前回ws=8192, iters=10M**: C7 ULTRA alloc 7.66%, ULTRA free群 5.41%, so_alloc 3.60%
- **今回ws=400, iters=1M**: これらが全て不可視(< 0.63%
- **サンプル数**: 前回1842 samples vs 今回238 samples約1/8
### 結論
- **計測条件の再検討が必要**: ワークロードが軽すぎiters=1M, ws=400
- perf サンプル数が238と極めて少なく統計的信頼性が低い
- ベンチマーク時間が0.023s23msと極めて短くallocator 本体が可視化されていない
- **次の最大ボトルネックを確定できず**:
- gate/front23.57% header8.07%が可視範囲での上位
- ULTRA alloc/free の実態が見えていない
- **推奨される次の手順**:
- iters 10M に増やすまたは ws 8192 に拡大して再計測
- サンプル数を1000+に増やして統計的信頼性を確保
### C6-heavy 分析
- **pool v1 が支配的**: alloc 14.46% + free 19.89% = 34.35%
- **ULTRA は可視化されず**: C6/C5/C4 ULTRA 関数が上位に入っていない
- **pthread_once が8.21%**: 初期化同期のオーバーヘッドが目立つワークロードが軽い証拠
### 出力物
1. **perf_ultra_mixed_v2.txt** - Mixed perf report 完全出力238 samples
2. **perf_ultra_c6_v2.txt** - C6-heavy perf report 完全出力292 samples
3. **更新済み TINY_CPU_HOTPATH_USERLAND_ANALYSIS.md** - 解析結果とWARNINGを記載
4. **更新済み CURRENT_TASK.md** - 本セクション
---
## Phase PERF-ULTRA-REBASE-2 後の次フェーズ候補(要判断)
### 判断保留理由
- **サンプル不足**: 現状の perf 結果では allocator 本体のボトルネックが可視化されていない
- **再計測が必須**: より重いワークロードiters=10M, ws=8192で再測定してから判断すべき
### パターン分析(参考:前回 PERF-ULTRA-REBASE-1 の結果に基づく)
#### パターン A: tiny_c7_ultra_alloc が依然トップの場合
- **前回の値**: 7.66% self最大ホットスポット
- 理由: ULTRA alloc の内部構造refill/page_metaに起因
- 次フェーズ案: **Phase PERF-ULTRA-REFILL-OPT-1**
- C7 ULTRA refill pathcold を最適化
- segment 取得ロジックの軽量化
- page_meta 管理の簡略化
- 判断: C7 refill を弄る技術的難度と効果のバランスを検討
#### パターン B: so_alloc_fast / page_of が浮いてきた場合
- **前回の値**: so_alloc系 3.60%, page_of系 2.74%
- 理由: ULTRA C4-C7 を完全カバーしv3 backend 側が relative に大きくなった
- 次フェーズ案: **Phase PERF-ULTRA-V3-OPT-1**
- so_alloc_v3 hotpath 簡略化
- page_ofptrpage 解決の高速化
- header write の最適化既に thin は確認済み
- 判断: v3 backend 自体を軽くするか backendv4/v6を考えるか
#### パターン C: 残り legacy (C2/C3) が顕著な場合
- 確認: legacy 総数が何%C2/C3 の比率を確認
- 判断基準:
- C2/C3 合計が全体の 5% 以上 C3 ULTRA を検討する価値あり
- C2/C3 合計が 2% 未満 後回しL1 汚染のリスクが高い
#### パターン D: tiny_alloc_gate_fast / header が上位の場合(今回観測)
- **今回の値**: gate 23.57%, header 8.07%
- 理由: ワークロードが軽すぎて allocator 本体が見えていない可能性が高い
- 次フェーズ案: **Phase PERF-ULTRA-REBASE-3再計測**
- より重いワークロードiters=10M, ws=8192で再測定
- サンプル数1000+を確保して統計的信頼性を高める
- その上でパターンA/B/Cのどれかに該当するか判断
### 推奨される判断フロー
1. **Phase PERF-ULTRA-REBASE-3再計測を実施**
- iters=10M, ws=8192 Mixed を再計測
- perf record 時間を長くしてサンプル数を確保
2. **再計測後の perf_ultra_mixed_v3.txt の #1/#2 を見る**
- パターン A/B/C/D のどれに該当するか判定
3. **該当フェーズ案を実装 or 研究箱化の判断**
- A: ULTRA refill 最適化高難度効果大
- B: v3 backend 最適化中難度効果中
- C: C2/C3 ULTRA 追加低難度効果不明
- D: 再計測必須