Files
hakmem/scripts/run_larson_defaults.sh
Moe Charm (CI) 1da8754d45 CRITICAL FIX: TLS 未初期化による 4T SEGV を完全解消
**問題:**
- Larson 4T で 100% SEGV (1T は 2.09M ops/s で完走)
- System/mimalloc は 4T で 33.52M ops/s 正常動作
- SS OFF + Remote OFF でも 4T で SEGV

**根本原因: (Task agent ultrathink 調査結果)**
```
CRASH: mov (%r15),%r13
R15 = 0x6261  ← ASCII "ba" (ゴミ値、未初期化TLS)
```

Worker スレッドの TLS 変数が未初期化:
- `__thread void* g_tls_sll_head[TINY_NUM_CLASSES];`  ← 初期化なし
- pthread_create() で生成されたスレッドでゼロ初期化されない
- NULL チェックが通過 (0x6261 != NULL) → dereference → SEGV

**修正内容:**
全 TLS 配列に明示的初期化子 `= {0}` を追加:

1. **core/hakmem_tiny.c:**
   - `g_tls_sll_head[TINY_NUM_CLASSES] = {0}`
   - `g_tls_sll_count[TINY_NUM_CLASSES] = {0}`
   - `g_tls_live_ss[TINY_NUM_CLASSES] = {0}`
   - `g_tls_bcur[TINY_NUM_CLASSES] = {0}`
   - `g_tls_bend[TINY_NUM_CLASSES] = {0}`

2. **core/tiny_fastcache.c:**
   - `g_tiny_fast_cache[TINY_FAST_CLASS_COUNT] = {0}`
   - `g_tiny_fast_count[TINY_FAST_CLASS_COUNT] = {0}`
   - `g_tiny_fast_free_head[TINY_FAST_CLASS_COUNT] = {0}`
   - `g_tiny_fast_free_count[TINY_FAST_CLASS_COUNT] = {0}`

3. **core/hakmem_tiny_magazine.c:**
   - `g_tls_mags[TINY_NUM_CLASSES] = {0}`

4. **core/tiny_sticky.c:**
   - `g_tls_sticky_ss[TINY_NUM_CLASSES][TINY_STICKY_RING] = {0}`
   - `g_tls_sticky_idx[TINY_NUM_CLASSES][TINY_STICKY_RING] = {0}`
   - `g_tls_sticky_pos[TINY_NUM_CLASSES] = {0}`

**効果:**
```
Before: 1T: 2.09M   |  4T: SEGV 💀
After:  1T: 2.41M   |  4T: 4.19M   (+15% 1T, SEGV解消)
```

**テスト:**
```bash
# 1 thread: 完走
./larson_hakmem 2 8 128 1024 1 12345 1
→ Throughput = 2,407,597 ops/s 

# 4 threads: 完走(以前は SEGV)
./larson_hakmem 2 8 128 1024 1 12345 4
→ Throughput = 4,192,155 ops/s 
```

**調査協力:** Task agent (ultrathink mode) による完璧な根本原因特定

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-07 01:27:04 +09:00

79 lines
3.9 KiB
Bash
Executable File
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.

#!/usr/bin/env bash
set -euo pipefail
# Larson defaults wrapper for HAKMEM Tiny.
# Usage:
# scripts/run_larson_defaults.sh [tput|pf] [DUR] [THREADS]
# Examples:
# scripts/run_larson_defaults.sh # 2s, threads=1,4, tput profile
# scripts/run_larson_defaults.sh pf 10 4 # 10s, threads=4, low PF profile
MODE=${1:-tput} # tput (throughput) or pf (lower page-fault/sys)
DUR=${2:-2}
THREADS_CSV=${3:-1,4}
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/.. && pwd)"
cd "$ROOT_DIR"
# Ensure binaries
[[ -x ./larson_system ]] || make -s larson_system >/dev/null
[[ -x ./larson_hakmem ]] || make -s larson_hakmem >/dev/null
# Common env for HAKMEM Tiny + Larson
export HAKMEM_LARSON_TINY_ONLY=${HAKMEM_LARSON_TINY_ONLY:-1}
export HAKMEM_LARSON=${HAKMEM_LARSON:-1}
export HAKMEM_WRAP_TINY=${HAKMEM_WRAP_TINY:-1}
export HAKMEM_DISABLE_BATCH=${HAKMEM_DISABLE_BATCH:-1}
export HAKMEM_TINY_META_ALLOC=${HAKMEM_TINY_META_ALLOC:-1}
export HAKMEM_TINY_META_FREE=${HAKMEM_TINY_META_FREE:-1}
export HAKMEM_TINY_USE_SUPERSLAB=${HAKMEM_TINY_USE_SUPERSLAB:-1}
export HAKMEM_TINY_MUST_ADOPT=${HAKMEM_TINY_MUST_ADOPT:-1}
export HAKMEM_TINY_SS_ADOPT=${HAKMEM_TINY_SS_ADOPT:-1}
export HAKMEM_TINY_TRIM_SS=${HAKMEM_TINY_TRIM_SS:-1}
# Publish→mail→adopt pipeline (fast-tier + mailbox) — defaults safe for bench
# These are critical; keep here so we never forget them.
export HAKMEM_TINY_FAST_CAP=${HAKMEM_TINY_FAST_CAP:-64}
export HAKMEM_TINY_FAST_SPARE_PERIOD=${HAKMEM_TINY_FAST_SPARE_PERIOD:-8}
export HAKMEM_TINY_TLS_LIST=${HAKMEM_TINY_TLS_LIST:-1}
# Mailbox slow discovery to avoid missed registrations in short runs
export HAKMEM_TINY_MAILBOX_SLOWDISC=${HAKMEM_TINY_MAILBOX_SLOWDISC:-1}
export HAKMEM_TINY_MAILBOX_SLOWDISC_PERIOD=${HAKMEM_TINY_MAILBOX_SLOWDISC_PERIOD:-256}
# Sukesuke (signal dump) defaults off; counters at exit only to avoid early noise
export HAKMEM_TINY_SUKESUKE=${HAKMEM_TINY_SUKESUKE:-0}
export HAKMEM_TINY_DUMP_ATEXIT_ONLY=${HAKMEM_TINY_DUMP_ATEXIT_ONLY:-1}
export HAKMEM_TINY_COUNTERS_DUMP=${HAKMEM_TINY_COUNTERS_DUMP:-1}
# Profile-specific knobs
if [[ "$MODE" == "tput" ]]; then
# Throughput-leaning defaults
export HAKMEM_TINY_SS_FORCE_LG=${HAKMEM_TINY_SS_FORCE_LG:-21} # 2MB
export HAKMEM_TINY_PUBLISH_THROTTLE=${HAKMEM_TINY_PUBLISH_THROTTLE:-8}
export HAKMEM_TINY_DRAIN_THRESHOLD=${HAKMEM_TINY_DRAIN_THRESHOLD:-4}
# Prefer mmap over adopt for raw tput until publish pipeline is proven
export HAKMEM_TINY_MUST_ADOPT=${HAKMEM_TINY_MUST_ADOPT:-0}
# SS cache/precharge ON also for tputsyscall抑制で張り付き解消を狙う
export HAKMEM_TINY_SS_CACHE=${HAKMEM_TINY_SS_CACHE:-8}
export HAKMEM_TINY_SS_PRECHARGE=${HAKMEM_TINY_SS_PRECHARGE:-1}
export HAKMEM_TINY_TRIM_SS=${HAKMEM_TINY_TRIM_SS:-0}
else
# Lower page-fault/sys defaults
export HAKMEM_TINY_SS_FORCE_LG=${HAKMEM_TINY_SS_FORCE_LG:-20} # 1MB
export HAKMEM_TINY_PUBLISH_THROTTLE=${HAKMEM_TINY_PUBLISH_THROTTLE:-8}
export HAKMEM_TINY_DRAIN_THRESHOLD=${HAKMEM_TINY_DRAIN_THRESHOLD:-4}
# Enable adopt on PF/sys profile to reduce mmap/sys
export HAKMEM_TINY_MUST_ADOPT=${HAKMEM_TINY_MUST_ADOPT:-1}
export HAKMEM_TINY_SS_CACHE=${HAKMEM_TINY_SS_CACHE:-4}
export HAKMEM_TINY_SS_PRECHARGE=${HAKMEM_TINY_SS_PRECHARGE:-1}
fi
echo "[Larson Defaults] mode=$MODE dur=$DUR threads=$THREADS_CSV"
echo "[Larson Defaults] HAKMEM_LARSON_TINY_ONLY=$HAKMEM_LARSON_TINY_ONLY HAKMEM_WRAP_TINY=$HAKMEM_WRAP_TINY"
echo "[Larson Defaults] SS_FORCE_LG=$HAKMEM_TINY_SS_FORCE_LG THROTTLE=$HAKMEM_TINY_PUBLISH_THROTTLE DRAIN=$HAKMEM_TINY_DRAIN_THRESHOLD CACHE=$HAKMEM_TINY_SS_CACHE PRECHARGE=$HAKMEM_TINY_SS_PRECHARGE"
echo "[Larson Defaults] FAST_CAP=$HAKMEM_TINY_FAST_CAP FAST_SPARE_PERIOD=$HAKMEM_TINY_FAST_SPARE_PERIOD TLS_LIST=$HAKMEM_TINY_TLS_LIST"
echo "[Larson Defaults] MAILBOX_SLOWDISC=$HAKMEM_TINY_MAILBOX_SLOWDISC PERIOD=$HAKMEM_TINY_MAILBOX_SLOWDISC_PERIOD"
# Delegate to perf runner (system/mimalloc/hakmem)
DUR=$DUR THREADS=$THREADS_CSV scripts/run_larson_perf.sh