diff --git a/kernel-desktop-bench.sh b/kernel-desktop-bench.sh new file mode 100755 index 0000000..ffce253 --- /dev/null +++ b/kernel-desktop-bench.sh @@ -0,0 +1,69 @@ +#!/usr/bin/env bash +set -euo pipefail + +need() { command -v "$1" >/dev/null 2>&1; } + +OUTDIR="kernel-bench-$(uname -r)-$(date +%F-%H%M%S)" +mkdir -p "$OUTDIR" + +log() { echo "== $1 ==" | tee -a "$OUTDIR/summary.txt"; } + +echo "Kernel benchmark started at $(date)" | tee "$OUTDIR/summary.txt" + +log "KERNEL INFO" +uname -a | tee "$OUTDIR/kernel.txt" +cat /proc/cmdline | tee "$OUTDIR/cmdline.txt" + +log "CPU GOVERNOR / FREQ" +if need cpupower; then + cpupower frequency-info | tee "$OUTDIR/cpufreq.txt" +else + echo "cpupower not found (add nixpkgs#linuxPackages.cpupower)" | tee "$OUTDIR/cpufreq.txt" +fi + +log "KCONFIG (LTO / AMD_PSTATE)" +if [ -e /proc/config.gz ]; then + zgrep -E "LTO|THINLTO|AMD_PSTATE" /proc/config.gz | + tee "$OUTDIR/kconfig.txt" || true +else + echo "No /proc/config.gz found" | tee "$OUTDIR/kconfig.txt" +fi + +log "CYCLICTEST (LATENCY TAIL)" +if need cyclictest; then + cyclictest -p95 -m -Sp90 -i200 -l100000 | tee "$OUTDIR/cyclictest.txt" +else + echo "cyclictest not found (add nixpkgs#rt-tests)" | tee "$OUTDIR/cyclictest.txt" +fi + +log "SCHEDULER LATENCY UNDER LOAD" +if need stress-ng && need perf; then + stress-ng --cpu "$(nproc)" --cpu-method matrix & + STRESS_PID=$! + sleep 2 + perf sched record -- sleep 10 + perf sched latency | tee "$OUTDIR/perf-sched.txt" + kill "$STRESS_PID" || true +else + echo "missing stress-ng and/or perf (add nixpkgs#stress-ng nixpkgs#linuxPackages.perf)" | + tee "$OUTDIR/perf-sched.txt" +fi + +log "SYSCALL / BRANCH BEHAVIOR" +if need perf; then + perf stat -e cycles,instructions,branches,branch-misses \ + ls -R /usr >/dev/null 2>"$OUTDIR/perf-stat.txt" +else + echo "perf not found (add nixpkgs#linuxPackages.perf)" | tee "$OUTDIR/perf-stat.txt" +fi + +log "POWER / FREQ SNAPSHOT (turbostat)" +if need turbostat; then + turbostat --Summary --interval 1 --num_iterations 5 | tee "$OUTDIR/turbostat.txt" +else + echo "turbostat not found (OK to skip). If you want it, try nixpkgs#linuxPackages.turbostat" | + tee "$OUTDIR/turbostat.txt" +fi + +log "DONE" +echo "Results saved in $OUTDIR" | tee -a "$OUTDIR/summary.txt"