Files
hakmem/benchmarks/scripts/utils/run_usdt_overview.sh

102 lines
3.4 KiB
Bash
Raw Normal View History

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