Update Larson bug analysis: root cause identified, larson-fix branch created
(cherry-picked from 328a6b722)
This commit is contained in:
@ -125,13 +125,25 @@ export HAKMEM_MEM_LEARN_WINDOW=20000
|
|||||||
|
|
||||||
## 🐛 Bug #3: Larson ベンチマークで TLS SLL corruption
|
## 🐛 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
|
```bash
|
||||||
# 学習機能は OFF(デフォルト)
|
# master ブランチ(クラッシュする)
|
||||||
unset HAKMEM_ALLOC_LEARN
|
git checkout master
|
||||||
unset HAKMEM_MEM_LEARN
|
|
||||||
|
|
||||||
./out/release/larson_hakmem 1 10 1 1000 100 10000 42
|
./out/release/larson_hakmem 1 10 1 1000 100 10000 42
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -148,48 +160,49 @@ Segmentation fault (exit code 139)
|
|||||||
|
|
||||||
学習機能OFFでもクラッシュ。
|
学習機能OFFでもクラッシュ。
|
||||||
|
|
||||||
### マルチスレッド版(8T)
|
### 技術的分析
|
||||||
|
|
||||||
```bash
|
**問題のコミット**: `19c1abfe7` が導入した Step 2.5 in `unified_cache_refill()`:
|
||||||
./out/release/larson_hakmem 8 10 1 1000 100 10000 42
|
- TLS SLL から pop して Unified Cache に入れる処理を追加
|
||||||
```
|
- Cross-thread free されたブロックが TLS SLL に混入
|
||||||
|
- Header restoration だけでは解決しない深い設計問題
|
||||||
|
|
||||||
**結果**:
|
**35+ コミットで「修正」を試みたが全て失敗**:
|
||||||
```
|
- `1a301c1a2` Add header restoration for TLS SLL pop
|
||||||
TLS_SLL_PUSH_META_MISMATCH: cls=0 meta_cls=1
|
- `78df6756e` Fix header restoration in 4 TLS SLL pop paths
|
||||||
Segmentation fault (exit code 139)
|
- `a941043f2` Box Theory: Encapsulate header restoration in tls_sll_pop
|
||||||
```
|
- `165c33bc2` Fix Larson regression: Add SuperSlab fallback
|
||||||
|
- ... 全て Larson は依然クラッシュ
|
||||||
|
|
||||||
### 影響範囲
|
### 影響範囲
|
||||||
|
|
||||||
- ❌ Larson 1T: 使用不可能(全プロファイル)
|
- ❌ Larson 1T: 使用不可能(master ブランチ)
|
||||||
- ❌ Larson 8T: 使用不可能(全プロファイル)
|
- ❌ Larson 8T: 使用不可能(master ブランチ)
|
||||||
- ❌ PROFILES.md の Larson 性能値: 全て検証不可能
|
- ✅ Larson 1T: **51.54 M ops/s** (`larson-fix` ブランチ)
|
||||||
|
- ❌ PROFILES.md の Larson 性能値: 全て検証不可能(master)
|
||||||
|
|
||||||
### 関連ファイル
|
### 関連ファイル
|
||||||
|
|
||||||
- `benchmarks/larson.c` - Larson ベンチマーク実装
|
- `core/front/tiny_unified_cache.c:434-463` - Step 2.5 (問題のコード)
|
||||||
- `core/box/tls_sll_box.h` - TLS SLL (Single Linked List) 実装
|
- `core/box/tls_sll_box.h` - TLS SLL (Single Linked List) 実装
|
||||||
- `core/hakmem_tiny.c` - TINY allocator core
|
- `core/tiny_free_fast_v2.inc.h` - Fast free with cross-thread detection
|
||||||
|
|
||||||
### デバッグ情報
|
### デバッグ情報
|
||||||
|
|
||||||
**エラーメッセージの意味**:
|
**エラーメッセージの意味**:
|
||||||
- `TLS_SLL_NORMALIZE_USERPTR error`: User pointer から base pointer への変換失敗
|
- `TLS_SLL_NORMALIZE_USERPTR error`: User pointer から base pointer への変換失敗
|
||||||
- `TLS_SLL_PUSH_META_MISMATCH`: Metadata の class index 不一致
|
- `TLS_SLL_PUSH_META_MISMATCH`: Metadata の class index 不一致
|
||||||
|
- `FREE_FAST_HDR_META_MISMATCH`: Header と Meta の class 不一致(hdr_cls=-1 = 無効なヘッダー)
|
||||||
|
|
||||||
**予想される原因**:
|
**根本原因**:
|
||||||
- マルチスレッド環境での TLS state corruption
|
- Step 2.5 が cross-thread free されたブロックを TLS SLL から pop
|
||||||
- Class index の誤判定(cls=0 vs meta_cls=1)
|
- これらのブロックは他スレッドの SuperSlab に所属
|
||||||
- Race condition in freelist management
|
- Header restoration だけでは所有権問題を解決できない
|
||||||
|
- `HAKMEM_TINY_LARSON_FIX=1` (cross-thread detection) を有効化しても解決しない
|
||||||
|
|
||||||
**初期調査推奨コマンド**:
|
**正しい修正方法**:
|
||||||
```bash
|
1. Step 2.5 を完全に削除(`larson-fix` ブランチの状態に戻す)
|
||||||
# ThreadSanitizer で実行
|
2. または、TLS SLL に cross-thread isolation を実装
|
||||||
./build.sh debug larson_hakmem
|
|
||||||
export TSAN_OPTIONS="halt_on_error=1"
|
|
||||||
./out/debug/larson_hakmem 1 10 1 1000 100 10000 42
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@ -208,7 +221,17 @@ export HAKMEM_SUPERSLAB_PREWARM=0
|
|||||||
|
|
||||||
**結果**: **83.19 M ops/s** ✅
|
**結果**: **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 はクラッシュします。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user