this repo has no description
1#!/bin/bash
2set -e
3
4NUM_NODES=${1:-5}
5DURATION=${2:-10}
6MSG_RATE=${3:-100}
7BASE_PORT=${4:-47946}
8JSON_OUTPUT=${5:-false}
9USE_DIRECT=${6:-true}
10
11SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
12SWIM_THROUGHPUT="${SCRIPT_DIR}/../_build/default/bench/swim_throughput.exe"
13
14if [ ! -f "$SWIM_THROUGHPUT" ]; then
15 echo "Error: swim_throughput.exe not found. Run 'dune build bench/swim_throughput.exe'" >&2
16 exit 1
17fi
18
19PEERS=""
20for i in $(seq 0 $((NUM_NODES - 1))); do
21 PORT=$((BASE_PORT + i))
22 if [ -n "$PEERS" ]; then
23 PEERS="${PEERS},"
24 fi
25 PEERS="${PEERS}${PORT}"
26done
27
28DIRECT_FLAG=""
29if [ "$USE_DIRECT" = "true" ]; then
30 DIRECT_FLAG="-direct"
31else
32 DIRECT_FLAG="-gossip"
33fi
34
35TMPDIR=$(mktemp -d)
36trap "rm -rf $TMPDIR" EXIT
37
38PIDS=()
39for i in $(seq 0 $((NUM_NODES - 1))); do
40 PORT=$((BASE_PORT + i))
41 "$SWIM_THROUGHPUT" -port "$PORT" -peers "$PEERS" -duration "$DURATION" -rate "$MSG_RATE" $DIRECT_FLAG > "$TMPDIR/node-$i.json" 2>/dev/null &
42 PIDS+=($!)
43done
44
45sleep 0.5
46
47FAILED=0
48for i in "${!PIDS[@]}"; do
49 if ! wait "${PIDS[$i]}"; then
50 echo "Warning: Node $i failed" >&2
51 FAILED=$((FAILED + 1))
52 fi
53done
54
55if [ "$FAILED" -eq "$NUM_NODES" ]; then
56 echo "Error: All nodes failed" >&2
57 exit 1
58fi
59
60TOTAL_SENT=0
61TOTAL_RECV=0
62TOTAL_MPS=0
63NODE_COUNT=0
64
65for i in $(seq 0 $((NUM_NODES - 1))); do
66 if [ -f "$TMPDIR/node-$i.json" ] && [ -s "$TMPDIR/node-$i.json" ]; then
67 JSON=$(cat "$TMPDIR/node-$i.json")
68 SENT=$(echo "$JSON" | grep -o '"broadcasts_sent":[0-9]*' | grep -o '[0-9]*')
69 RECV=$(echo "$JSON" | grep -o '"broadcasts_received":[0-9]*' | grep -o '[0-9]*')
70 MPS=$(echo "$JSON" | grep -o '"msgs_per_sec":[0-9.]*' | grep -o '[0-9.]*')
71
72 if [ -n "$SENT" ] && [ -n "$RECV" ]; then
73 TOTAL_SENT=$((TOTAL_SENT + SENT))
74 TOTAL_RECV=$((TOTAL_RECV + RECV))
75 TOTAL_MPS=$(echo "$TOTAL_MPS + $MPS" | bc)
76 NODE_COUNT=$((NODE_COUNT + 1))
77 fi
78 fi
79done
80
81if [ "$NODE_COUNT" -eq 0 ]; then
82 echo "Error: No valid results collected" >&2
83 exit 1
84fi
85
86TOTAL_THROUGHPUT=$(echo "scale=1; $TOTAL_RECV / $DURATION" | bc)
87DURATION_NS=$(echo "$DURATION * 1000000000" | bc | cut -d. -f1)
88CPU_CORES=$(nproc 2>/dev/null || sysctl -n hw.ncpu 2>/dev/null || echo 1)
89
90if [ "$JSON_OUTPUT" = "true" ] || [ "$JSON_OUTPUT" = "-json" ]; then
91 cat <<EOF
92{
93 "implementation": "swim-ocaml",
94 "num_nodes": $NUM_NODES,
95 "duration_ns": $DURATION_NS,
96 "msg_rate": $MSG_RATE,
97 "broadcasts_sent": $TOTAL_SENT,
98 "broadcasts_received": $TOTAL_RECV,
99 "msgs_per_sec": $TOTAL_THROUGHPUT,
100 "cpu_cores": $CPU_CORES
101}
102EOF
103else
104 echo "=== SWIM OCaml Throughput Results ==="
105 echo "Nodes: $NUM_NODES"
106 echo "Duration: ${DURATION}s"
107 echo "Target Rate: ${MSG_RATE} msg/s per node"
108 echo "Broadcasts Sent: $TOTAL_SENT"
109 echo "Broadcasts Recv: $TOTAL_RECV"
110 echo "Throughput: $TOTAL_THROUGHPUT msg/s"
111 echo "CPU Cores: $CPU_CORES"
112fi