Major Features: - Debug counter infrastructure for Refill Stage tracking - Free Pipeline counters (ss_local, ss_remote, tls_sll) - Diagnostic counters for early return analysis - Unified larson.sh benchmark runner with profiles - Phase 6-3 regression analysis documentation Bug Fixes: - Fix SuperSlab disabled by default (HAKMEM_TINY_USE_SUPERSLAB) - Fix profile variable naming consistency - Add .gitignore patterns for large files Performance: - Phase 6-3: 4.79 M ops/s (has OOM risk) - With SuperSlab: 3.13 M ops/s (+19% improvement) This is a clean repository without large log files. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
102 lines
3.4 KiB
Bash
Executable File
102 lines
3.4 KiB
Bash
Executable File
#!/usr/bin/env bash
|
|
set -euo pipefail
|
|
|
|
# Build with USDT tracepoints and run perf stat for USDT events + PMU on tiny_hot + mixed
|
|
# Usage: scripts/run_usdt_overview.sh [cycles]
|
|
|
|
ROOT_DIR=$(cd "$(dirname "$0")/.." && pwd)
|
|
# Allow overriding perf binary (e.g., WSL generic tools). Usage:
|
|
# PERF_BIN=/usr/lib/linux-tools-6.8.0-86/perf bash scripts/run_usdt_overview.sh 40000
|
|
PERF_BIN=${PERF_BIN:-perf}
|
|
cd "$ROOT_DIR"
|
|
|
|
cycles=${1:-50000}
|
|
|
|
if [[ "${SKIP_BUILD:-0}" != "1" ]]; then
|
|
echo "[build] USDT-enabled benches"
|
|
make -s clean >/dev/null 2>&1 || true
|
|
make -s bench_fast CFLAGS+=" -DHAKMEM_USDT=1" >/dev/null
|
|
else
|
|
echo "[build] skipped (SKIP_BUILD=1)"
|
|
fi
|
|
|
|
TS=$(date +%Y%m%d_%H%M%S)
|
|
OUTDIR="bench_results/usdt_${TS}"
|
|
mkdir -p "$OUTDIR"
|
|
|
|
EVENTS_USDT=(
|
|
sdt:hakmem:sll_pop
|
|
sdt:hakmem:mag_pop
|
|
sdt:hakmem:front_pop
|
|
sdt:hakmem:bump_hit
|
|
sdt:hakmem:slow_alloc
|
|
sdt:hakmem:sll_push
|
|
sdt:hakmem:mag_push
|
|
sdt:hakmem:spill_super
|
|
sdt:hakmem:spill_tiny
|
|
sdt:hakmem:remote_drain
|
|
sdt:hakmem:superslab_alloc
|
|
sdt:hakmem:superslab_fail
|
|
)
|
|
EVENTS_PMU=(cycles,instructions,L1-dcache-load-misses,branch-misses)
|
|
|
|
join_events() {
|
|
local IFS=','; echo "$*"
|
|
}
|
|
|
|
PMU_JOINED=$(join_events "${EVENTS_PMU[@]}" )
|
|
|
|
# Detect USDT availability by actually probing a dummy run
|
|
USDT_JOINED=""
|
|
{
|
|
"$PERF_BIN" stat -x , -e sdt:hakmem:front_pop true 1>/dev/null 2>"$OUTDIR/.usdt_probe.err"
|
|
} || true
|
|
if rg -q "unknown tracepoint" "$OUTDIR/.usdt_probe.err"; then
|
|
echo "[warn] perf does not support 'sdt:' on this system (unknown tracepoint). Using PMU-only." | tee -a "$OUTDIR/summary.txt"
|
|
echo "[hint] Install perf matching your kernel: sudo apt-get install linux-tools-\$(uname -r)" | tee -a "$OUTDIR/summary.txt"
|
|
echo "[hint] Kernel must have UPROBE/SDT support (CONFIG_UPROBE_EVENTS)." | tee -a "$OUTDIR/summary.txt"
|
|
elif rg -q "can't access trace events|No permissions" "$OUTDIR/.usdt_probe.err"; then
|
|
echo "[warn] USDT blocked by tracefs perms; falling back to PMU-only." | tee -a "$OUTDIR/summary.txt"
|
|
echo "[hint] Try: sudo mount -t tracefs -o mode=755 nodev /sys/kernel/tracing" | tee -a "$OUTDIR/summary.txt"
|
|
echo "[hint] And: sudo sysctl kernel.perf_event_paranoid=1" | tee -a "$OUTDIR/summary.txt"
|
|
else
|
|
# Looks good; enable USDT events
|
|
USDT_JOINED=$(join_events "${EVENTS_USDT[@]}")
|
|
fi
|
|
|
|
# Basic environment info for troubleshooting
|
|
{
|
|
echo "[env] perf=$($PERF_BIN --version 2>/dev/null | head -n1)";
|
|
echo "[env] kernel=$(uname -r)";
|
|
echo "[env] tracefs=$(ls -ld /sys/kernel/tracing 2>/dev/null || true)";
|
|
} | tee -a "$OUTDIR/summary.txt"
|
|
|
|
run_perf() {
|
|
local tag="$1"; shift
|
|
local bin="$1"; shift
|
|
local size="$1"; shift
|
|
local batch="$1"; shift
|
|
local cyc="$1"; shift
|
|
local log="$OUTDIR/${tag}_s${size}_b${batch}_c${cyc}.stat.csv"
|
|
echo "[perf] $tag size=$size batch=$batch cycles=$cyc" | tee -a "$OUTDIR/summary.txt"
|
|
if [[ -n "$USDT_JOINED" ]]; then
|
|
"$PERF_BIN" stat -x , -e "$USDT_JOINED","$PMU_JOINED" "$bin" "$size" "$batch" "$cyc" 1>/dev/null 2>"$log" || true
|
|
else
|
|
"$PERF_BIN" stat -x , -e "$PMU_JOINED" "$bin" "$size" "$batch" "$cyc" 1>/dev/null 2>"$log" || true
|
|
fi
|
|
}
|
|
|
|
# Tiny-hot focus (8/16/32/64)
|
|
for s in 8 16 32 64; do
|
|
for b in 100; do
|
|
HAKMEM_QUIET=1 run_perf "hakmem" ./bench_tiny_hot_hakmem "$s" "$b" "$cycles"
|
|
HAKMEM_QUIET=1 run_perf "system" ./bench_tiny_hot_system "$s" "$b" "$cycles"
|
|
done
|
|
done
|
|
|
|
# Random mixed overview
|
|
bash scripts/run_random_mixed_matrix.sh 80000 >/dev/null || true
|
|
|
|
echo "[done] USDT overview: $OUTDIR"
|
|
ls -1 "$OUTDIR" | sed -n '1,20p'
|