this repo has no description
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"