this repo has no description
at main 3.1 kB view raw
1#!/bin/bash 2set -e 3 4SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" 5PROJECT_ROOT="$(dirname "$SCRIPT_DIR")" 6 7NODES=${NODES:-5} 8DURATION=${DURATION:-10} 9OUTPUT_DIR="${OUTPUT_DIR:-$SCRIPT_DIR/results}" 10 11mkdir -p "$OUTPUT_DIR" 12TIMESTAMP=$(date +%Y%m%d_%H%M%S) 13RESULT_FILE="$OUTPUT_DIR/benchmark_${TIMESTAMP}.json" 14 15echo "=== SWIM Benchmark Suite ===" 16echo "Nodes: $NODES" 17echo "Duration: ${DURATION}s" 18echo "Output: $RESULT_FILE" 19echo "" 20 21cd "$SCRIPT_DIR" 22 23echo "Building Go benchmarks..." 24go mod tidy 2>/dev/null || true 25go build -o bin/memberlist_bench ./cmd/memberlist 2>/dev/null || { 26 echo "Warning: Failed to build memberlist benchmark" 27} 28go build -o bin/serf_bench ./cmd/serf 2>/dev/null || { 29 echo "Warning: Failed to build serf benchmark" 30} 31 32echo "Building OCaml benchmark..." 33cd "$PROJECT_ROOT" 34dune build bench/swim_node.exe 35 36echo "" 37echo "=== Running Benchmarks ===" 38echo "" 39 40RESULTS="[]" 41 42echo "[1/3] Running SWIM OCaml benchmark..." 43if SWIM_RESULT=$("$SCRIPT_DIR/swim_parallel.sh" "$NODES" "$DURATION" 37946 "-json" 2>/dev/null); then 44 RESULTS=$(echo "$RESULTS" | jq --argjson r "$SWIM_RESULT" '. + [$r]') 45 echo " Done: $(echo "$SWIM_RESULT" | jq -r '.convergence_time_ns / 1e9 | "Convergence: \(.)s"')" 46else 47 echo " Failed or skipped" 48fi 49 50echo "[2/3] Running Go memberlist benchmark..." 51if [ -x "$SCRIPT_DIR/bin/memberlist_bench" ]; then 52 if ML_RESULT=$("$SCRIPT_DIR/bin/memberlist_bench" -nodes "$NODES" -duration "$DURATION" -json 2>/dev/null); then 53 RESULTS=$(echo "$RESULTS" | jq --argjson r "$ML_RESULT" '. + [$r]') 54 echo " Done: $(echo "$ML_RESULT" | jq -r '.convergence_time_ns / 1e9 | "Convergence: \(.)s"')" 55 else 56 echo " Failed" 57 fi 58else 59 echo " Skipped (binary not found)" 60fi 61 62echo "[3/3] Running Go Serf benchmark..." 63if [ -x "$SCRIPT_DIR/bin/serf_bench" ]; then 64 if SERF_RESULT=$("$SCRIPT_DIR/bin/serf_bench" -nodes "$NODES" -duration "$DURATION" -json 2>/dev/null); then 65 RESULTS=$(echo "$RESULTS" | jq --argjson r "$SERF_RESULT" '. + [$r]') 66 echo " Done: $(echo "$SERF_RESULT" | jq -r '.convergence_time_ns / 1e9 | "Convergence: \(.)s"')" 67 else 68 echo " Failed" 69 fi 70else 71 echo " Skipped (binary not found)" 72fi 73 74FINAL_RESULT=$(cat <<EOF 75{ 76 "timestamp": "$(date -Iseconds)", 77 "config": { 78 "nodes": $NODES, 79 "duration_sec": $DURATION 80 }, 81 "system": { 82 "hostname": "$(hostname)", 83 "os": "$(uname -s)", 84 "arch": "$(uname -m)", 85 "cpu_count": $(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1) 86 }, 87 "results": $RESULTS 88} 89EOF 90) 91 92echo "$FINAL_RESULT" | jq '.' > "$RESULT_FILE" 93 94echo "" 95echo "=== Summary ===" 96echo "" 97 98echo "$FINAL_RESULT" | jq -r ' 99 .results[] | 100 "Implementation: \(.implementation) 101 Convergence: \(.convergence_time_ns / 1e9 | . * 1000 | round / 1000)s 102 Memory: \(.memory_used_bytes / 1048576 | . * 100 | round / 100) MB 103 Messages: sent=\(.messages_sent // .events_received // "N/A") recv=\(.messages_received // .queries_processed // "N/A") 104"' 105 106echo "Results saved to: $RESULT_FILE"