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

9.2 KiB
Raw Blame History

HAKMEM Allocator Performance Analysis Results

標準 Mixed 161024B ベンチの ENV は docs/analysis/ENV_PROFILE_PRESETS.mdMIXED_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_miss51.9M ops/sC7 固定 ON、C5/C6 はほぼ動かず)。
    • policy=c5_7_only ≈ 50.1M ops/s
  • C7-only (size=1024, ws=32, iters=200K):
    • legacy: 平均 ≈ 46M ops/sWarm 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/sC6 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 バーグラフ形式

生データ

  1. perf_hakmem_stats.txt - HAKMEM の perf stat 出力
  2. perf_system_stats.txt - System malloc の perf stat 出力
  3. perf_hakmem_hotspots.txt - ホットスポット詳細 (perf report)
  4. perf_hakmem_callgraph.txt - コールグラフ (perf report -g)
  5. 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日)

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別最適化

🛠️ 使用したコマンド

プロファイリング

# ホットスポット分析
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)