Files
hakmem/docs/archive/LEARNING_SYSTEM_BUGS_P0.md
Moe Charm (CI) a9ddb52ad4 ENV cleanup: Remove BG/HotMag vars & guard fprintf (Larson 52.3M ops/s)
Phase 1 完了:環境変数整理 + fprintf デバッグガード

ENV変数削除(BG/HotMag系):
- core/hakmem_tiny_init.inc: HotMag ENV 削除 (~131 lines)
- core/hakmem_tiny_bg_spill.c: BG spill ENV 削除
- core/tiny_refill.h: BG remote 固定値化
- core/hakmem_tiny_slow.inc: BG refs 削除

fprintf Debug Guards (#if !HAKMEM_BUILD_RELEASE):
- core/hakmem_shared_pool.c: Lock stats (~18 fprintf)
- core/page_arena.c: Init/Shutdown/Stats (~27 fprintf)
- core/hakmem.c: SIGSEGV init message

ドキュメント整理:
- 328 markdown files 削除(旧レポート・重複docs)

性能確認:
- Larson: 52.35M ops/s (前回52.8M、安定動作)
- ENV整理による機能影響なし
- Debug出力は一部残存(次phase で対応)

🤖 Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-26 14:45:26 +09:00

308 lines
8.5 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.

# 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