this repo has no description
at main 3.3 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} 9MSG_RATE=${MSG_RATE:-100} 10OUTPUT_DIR="${OUTPUT_DIR:-$SCRIPT_DIR/results}" 11 12mkdir -p "$OUTPUT_DIR" 13TIMESTAMP=$(date +%Y%m%d_%H%M%S) 14RESULT_FILE="$OUTPUT_DIR/throughput_${TIMESTAMP}.json" 15 16echo "=== SWIM Throughput Benchmark Suite ===" 17echo "Nodes: $NODES" 18echo "Duration: ${DURATION}s" 19echo "Msg Rate: ${MSG_RATE} msg/s per node" 20echo "Output: $RESULT_FILE" 21echo "" 22 23cd "$SCRIPT_DIR" 24 25echo "Building Go throughput benchmarks..." 26go build -o bin/memberlist_throughput ./cmd/memberlist_throughput 2>/dev/null || { 27 echo "Warning: Failed to build memberlist throughput benchmark" 28} 29go build -o bin/serf_throughput ./cmd/serf_throughput 2>/dev/null || { 30 echo "Warning: Failed to build serf throughput benchmark" 31} 32 33echo "Building OCaml throughput benchmark..." 34cd "$PROJECT_ROOT" 35dune build bench/swim_throughput.exe 36 37echo "" 38echo "=== Running Throughput Benchmarks ===" 39echo "" 40 41RESULTS="[]" 42 43echo "[1/3] Running SWIM OCaml throughput benchmark..." 44if SWIM_RESULT=$("$SCRIPT_DIR/swim_throughput_parallel.sh" "$NODES" "$DURATION" "$MSG_RATE" 47946 "-json" 2>/dev/null); then 45 RESULTS=$(echo "$RESULTS" | jq --argjson r "$SWIM_RESULT" '. + [$r]') 46 echo " Done: $(echo "$SWIM_RESULT" | jq -r '"Throughput: \(.msgs_per_sec) msg/s"')" 47else 48 echo " Failed or skipped" 49fi 50 51echo "[2/3] Running Go memberlist throughput benchmark..." 52if [ -x "$SCRIPT_DIR/bin/memberlist_throughput" ]; then 53 if ML_RESULT=$("$SCRIPT_DIR/bin/memberlist_throughput" -nodes "$NODES" -duration "$DURATION" -rate "$MSG_RATE" -json 2>/dev/null); then 54 RESULTS=$(echo "$RESULTS" | jq --argjson r "$ML_RESULT" '. + [$r]') 55 echo " Done: $(echo "$ML_RESULT" | jq -r '"Throughput: \(.msgs_per_sec) msg/s"')" 56 else 57 echo " Failed" 58 fi 59else 60 echo " Skipped (binary not found)" 61fi 62 63echo "[3/3] Running Go Serf throughput benchmark..." 64if [ -x "$SCRIPT_DIR/bin/serf_throughput" ]; then 65 if SERF_RESULT=$("$SCRIPT_DIR/bin/serf_throughput" -nodes "$NODES" -duration "$DURATION" -rate "$MSG_RATE" -json 2>/dev/null); then 66 RESULTS=$(echo "$RESULTS" | jq --argjson r "$SERF_RESULT" '. + [$r]') 67 echo " Done: $(echo "$SERF_RESULT" | jq -r '"Throughput: \(.msgs_per_sec) msg/s"')" 68 else 69 echo " Failed" 70 fi 71else 72 echo " Skipped (binary not found)" 73fi 74 75FINAL_RESULT=$(cat <<EOF 76{ 77 "timestamp": "$(date -Iseconds)", 78 "benchmark_type": "throughput", 79 "config": { 80 "nodes": $NODES, 81 "duration_sec": $DURATION, 82 "msg_rate_per_node": $MSG_RATE 83 }, 84 "system": { 85 "hostname": "$(hostname)", 86 "os": "$(uname -s)", 87 "arch": "$(uname -m)", 88 "cpu_count": $(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1) 89 }, 90 "results": $RESULTS 91} 92EOF 93) 94 95echo "$FINAL_RESULT" | jq '.' > "$RESULT_FILE" 96 97echo "" 98echo "=== Throughput Summary ===" 99echo "" 100 101echo "$FINAL_RESULT" | jq -r ' 102 .results[] | 103 "Implementation: \(.implementation) 104 Broadcasts Sent: \(.broadcasts_sent) 105 Broadcasts Received: \(.broadcasts_received) 106 Throughput: \(.msgs_per_sec | . * 10 | round / 10) msg/s 107"' 108 109echo "Results saved to: $RESULT_FILE"