this repo has no description
at main 3.0 kB view raw
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