Files
c-relay/tests/load_tests.sh

239 lines
7.3 KiB
Bash
Executable File

#!/bin/bash
# Load Testing Suite for C-Relay
# Tests high concurrent connection scenarios and performance under load
set -e
# Configuration
RELAY_HOST="127.0.0.1"
RELAY_PORT="8888"
TEST_DURATION=30 # seconds
CONCURRENT_CONNECTIONS=50
MESSAGES_PER_SECOND=100
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# Metrics tracking
TOTAL_CONNECTIONS=0
SUCCESSFUL_CONNECTIONS=0
FAILED_CONNECTIONS=0
TOTAL_MESSAGES_SENT=0
TOTAL_MESSAGES_RECEIVED=0
START_TIME=""
END_TIME=""
# Function to run a single client connection
run_client() {
local client_id="$1"
local messages_to_send="${2:-10}"
local messages_sent=0
local messages_received=0
local connection_successful=false
# Create a temporary file for this client's output
local temp_file
temp_file=$(mktemp)
# Send messages and collect responses
(
for i in $(seq 1 "$messages_to_send"); do
echo '["REQ","load_test_'"$client_id"'_'"$i"'",{}]'
# Small delay to avoid overwhelming
sleep 0.01
done
# Send CLOSE message
echo '["CLOSE","load_test_'"$client_id"'_*"]'
) | timeout 30 websocat -B 1048576 "ws://$RELAY_HOST:$RELAY_PORT" > "$temp_file" 2>/dev/null
local exit_code=$?
# Check if connection was successful (exit code 0 means successful)
if [[ $exit_code -eq 0 ]]; then
connection_successful=true
fi
# Count messages sent
messages_sent=$messages_to_send
# Count responses received (rough estimate)
local response_count
response_count=$(grep -c "EOSE\|EVENT\|NOTICE" "$temp_file" 2>/dev/null || echo "0")
# Clean up temp file
rm -f "$temp_file"
# Return results
echo "$messages_sent:$response_count:$connection_successful"
}
# Function to monitor system resources
monitor_resources() {
local duration="$1"
local interval="${2:-1}"
echo "=== Resource Monitoring ==="
echo "Monitoring system resources for ${duration}s..."
local start_time
start_time=$(date +%s)
while [[ $(($(date +%s) - start_time)) -lt duration ]]; do
# Get CPU and memory usage
local cpu_usage
cpu_usage=$(top -bn1 | grep "Cpu(s)" | sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | awk '{print 100 - $1}')
local mem_usage
mem_usage=$(free | grep Mem | awk '{printf "%.2f", $3/$2 * 100.0}')
# Get network connections
local connections
connections=$(netstat -t | grep -c ":$RELAY_PORT")
echo "$(date '+%H:%M:%S') - CPU: ${cpu_usage}%, MEM: ${mem_usage}%, Connections: $connections"
sleep "$interval"
done
}
# Function to run load test
run_load_test() {
local test_name="$1"
local description="$2"
local concurrent_clients="$3"
local messages_per_client="$4"
echo "=========================================="
echo "Load Test: $test_name"
echo "Description: $description"
echo "Concurrent clients: $concurrent_clients"
echo "Messages per client: $messages_per_client"
echo "=========================================="
START_TIME=$(date +%s)
# Reset counters
SUCCESSFUL_CONNECTIONS=0
FAILED_CONNECTIONS=0
TOTAL_MESSAGES_SENT=0
TOTAL_MESSAGES_RECEIVED=0
# Launch clients sequentially for now (simpler debugging)
local client_results=()
echo "Launching $concurrent_clients clients..."
for i in $(seq 1 "$concurrent_clients"); do
local result
result=$(run_client "$i" "$messages_per_client")
client_results+=("$result")
TOTAL_CONNECTIONS=$((TOTAL_CONNECTIONS + 1))
done
echo "All clients completed. Processing results..."
END_TIME=$(date +%s)
local duration=$((END_TIME - START_TIME))
# Process client results
local successful_connections=0
local failed_connections=0
local total_messages_sent=0
local total_messages_received=0
for result in "${client_results[@]}"; do
messages_sent=$(echo "$result" | cut -d: -f1)
messages_received=$(echo "$result" | cut -d: -f2)
connection_successful=$(echo "$result" | cut -d: -f3)
if [[ "$connection_successful" == "true" ]]; then
successful_connections=$((successful_connections + 1))
else
failed_connections=$((failed_connections + 1))
fi
total_messages_sent=$((total_messages_sent + messages_sent))
total_messages_received=$((total_messages_received + messages_received))
done
# Calculate metrics
local total_messages_expected=$((concurrent_clients * messages_per_client))
local connection_success_rate=0
if [[ $TOTAL_CONNECTIONS -gt 0 ]]; then
connection_success_rate=$((successful_connections * 100 / TOTAL_CONNECTIONS))
fi
# Report results
echo ""
echo "=== Load Test Results ==="
echo "Test duration: ${duration}s"
echo "Total connections attempted: $TOTAL_CONNECTIONS"
echo "Successful connections: $successful_connections"
echo "Failed connections: $failed_connections"
echo "Connection success rate: ${connection_success_rate}%"
echo "Messages expected: $total_messages_expected"
echo "Messages sent: $total_messages_sent"
echo "Messages received: $total_messages_received"
# Performance assessment
if [[ $connection_success_rate -ge 95 ]]; then
echo -e "${GREEN}✓ EXCELLENT: High connection success rate${NC}"
elif [[ $connection_success_rate -ge 80 ]]; then
echo -e "${YELLOW}⚠ GOOD: Acceptable connection success rate${NC}"
else
echo -e "${RED}✗ POOR: Low connection success rate${NC}"
fi
# Check if relay is still responsive
echo ""
echo -n "Checking relay responsiveness... "
if echo 'ping' | timeout 5 websocat -B 1048576 ws://$RELAY_HOST:$RELAY_PORT >/dev/null 2>&1; then
echo -e "${GREEN}✓ Relay is still responsive${NC}"
else
echo -e "${RED}✗ Relay became unresponsive after load test${NC}"
return 1
fi
}
# Only run main code if script is executed directly (not sourced)
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
echo "=========================================="
echo "C-Relay Load Testing Suite"
echo "=========================================="
echo "Testing against relay at ws://$RELAY_HOST:$RELAY_PORT"
echo ""
# Test basic connectivity first
echo "=== Basic Connectivity Test ==="
if echo 'ping' | timeout 5 websocat -B 1048576 ws://$RELAY_HOST:$RELAY_PORT >/dev/null 2>&1; then
echo -e "${GREEN}✓ Relay is accessible${NC}"
else
echo -e "${RED}✗ Cannot connect to relay. Aborting tests.${NC}"
exit 1
fi
echo ""
# Run different load scenarios
run_load_test "Light Load Test" "Basic load test with moderate concurrent connections" 10 5
echo ""
run_load_test "Medium Load Test" "Moderate load test with higher concurrency" 25 10
echo ""
run_load_test "Heavy Load Test" "Heavy load test with high concurrency" 50 20
echo ""
run_load_test "Stress Test" "Maximum load test to find breaking point" 100 50
echo ""
echo "=========================================="
echo "Load Testing Complete"
echo "=========================================="
echo "All load tests completed. Check individual test results above."
echo "If any tests failed, the relay may need optimization or have resource limits."
fi