# P0: Learning System Critical Bugs **発見日**: 2025-11-26 **発見者**: Benchmark validation task (LEARNING_BENCHMARK_TASK.md 実行中) **重要度**: **P0 - CRITICAL** (本番環境使用不可) --- ## 📋 バグサマリー 学習機能を有効化すると即座にクラッシュします。PROFILES.md で推奨していた Balanced/Adaptive/Tight プロファイルは **全て使用不可能** です。 --- ## 🐛 Bug #1: HAKMEM_ALLOC_LEARN=1 で即座に SEGFAULT ### 再現手順 ```bash export HAKMEM_ALLOC_LEARN=1 export HAKMEM_ALLOC_LEARN_WINDOW=10000 export HAKMEM_ALLOC_LEARN_RATE=0.08 export HAKMEM_MEM_LEARN=0 export HAKMEM_SUPERSLAB_REUSE=1 export HAKMEM_SUPERSLAB_PREWARM=0 ./out/release/bench_random_mixed_hakmem 10000000 256 42 ``` ### 期待される動作 ベンチマークが正常に実行され、学習機能が TLS キャッシュ容量を動的に調整する。 ### 実際の動作 ``` Segmentation fault (exit code 139) ``` 即座にクラッシュ。ベンチマークは 1 iteration も実行されない。 ### 影響範囲 - ❌ Balanced Profile (HAKMEM_ALLOC_LEARN=1 使用) → 使用不可能 - ❌ Adaptive Profile (HAKMEM_ALLOC_LEARN=1 使用) → 使用不可能 - ❌ Tight Profile (HAKMEM_ALLOC_LEARN=1 使用) → 使用不可能 ### 関連ファイル - `core/hakmem_alloc_learner.c` - Allocation learning 実装 - `core/hakmem_learner.c` - Learning system 基盤 - `core/tiny_adaptive_sizing.c` - Adaptive sizing (学習駆動) ### デバッグ情報 **初期調査推奨コマンド**: ```bash # AddressSanitizer で実行 ./build.sh debug bench_random_mixed_hakmem export HAKMEM_ALLOC_LEARN=1 export HAKMEM_ALLOC_LEARN_WINDOW=10000 export HAKMEM_ALLOC_LEARN_RATE=0.08 ./out/debug/bench_random_mixed_hakmem 1000 256 42 # 短い実行で確認 ``` **予想される原因**: - 未初期化ポインタ / null pointer dereference - Learning system constructor の初期化順序問題 - TLS storage との競合 --- ## 🐛 Bug #2: HAKMEM_MEM_LEARN=1 で即座に SEGFAULT ### 再現手順 ```bash export HAKMEM_ALLOC_LEARN=0 export HAKMEM_MEM_LEARN=1 export HAKMEM_MEM_LEARN_WINDOW=20000 export HAKMEM_MEM_LEARN_THRESHOLD=0.7 export HAKMEM_SUPERSLAB_REUSE=1 export HAKMEM_SUPERSLAB_PREWARM=0 ./out/release/bench_random_mixed_hakmem 10000000 256 42 ``` ### 期待される動作 ベンチマークが正常に実行され、Memory Learning が THP/WMAX 閾値を動的に調整する。 ### 実際の動作 ``` Segmentation fault (exit code 139) ``` 即座にクラッシュ。 ### 影響範囲 - ❌ Adaptive Profile (HAKMEM_MEM_LEARN=1 使用) → 使用不可能 - ❌ Tight Profile (HAKMEM_MEM_LEARN=1 使用) → 使用不可能 ### 関連ファイル - `core/hakmem_mem_learner.c` - Memory learning 実装 - `core/hakmem_learner.c` - Learning system 基盤 ### デバッグ情報 **初期調査推奨コマンド**: ```bash ./build.sh debug bench_random_mixed_hakmem export HAKMEM_MEM_LEARN=1 export HAKMEM_MEM_LEARN_WINDOW=20000 ./out/debug/bench_random_mixed_hakmem 1000 256 42 ``` **予想される原因**: - Bug #1 と同様の初期化問題 - Memory statistics 収集インフラとの連携不備 --- ## 🐛 Bug #3: Larson ベンチマークで TLS SLL corruption ### ⚠️ 根本原因特定済み(2025-11-26) **First Bad Commit**: `19c1abfe7` "Fix Unified Cache TLS SLL bypass" **Last Working Commit**: `5c8567562` "Add callsite tracking for tls_sll_push/pop" ### 🔧 回避策(即座に利用可能) ```bash # larson-fix ブランチに切り替え(動作確認済み: 51.54 M ops/s) git checkout larson-fix ./build.sh larson_hakmem ./out/release/larson_hakmem 1 5 1 1000 100 10000 42 ``` ### 再現手順 ```bash # master ブランチ(クラッシュする) git checkout master ./out/release/larson_hakmem 1 10 1 1000 100 10000 42 ``` ### 期待される動作 Larson ベンチマークが正常に実行され、alloc/free の混合ワークロードを 10 秒間実行する。 ### 実際の動作 ``` TLS_SLL_NORMALIZE_USERPTR error Segmentation fault (exit code 139) ``` 学習機能OFFでもクラッシュ。 ### 技術的分析 **問題のコミット**: `19c1abfe7` が導入した Step 2.5 in `unified_cache_refill()`: - TLS SLL から pop して Unified Cache に入れる処理を追加 - Cross-thread free されたブロックが TLS SLL に混入 - Header restoration だけでは解決しない深い設計問題 **35+ コミットで「修正」を試みたが全て失敗**: - `1a301c1a2` Add header restoration for TLS SLL pop - `78df6756e` Fix header restoration in 4 TLS SLL pop paths - `a941043f2` Box Theory: Encapsulate header restoration in tls_sll_pop - `165c33bc2` Fix Larson regression: Add SuperSlab fallback - ... 全て Larson は依然クラッシュ ### 影響範囲 - ❌ Larson 1T: 使用不可能(master ブランチ) - ❌ Larson 8T: 使用不可能(master ブランチ) - ✅ Larson 1T: **51.54 M ops/s** (`larson-fix` ブランチ) - ❌ PROFILES.md の Larson 性能値: 全て検証不可能(master) ### 関連ファイル - `core/front/tiny_unified_cache.c:434-463` - Step 2.5 (問題のコード) - `core/box/tls_sll_box.h` - TLS SLL (Single Linked List) 実装 - `core/tiny_free_fast_v2.inc.h` - Fast free with cross-thread detection ### デバッグ情報 **エラーメッセージの意味**: - `TLS_SLL_NORMALIZE_USERPTR error`: User pointer から base pointer への変換失敗 - `TLS_SLL_PUSH_META_MISMATCH`: Metadata の class index 不一致 - `FREE_FAST_HDR_META_MISMATCH`: Header と Meta の class 不一致(hdr_cls=-1 = 無効なヘッダー) **根本原因**: - Step 2.5 が cross-thread free されたブロックを TLS SLL から pop - これらのブロックは他スレッドの SuperSlab に所属 - Header restoration だけでは所有権問題を解決できない - `HAKMEM_TINY_LARSON_FIX=1` (cross-thread detection) を有効化しても解決しない **正しい修正方法**: 1. Step 2.5 を完全に削除(`larson-fix` ブランチの状態に戻す) 2. または、TLS SLL に cross-thread isolation を実装 --- ## 📊 動作確認済みの設定 ### ✅ Baseline (学習OFF, Random Mixed のみ) ```bash unset HAKMEM_ALLOC_LEARN unset HAKMEM_MEM_LEARN export HAKMEM_SUPERSLAB_REUSE=1 export HAKMEM_SUPERSLAB_PREWARM=0 ./out/release/bench_random_mixed_hakmem 10000000 256 42 ``` **結果**: **83.19 M ops/s** ✅ ### ✅ Larson (`larson-fix` ブランチ使用) ```bash git checkout larson-fix ./build.sh larson_hakmem ./out/release/larson_hakmem 1 5 1 1000 100 10000 42 ``` **結果**: **51.54 M ops/s** ✅ **注意**: `master` ブランチでは Larson はクラッシュします。 --- ## 🔧 修正優先順位 ### P0 (即座に修正が必要) 1. **Bug #1: HAKMEM_ALLOC_LEARN=1 crash** - 影響: Balanced/Adaptive/Tight プロファイル全滅 - 修正なしでは学習機能が一切使えない 2. **Bug #2: HAKMEM_MEM_LEARN=1 crash** - 影響: Adaptive/Tight プロファイル - Bug #1 と同時修正推奨(共通の初期化問題の可能性) 3. **Bug #3: Larson benchmark crash** - 影響: 全プロファイルで Larson が使えない - TLS corruption は他のワークロードにも影響の可能性 --- ## 📝 次のステップ ### 1. デバッグビルドで原因特定 ```bash # ASan + TSan ビルド ./build.sh debug bench_random_mixed_hakmem ./build.sh debug larson_hakmem # Bug #1 調査 export HAKMEM_ALLOC_LEARN=1 ./out/debug/bench_random_mixed_hakmem 1000 256 42 # Bug #3 調査 ./out/debug/larson_hakmem 1 10 1 1000 100 10000 42 ``` ### 2. Learning system の無効化パッチ(暫定対応) 学習機能を完全に無効化するコンパイル時フラグを追加: ```c // core/hakmem_learner.c #ifndef HAKMEM_DISABLE_LEARNING // learning code here #else // no-op stubs #endif ``` これにより、修正完了まで学習機能を安全に無効化できる。 ### 3. ドキュメント更新(完了) - ✅ PROFILES.md: 警告追加、学習関連数値を「未検証」に変更 - ✅ LEARNING_BENCHMARK_TASK.md: 実測結果を反映 - ✅ このバグレポート作成 --- ## 📚 関連ドキュメント - `PROFILES.md` - 設定プロファイル(学習機能が壊れていることを記載済み) - `LEARNING_BENCHMARK_TASK.md` - ベンチマーク計測タスク(実測結果を記載済み) - `DEPRECATED.md` - 学習関連の環境変数マッピング - `CLAUDE.md` - 開発ログ(学習機能の期待値が記載されている) --- **作成日**: 2025-11-26 **ステータス**: 🔴 OPEN - 修正待ち **担当者**: TBD