2025-11-26 12:34:21 +09:00
|
|
|
|
# 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 12:34:27 +09:00
|
|
|
|
### ⚠️ 根本原因特定済み(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"
|
|
|
|
|
|
|
|
|
|
|
|
### 🔧 回避策(即座に利用可能)
|
2025-11-26 12:34:21 +09:00
|
|
|
|
|
|
|
|
|
|
```bash
|
2025-11-26 12:34:27 +09:00
|
|
|
|
# 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
|
|
|
|
|
|
```
|
2025-11-26 12:34:21 +09:00
|
|
|
|
|
2025-11-26 12:34:27 +09:00
|
|
|
|
### 再現手順
|
|
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
|
# master ブランチ(クラッシュする)
|
|
|
|
|
|
git checkout master
|
2025-11-26 12:34:21 +09:00
|
|
|
|
./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でもクラッシュ。
|
|
|
|
|
|
|
2025-11-26 12:34:27 +09:00
|
|
|
|
### 技術的分析
|
2025-11-26 12:34:21 +09:00
|
|
|
|
|
2025-11-26 12:34:27 +09:00
|
|
|
|
**問題のコミット**: `19c1abfe7` が導入した Step 2.5 in `unified_cache_refill()`:
|
|
|
|
|
|
- TLS SLL から pop して Unified Cache に入れる処理を追加
|
|
|
|
|
|
- Cross-thread free されたブロックが TLS SLL に混入
|
|
|
|
|
|
- Header restoration だけでは解決しない深い設計問題
|
2025-11-26 12:34:21 +09:00
|
|
|
|
|
2025-11-26 12:34:27 +09:00
|
|
|
|
**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 は依然クラッシュ
|
2025-11-26 12:34:21 +09:00
|
|
|
|
|
|
|
|
|
|
### 影響範囲
|
|
|
|
|
|
|
2025-11-26 12:34:27 +09:00
|
|
|
|
- ❌ Larson 1T: 使用不可能(master ブランチ)
|
|
|
|
|
|
- ❌ Larson 8T: 使用不可能(master ブランチ)
|
|
|
|
|
|
- ✅ Larson 1T: **51.54 M ops/s** (`larson-fix` ブランチ)
|
|
|
|
|
|
- ❌ PROFILES.md の Larson 性能値: 全て検証不可能(master)
|
2025-11-26 12:34:21 +09:00
|
|
|
|
|
|
|
|
|
|
### 関連ファイル
|
|
|
|
|
|
|
2025-11-26 12:34:27 +09:00
|
|
|
|
- `core/front/tiny_unified_cache.c:434-463` - Step 2.5 (問題のコード)
|
2025-11-26 12:34:21 +09:00
|
|
|
|
- `core/box/tls_sll_box.h` - TLS SLL (Single Linked List) 実装
|
2025-11-26 12:34:27 +09:00
|
|
|
|
- `core/tiny_free_fast_v2.inc.h` - Fast free with cross-thread detection
|
2025-11-26 12:34:21 +09:00
|
|
|
|
|
|
|
|
|
|
### デバッグ情報
|
|
|
|
|
|
|
|
|
|
|
|
**エラーメッセージの意味**:
|
|
|
|
|
|
- `TLS_SLL_NORMALIZE_USERPTR error`: User pointer から base pointer への変換失敗
|
|
|
|
|
|
- `TLS_SLL_PUSH_META_MISMATCH`: Metadata の class index 不一致
|
2025-11-26 12:34:27 +09:00
|
|
|
|
- `FREE_FAST_HDR_META_MISMATCH`: Header と Meta の class 不一致(hdr_cls=-1 = 無効なヘッダー)
|
2025-11-26 12:34:21 +09:00
|
|
|
|
|
2025-11-26 12:34:27 +09:00
|
|
|
|
**根本原因**:
|
|
|
|
|
|
- Step 2.5 が cross-thread free されたブロックを TLS SLL から pop
|
|
|
|
|
|
- これらのブロックは他スレッドの SuperSlab に所属
|
|
|
|
|
|
- Header restoration だけでは所有権問題を解決できない
|
|
|
|
|
|
- `HAKMEM_TINY_LARSON_FIX=1` (cross-thread detection) を有効化しても解決しない
|
2025-11-26 12:34:21 +09:00
|
|
|
|
|
2025-11-26 12:34:27 +09:00
|
|
|
|
**正しい修正方法**:
|
|
|
|
|
|
1. Step 2.5 を完全に削除(`larson-fix` ブランチの状態に戻す)
|
|
|
|
|
|
2. または、TLS SLL に cross-thread isolation を実装
|
2025-11-26 12:34:21 +09:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 📊 動作確認済みの設定
|
|
|
|
|
|
|
|
|
|
|
|
### ✅ 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** ✅
|
|
|
|
|
|
|
2025-11-26 12:34:27 +09:00
|
|
|
|
### ✅ 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 はクラッシュします。
|
2025-11-26 12:34:21 +09:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 🔧 修正優先順位
|
|
|
|
|
|
|
|
|
|
|
|
### 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
|