#!/usr/bin/env bash set -euo pipefail # Redis-style allocator benchmark triad (System/mimalloc/HAKMEM via LD_PRELOAD) # Usage: benchmarks/scripts/run_redis_matrix.sh [threads] [cycles] [ops] [reps] ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")"/../.. && pwd)" cd "$ROOT_DIR" THREADS=${1:-1} CYCLES=${2:-100} OPS=${3:-1000} REPS=${4:-5} BENCH="./benchmarks/redis/workload_bench_system" MI_LIB_DEFAULT="mimalloc-bench/extern/mi/out/release/libmimalloc.so" MI_LIB="${MIMALLOC_SO:-$MI_LIB_DEFAULT}" if [[ ! -x "$BENCH" ]]; then echo "[error] $BENCH not found or not executable" >&2 exit 1 fi if [[ ! -f "$MI_LIB" ]]; then echo "[warn] mimalloc .so not found at $MI_LIB (set MIMALLOC_SO) — skipping mi runs" >&2 HAVE_MI=0 else HAVE_MI=1 fi # Ensure shared lib exists for HAKMEM LD_PRELOAD [[ -f ./libhakmem.so ]] || make -s shared >/dev/null || true TS=$(date +%Y%m%d_%H%M%S) OUTDIR="bench_results/auto/redis_${TS}" mkdir -p "$OUTDIR" CSV="$OUTDIR/results.csv" echo "ts,scenario,allocator,env,threads,cycles,ops,rep,throughput_ops_s" >"$CSV" extract_ops_s() { # workload_bench prints: "Throughput: 28.97 M ops/sec" # return ops/s as integer awk '/Throughput:/ {print int($2*1000000)}' | tail -n1 } run_case() { local alloc="$1"; shift local envstr="$1"; shift local rep="$2"; shift local ts=$(date +%H%M%S) local out out=$($envstr "$BENCH" -t "$THREADS" -c "$CYCLES" -o "$OPS" 2>/dev/null || true) local tput=$(echo "$out" | extract_ops_s) if [[ -n "${tput:-}" ]]; then echo "$ts,redis,$alloc,$(echo "$envstr" | sed 's/,/;/g'),$THREADS,$CYCLES,$OPS,$rep,$tput" >>"$CSV" fi } echo "[info] writing CSV to $CSV" # System for ((i=1;i<=REPS;i++)); do run_case system "env -i" "$i"; done # mimalloc if (( HAVE_MI == 1 )); then for ((i=1;i<=REPS;i++)); do run_case mimalloc "env -i LD_PRELOAD=$MI_LIB" "$i"; done fi # HAKMEM (safer LD flags for tiny-only) for ((i=1;i<=REPS;i++)); do \ run_case hakmem "env -i LD_PRELOAD=./libhakmem.so HAKMEM_WRAP_TINY=1 HAKMEM_LD_SAFE=1 HAKMEM_TINY_SUPERSLAB=0 HAKMEM_TINY_TRACE_RING=0 HAKMEM_SAFE_FREE=0" "$i"; done echo "[done] $CSV"