2025-11-28 17:51:00 +09:00
|
|
|
|
# HAKMEM Allocator Performance Analysis Results
|
|
|
|
|
|
|
2025-12-10 09:08:18 +09:00
|
|
|
|
標準 Mixed 16–1024B ベンチの ENV は `docs/analysis/ENV_PROFILE_PRESETS.md` の `MIXED_TINYV3_C7_SAFE` プリセットを参照してください。ベンチ実行前に `HAKMEM_PROFILE=MIXED_TINYV3_C7_SAFE` を export すると自動で適用されます(既存 ENV があればそちらを優先)。
|
|
|
|
|
|
|
2025-12-07 03:12:27 +09:00
|
|
|
|
**最新メモ (2025-12-06, Release)**
|
|
|
|
|
|
- 新規比較表: `PERF_COMPARISON_ALLOCATORS.md` に HAKMEM (full/larson_guard) / mimalloc / system の ops/s と RSS を掲載。C7-only/129–1024/full いずれも HAKMEM は ~50M ops/s / ~29MB RSS、system/mimalloc は 75–126M ops/s / 1.6–1.9MB RSS で優位。
|
|
|
|
|
|
- Random Mixed 129–1024B, 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=8597(C5/C6 は uc_miss=1〜2)。
|
|
|
|
|
|
- policy=auto(score=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 full(Superslab 予算+空スラブ限定):
|
|
|
|
|
|
- C7-only: full **42.4M ops/s** vs larson_guard **40.7M ops/s**(-4%)。
|
|
|
|
|
|
- 129–1024B: 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)` により 257–512B→C6、513–2048B→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 129–1024B (1M / 256) | **50.0M** | 128.4M | 97.7M | 513–2048B を C7 が受ける設計 |
|
|
|
|
|
|
| full 16–1024B (1M / 256) | **50.9M** | 123.6M | 83.5M | デフォルト帯 |
|
|
|
|
|
|
| Tiny-only 8–128B (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) 比で ~4–10x。
|
|
|
|
|
|
**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-12-05 23:41:01 +09:00
|
|
|
|
|
2025-11-28 17:51:00 +09:00
|
|
|
|
**分析実施日**: 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)
|