Files
hakmem/README_PERF_ANALYSIS.md
Moe Charm (CI) acc64f2438 Phase ML1: Pool v1 memset 89.73% overhead 軽量化 (+15.34% improvement)
## Summary
- ChatGPT により bench_profile.h の setenv segfault を修正(RTLD_NEXT 経由に切り替え)
- core/box/pool_zero_mode_box.h 新設:ENV キャッシュ経由で ZERO_MODE を統一管理
- core/hakmem_pool.c で zero mode に応じた memset 制御(FULL/header/off)
- A/B テスト結果:ZERO_MODE=header で +15.34% improvement(1M iterations, C6-heavy)

## Files Modified
- core/box/pool_api.inc.h: pool_zero_mode_box.h include
- core/bench_profile.h: glibc setenv → malloc+putenv(segfault 回避)
- core/hakmem_pool.c: zero mode 参照・制御ロジック
- core/box/pool_zero_mode_box.h (新設): enum/getter
- CURRENT_TASK.md: Phase ML1 結果記載

## Test Results
| Iterations | ZERO_MODE=full | ZERO_MODE=header | Improvement |
|-----------|----------------|-----------------|------------|
| 10K       | 3.06 M ops/s   | 3.17 M ops/s    | +3.65%     |
| 1M        | 23.71 M ops/s  | 27.34 M ops/s   | **+15.34%** |

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

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2025-12-10 09:08:18 +09:00

190 lines
9.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HAKMEM Allocator Performance Analysis Results
標準 Mixed 161024B ベンチの ENV は `docs/analysis/ENV_PROFILE_PRESETS.md``MIXED_TINYV3_C7_SAFE` プリセットを参照してください。ベンチ実行前に `HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE` を export すると自動で適用されます(既存 ENV があればそちらを優先)。
**最新メモ (2025-12-06, Release)**
- 新規比較表: `PERF_COMPARISON_ALLOCATORS.md` に HAKMEM (full/larson_guard) / mimalloc / system の ops/s と RSS を掲載。C7-only/1291024/full いずれも HAKMEM は ~50M ops/s / ~29MB RSS、system/mimalloc は 75126M ops/s / 1.61.9MB RSS で優位。
- Random Mixed 1291024B, ws=256, iters=1M, `HAKMEM_WARM_TLS_BIND_C7=2`:
- policy=legacy ≈ **51.5M ops/s**。TinyClassStats: C7 uc_miss=17196 / warm_hit=8597 / shared_lock=5 / tls_carve_attempt=8597 / success=8597C5/C6 は uc_miss=1〜2
- policy=autoscore=shared_lock*4+uc_miss**51.9M ops/s**C7 固定 ON、C5/C6 はほぼ動かず)。
- policy=c5_7_only ≈ **50.1M ops/s**
- C7-only (size=1024, ws=32, iters=200K):
- legacy: 平均 ≈ **46M ops/s**Warm hit 3329 / tls_carve_success 3329 / shared_lock=5
- auto: 平均 ≈ **44M ops/s**統計ほぼ同じ、C7 固定 ON
- C7 guard vs fullSuperslab 予算+空スラブ限定):
- C7-only: full **42.4M ops/s** vs larson_guard **40.7M ops/s**-4%)。
- 1291024B: full **49.0M ops/s** vs larson_guard **48.4M ops/s**-1.2%)。
- C5/C6 固定サイズ (size=256≒C6, ws=512, iters=1M, stats dump ON):
- policy=legacy ≈ **89.9M ops/s**C6 uc_miss=5 / warm_hit=1 / tls_carve_success=1
- policy=auto ≈ **87.5M ops/s**統計ほぼ同じ、C5 はほぼゼロ)。
- WarmPool-STATS を TinyClassStats と統合。`HAKMEM_WARM_POOL_STATS=1` で C7-only 実行時に hits=3329 / misses=1 / prefilled=1 を確認warm_hit と一致)。
- ログ抑制 ENV: `HAKMEM_TINY_POLICY_LOG` / `HAKMEM_TINY_WARM_LOG` / `HAKMEM_TINY_PAGEBOX_LOG` を 0 にすると長時間ランのノイズが減る(短時間の C7 デバッグ時だけ 1 にすると便利)。
- C7-only (mode=2) は Release/Debug ともに ~20M ops/s 帯(ログを多めに出すと 40M 付近まで振れる)。
- サイズ→クラス: `hak_tiny_size_to_class(size+1)` により 257512B→C6、5132048B→C7。512B も C7 が受ける設計で、実負荷の多くが C7 に集中するC5/C6 は拡張枠)。
- mimalloc/system 比較Release, `HAKMEM_TINY_PROFILE=full HAKMEM_TINY_POLICY_PROFILE=legacy HAKMEM_WARM_TLS_BIND_C7=2`, prefault=10% デフォルト, ログOFF
| workload (cycles/ws/size帯) | HAKMEM | mimalloc | system | 備考 |
| --- | --- | --- | --- | --- |
| C7-only (200K / 32 / 1024) | **48.8M ops/s** | 95.3M | 73.9M | mode=2, Warm+TLS carve |
| Tiny-mixed 1291024B (1M / 256) | **50.0M** | 128.4M | 97.7M | 5132048B を C7 が受ける設計 |
| full 161024B (1M / 256) | **50.9M** | 123.6M | 83.5M | デフォルト帯 |
| Tiny-only 8128B (200K / 400) | **93.2M** | 123.7M | 66.3M | Warm/TLS はほぼ踏まれず |
現状ベスト: mimalloc が全帯域で最速。HAKMEM は C7 専用ワークロードで 50M 付近、Tiny-only では system より高速だが mimalloc には未到達。
**前回メモ (2025-12-05)**: C7 Warm/TLS Bind を Bind-only (mode=1) を本番経路とし、Release でも mode=2 を実験で有効化可能。C7-only で mode=1 が legacy (mode=0) 比で ~410x。
**Release 修復メモ (2025-12-05)**: 満杯 C7 slab が Shared Pool に残留していたため Warm が死んでいた。Acquire/Stage3 で空スラブ限定&リセットを入れて C7-only Release ~23.7M ops/s → 20M+ 帯まで回復。
**Policy/OBSERVE/LEARN (2025-12-05)**: `TinyClassPolicyBox` 追加。`HAKMEM_TINY_POLICY_PROFILE=legacy|c5_7_only|tinyplus_all|auto` で Page/Warm を切替。OBSERVE では C7 がホットスポットで、`auto` プロファイルは C7 固定ON + score 上位2クラスC5/C6 など)を自動で Tiny-Plus に昇格させる。
**分析実施日**: 2025-11-28
**分析対象**: HAKMEM allocator (commit 0ce20bb83)
**ベンチマーク**: bench_random_mixed (1,000,000 ops, working set=256)
**ツール**: Linux perf (record/stat/report/annotate)
---
## 📊 クイックサマリー
| 指標 | HAKMEM | System malloc | 差分 |
|------|--------|---------------|------|
| **Throughput** | 55.7M ops/s | 86.7M ops/s | -35.7% ❌ |
| **IPC** | 2.12 | 2.09 | +1.4% ✅ |
| **Branch Miss** | 2.56% | 3.39% | -24.5% ✅ |
| **Cache Miss** | 9.28% | 13.26% | -30.0% ✅ |
| **Instructions** | 167M | 94M | +78.4% ❌ |
| **Cache Refs** | 1.86M | 340K | +448% ❌ |
**結論**: 効率は良いが仕事量が多すぎる → 不要な処理の削減が最優先
---
## 📁 生成ファイル一覧
### メインレポート
1. **PERF_ANALYSIS_EXECUTIVE_SUMMARY.md**
- エグゼクティブサマリー
- トップ3ボトルネック
- 最適化ロードマップ (Phase 1-3)
- すぐに試せるコマンド
2. **perf_analysis_summary.md**
- 詳細分析レポート (9.4KB)
- 全ボトルネックの説明
- 優先度付き最適化提案 (5項目)
- 実測効果予測 (楽観的/保守的シナリオ)
3. **perf_comparison_chart.txt**
- 視覚的比較チャート
- ASCII バーグラフ形式
### 生データ
4. **perf_hakmem_stats.txt** - HAKMEM の perf stat 出力
5. **perf_system_stats.txt** - System malloc の perf stat 出力
6. **perf_hakmem_hotspots.txt** - ホットスポット詳細 (perf report)
7. **perf_hakmem_callgraph.txt** - コールグラフ (perf report -g)
8. **perf_annotate_malloc.txt** - malloc 関数のアセンブリアノテーション
---
## 🔥 トップ3ボトルネック
### 1. SuperSlab 初期化 (23.83% CPU時間)
- **原因**: 4つの memset() で 1MB-2MB をゼロクリア
- **対策**: memset 削除 (mmap は既にゼロ初期化済み)
- **効果**: +10-15% throughput
- **実装箇所**: `/mnt/workdisk/public_share/hakmem/core/hakmem_tiny_superslab.c:912-915`
### 2. 多層分岐ルーティング (36M branches)
- **原因**: smallmid → tiny → mid → ACE の順次チェック
- **対策**: Dispatch table で一発判定
- **効果**: +5-8% throughput
### 3. 過剰なキャッシュアクセス (1.86M refs)
- **原因**: SuperSlab メタデータが大きい、Hot/Cold 混在
- **対策**: Cache line 最適化 (hot fields を先頭64Bに集約)
- **効果**: +3-5% cache efficiency
---
## 🎯 推奨アクション
### すぐに試せる (1-2日)
```bash
cd /mnt/workdisk/public_share/hakmem
# 1. memset 削除版
cp core/hakmem_tiny_superslab.c core/hakmem_tiny_superslab.c.bak
sed -i '912,915s/^/\/\/ PERF_OPT: /' core/hakmem_tiny_superslab.c
make clean && make
./bench_random_mixed_hakmem 1000000 256 42
# 2. mincore 無効化版
make clean
make CFLAGS="-DHAKMEM_DISABLE_MINCORE_CHECK=1"
./bench_random_mixed_hakmem 1000000 256 42
```
**期待効果**: 55M → **63-67M ops/s** (+13-20%)
---
## 📈 最適化ロードマップ
| Phase | 実装期間 | 目標 | 施策 |
|-------|---------|------|------|
| **Phase 1** | 1-2日 | 65M ops/s (+17%) | memset削除, mincore無効化, likely hints |
| **Phase 2** | 1週間 | 77M ops/s (+39%) | dispatch table, 512KB SuperSlab, LTO, cache line |
| **Phase 3** | 2週間 | 詳細分析 | Valgrind, MT bench, workload別最適化 |
---
## 🛠️ 使用したコマンド
### プロファイリング
```bash
# ホットスポット分析
perf record -g ./bench_random_mixed_hakmem 1000000 256 42
perf report --stdio | head -100 > perf_hakmem_hotspots.txt
# 統計比較
perf stat -e cycles,instructions,cache-references,cache-misses,branches,branch-misses \
./bench_random_mixed_hakmem 1000000 256 42 2>&1 | tee perf_hakmem_stats.txt
perf stat -e cycles,instructions,cache-references,cache-misses,branches,branch-misses \
./bench_random_mixed_system 1000000 256 42 2>&1 | tee perf_system_stats.txt
# コールグラフ
perf report --stdio -g graph,0.5,caller --no-children | head -200 > perf_hakmem_callgraph.txt
# アノテーション
perf annotate --stdio malloc > perf_annotate_malloc.txt
```
---
## 📚 関連ファイル
### ソースコード
- `/mnt/workdisk/public_share/hakmem/core/box/hak_alloc_api.inc.h` - Alloc API
- `/mnt/workdisk/public_share/hakmem/core/box/hak_free_api.inc.h` - Free API
- `/mnt/workdisk/public_share/hakmem/core/hakmem_tiny_superslab.c` - SuperSlab 実装
- `/mnt/workdisk/public_share/hakmem/core/hakmem_shared_pool.c` - Shared Pool
### ベンチマーク
- `/mnt/workdisk/public_share/hakmem/bench_random_mixed_hakmem` - HAKMEM版
- `/mnt/workdisk/public_share/hakmem/bench_random_mixed_system` - System malloc版
---
## 🔍 詳細を読むには
1. **全体像を把握**: `PERF_ANALYSIS_EXECUTIVE_SUMMARY.md` を読む (5分)
2. **詳細な分析**: `perf_analysis_summary.md` を読む (15分)
3. **生データ確認**: `perf_hakmem_*.txt` ファイル群を参照
---
**次のステップ**:
1. `PERF_ANALYSIS_EXECUTIVE_SUMMARY.md` を開く
2. "すぐに試せるコマンド" を実行
3. スループット改善を確認
**質問・フィードバック**: 分析者 Claude Code (Sonnet 4.5)