#!/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'