v0.7.8 - Fully static builds implemented with musl-gcc
This commit is contained in:
269
tests/resource_monitoring.sh
Executable file
269
tests/resource_monitoring.sh
Executable file
@@ -0,0 +1,269 @@
|
||||
#!/bin/bash
|
||||
|
||||
# Resource Monitoring Suite for C-Relay
|
||||
# Monitors memory and CPU usage during testing
|
||||
|
||||
set -e
|
||||
|
||||
# Configuration
|
||||
RELAY_HOST="127.0.0.1"
|
||||
RELAY_PORT="8888"
|
||||
MONITOR_DURATION=60 # seconds
|
||||
SAMPLE_INTERVAL=2 # seconds
|
||||
|
||||
# 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 storage
|
||||
CPU_SAMPLES=()
|
||||
MEM_SAMPLES=()
|
||||
CONNECTION_SAMPLES=()
|
||||
TIMESTAMP_SAMPLES=()
|
||||
|
||||
# Function to get relay process info
|
||||
get_relay_info() {
|
||||
local pid
|
||||
pid=$(pgrep -f "c_relay" | head -1)
|
||||
|
||||
if [[ -z "$pid" ]]; then
|
||||
echo "0:0:0:0"
|
||||
return
|
||||
fi
|
||||
|
||||
# Get CPU, memory, and other stats
|
||||
local ps_output
|
||||
ps_output=$(ps -p "$pid" -o pcpu,pmem,vsz,rss --no-headers 2>/dev/null || echo "0.0 0.0 0 0")
|
||||
|
||||
# Get connection count
|
||||
local connections
|
||||
connections=$(netstat -t 2>/dev/null | grep ":$RELAY_PORT" | wc -l 2>/dev/null || echo "0")
|
||||
|
||||
echo "$ps_output $connections"
|
||||
}
|
||||
|
||||
# Function to monitor resources
|
||||
monitor_resources() {
|
||||
local duration="$1"
|
||||
local interval="$2"
|
||||
|
||||
echo "=========================================="
|
||||
echo "Resource Monitoring Started"
|
||||
echo "=========================================="
|
||||
echo "Duration: ${duration}s, Interval: ${interval}s"
|
||||
echo ""
|
||||
|
||||
# Clear arrays
|
||||
CPU_SAMPLES=()
|
||||
MEM_SAMPLES=()
|
||||
CONNECTION_SAMPLES=()
|
||||
TIMESTAMP_SAMPLES=()
|
||||
|
||||
local start_time
|
||||
start_time=$(date +%s)
|
||||
local sample_count=0
|
||||
|
||||
echo "Time | CPU% | Mem% | VSZ(KB) | RSS(KB) | Connections"
|
||||
echo "-----+------+------+---------+---------+------------"
|
||||
|
||||
while [[ $(($(date +%s) - start_time)) -lt duration ]]; do
|
||||
local relay_info
|
||||
relay_info=$(get_relay_info)
|
||||
|
||||
if [[ "$relay_info" != "0:0:0:0" ]]; then
|
||||
local cpu mem vsz rss connections
|
||||
IFS=' ' read -r cpu mem vsz rss connections <<< "$relay_info"
|
||||
|
||||
# Store samples
|
||||
CPU_SAMPLES+=("$cpu")
|
||||
MEM_SAMPLES+=("$mem")
|
||||
CONNECTION_SAMPLES+=("$connections")
|
||||
TIMESTAMP_SAMPLES+=("$sample_count")
|
||||
|
||||
# Display current stats
|
||||
local elapsed
|
||||
elapsed=$(($(date +%s) - start_time))
|
||||
printf "%4ds | %4.1f | %4.1f | %7s | %7s | %10s\n" \
|
||||
"$elapsed" "$cpu" "$mem" "$vsz" "$rss" "$connections"
|
||||
else
|
||||
echo " -- | Relay process not found --"
|
||||
fi
|
||||
|
||||
((sample_count++))
|
||||
sleep "$interval"
|
||||
done
|
||||
|
||||
echo ""
|
||||
}
|
||||
|
||||
# Function to calculate statistics
|
||||
calculate_stats() {
|
||||
local array_name="$1"
|
||||
local -n array_ref="$array_name"
|
||||
|
||||
if [[ ${#array_ref[@]} -eq 0 ]]; then
|
||||
echo "0:0:0:0:0"
|
||||
return
|
||||
fi
|
||||
|
||||
local sum=0
|
||||
local min=${array_ref[0]}
|
||||
local max=${array_ref[0]}
|
||||
|
||||
for value in "${array_ref[@]}"; do
|
||||
# Use awk for floating point arithmetic
|
||||
sum=$(awk "BEGIN {print $sum + $value}")
|
||||
min=$(awk "BEGIN {print ($value < $min) ? $value : $min}")
|
||||
max=$(awk "BEGIN {print ($value > $max) ? $value : $max}")
|
||||
done
|
||||
|
||||
local avg
|
||||
avg=$(awk "BEGIN {print $sum / ${#array_ref[@]} }")
|
||||
|
||||
echo "$avg:$min:$max:$sum:${#array_ref[@]}"
|
||||
}
|
||||
|
||||
# Function to generate resource report
|
||||
generate_resource_report() {
|
||||
echo "=========================================="
|
||||
echo "Resource Monitoring Report"
|
||||
echo "=========================================="
|
||||
|
||||
if [[ ${#CPU_SAMPLES[@]} -eq 0 ]]; then
|
||||
echo "No resource samples collected. Is the relay running?"
|
||||
return
|
||||
fi
|
||||
|
||||
# Calculate statistics
|
||||
local cpu_stats mem_stats conn_stats
|
||||
cpu_stats=$(calculate_stats CPU_SAMPLES)
|
||||
mem_stats=$(calculate_stats MEM_SAMPLES)
|
||||
conn_stats=$(calculate_stats CONNECTION_SAMPLES)
|
||||
|
||||
# Parse statistics
|
||||
IFS=':' read -r cpu_avg cpu_min cpu_max cpu_sum cpu_count <<< "$cpu_stats"
|
||||
IFS=':' read -r mem_avg mem_min mem_max mem_sum mem_count <<< "$mem_stats"
|
||||
IFS=':' read -r conn_avg conn_min conn_max conn_sum conn_count <<< "$conn_stats"
|
||||
|
||||
echo "CPU Usage Statistics:"
|
||||
printf " Average: %.2f%%\n" "$cpu_avg"
|
||||
printf " Minimum: %.2f%%\n" "$cpu_min"
|
||||
printf " Maximum: %.2f%%\n" "$cpu_max"
|
||||
printf " Samples: %d\n" "$cpu_count"
|
||||
echo ""
|
||||
|
||||
echo "Memory Usage Statistics:"
|
||||
printf " Average: %.2f%%\n" "$mem_avg"
|
||||
printf " Minimum: %.2f%%\n" "$mem_min"
|
||||
printf " Maximum: %.2f%%\n" "$mem_max"
|
||||
printf " Samples: %d\n" "$mem_count"
|
||||
echo ""
|
||||
|
||||
echo "Connection Statistics:"
|
||||
printf " Average: %.1f connections\n" "$conn_avg"
|
||||
printf " Minimum: %.1f connections\n" "$conn_min"
|
||||
printf " Maximum: %.1f connections\n" "$conn_max"
|
||||
printf " Samples: %d\n" "$conn_count"
|
||||
echo ""
|
||||
|
||||
# Performance assessment
|
||||
echo "Performance Assessment:"
|
||||
if awk "BEGIN {exit !($cpu_avg < 50)}"; then
|
||||
echo -e " ${GREEN}✓ CPU usage is acceptable${NC}"
|
||||
else
|
||||
echo -e " ${RED}✗ CPU usage is high${NC}"
|
||||
fi
|
||||
|
||||
if awk "BEGIN {exit !($mem_avg < 80)}"; then
|
||||
echo -e " ${GREEN}✓ Memory usage is acceptable${NC}"
|
||||
else
|
||||
echo -e " ${RED}✗ Memory usage is high${NC}"
|
||||
fi
|
||||
|
||||
if [[ $(awk "BEGIN {print int($conn_max)}") -gt 0 ]]; then
|
||||
echo -e " ${GREEN}✓ Relay is handling connections${NC}"
|
||||
else
|
||||
echo -e " ${YELLOW}⚠ No active connections detected${NC}"
|
||||
fi
|
||||
}
|
||||
|
||||
# Function to run load test with monitoring
|
||||
run_monitored_load_test() {
|
||||
local test_name="$1"
|
||||
local description="$2"
|
||||
|
||||
echo "=========================================="
|
||||
echo "Monitored Load Test: $test_name"
|
||||
echo "=========================================="
|
||||
echo "Description: $description"
|
||||
echo ""
|
||||
|
||||
# Start monitoring in background
|
||||
monitor_resources 30 2 &
|
||||
local monitor_pid=$!
|
||||
|
||||
# Wait a moment for monitoring to start
|
||||
sleep 2
|
||||
|
||||
# Run a simple load test (create multiple subscriptions)
|
||||
echo "Running load test..."
|
||||
for i in {1..20}; do
|
||||
timeout 3 bash -c "
|
||||
echo '[\"REQ\",\"monitor_test_'${i}'\",{}]' | websocat -B 1048576 ws://$RELAY_HOST:$RELAY_PORT >/dev/null 2>&1
|
||||
" 2>/dev/null &
|
||||
done
|
||||
|
||||
# Let the load run for a bit
|
||||
sleep 10
|
||||
|
||||
# Clean up subscriptions
|
||||
echo "Cleaning up test subscriptions..."
|
||||
for i in {1..20}; do
|
||||
timeout 3 bash -c "
|
||||
echo '[\"CLOSE\",\"monitor_test_'${i}'\"]' | websocat -B 1048576 ws://$RELAY_HOST:$RELAY_PORT >/dev/null 2>&1
|
||||
" 2>/dev/null &
|
||||
done
|
||||
|
||||
# Wait for monitoring to complete
|
||||
sleep 5
|
||||
kill "$monitor_pid" 2>/dev/null || true
|
||||
wait "$monitor_pid" 2>/dev/null || true
|
||||
|
||||
echo ""
|
||||
}
|
||||
|
||||
echo "=========================================="
|
||||
echo "C-Relay Resource Monitoring Suite"
|
||||
echo "=========================================="
|
||||
echo "Monitoring relay at ws://$RELAY_HOST:$RELAY_PORT"
|
||||
echo ""
|
||||
|
||||
# Check if relay is running
|
||||
if ! pgrep -f "c_relay" >/dev/null 2>&1; then
|
||||
echo -e "${RED}Relay process not found. Please start the relay first.${NC}"
|
||||
echo "Use: ./make_and_restart_relay.sh"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo -e "${GREEN}✓ Relay process found${NC}"
|
||||
echo ""
|
||||
|
||||
# Run baseline monitoring
|
||||
echo "=== Baseline Resource Monitoring ==="
|
||||
monitor_resources 15 2
|
||||
generate_resource_report
|
||||
echo ""
|
||||
|
||||
# Run monitored load test
|
||||
run_monitored_load_test "Subscription Load Test" "Creating and closing multiple subscriptions while monitoring resources"
|
||||
generate_resource_report
|
||||
echo ""
|
||||
|
||||
echo "=========================================="
|
||||
echo "Resource Monitoring Complete"
|
||||
echo "=========================================="
|
||||
echo "Resource monitoring completed. Review the statistics above."
|
||||
echo "High CPU/memory usage may indicate performance issues."
|
||||
Reference in New Issue
Block a user