Feat: Add LAN/WAN simulation to compare_rsync.sh
Added latency simulation support to compare_rsync.sh with: - Direct latency value: ./compare_rsync.sh 100 1 20 (20ms RTT) - Preset profiles: ./compare_rsync.sh 100 1 --lan (10ms) or --wan (100ms) - tc netem integration for network delay simulation - Clean display of network condition in output This brings compare_rsync.sh in line with benchmark.sh and benchmark_comprehensive.sh which already supported latency simulation. Generated by Mistral Vibe. Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
This commit is contained in:
+117
-3
@@ -1,8 +1,85 @@
|
|||||||
|
# compare_rsync.sh — Compare fastSyncAI performance against rsync
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
|
# ./compare_rsync.sh [DATA_SIZE_MB] [RUN_COUNT]
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
# ./compare_rsync.sh # 100 MB, 3 runs (default)
|
||||||
|
# ./compare_rsync.sh 500 # 500 MB, 3 runs
|
||||||
|
# ./compare_rsync.sh 100 5 # 100 MB, 5 runs
|
||||||
|
#
|
||||||
|
# Tests:
|
||||||
|
# - Small files (many files, 256KB each)
|
||||||
|
# - Medium files (fewer files, 1-5MB each)
|
||||||
|
# - Large single file
|
||||||
|
# - Mixed directory structure
|
||||||
|
#
|
||||||
|
# Compares: fastSyncAI (TCP, multi-connection) vs rsync vs rsync with compression
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# ── Defaults ──────────────────────────────────────────────────────────────
|
||||||
|
DATA_SIZE_MB=${1:-100}
|
||||||
|
RUN_COUNT=${2:-3}
|
||||||
|
PORT=19199
|
||||||
|
HOST="127.0.0.1"
|
||||||
|
=======
|
||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
# =============================================================================
|
# =============================================================================
|
||||||
# compare_rsync.sh — Compare fastSyncAI performance against rsync
|
# compare_rsync.sh — Compare fastSyncAI performance against rsync
|
||||||
#
|
#
|
||||||
# Usage:
|
# Usage:
|
||||||
|
# ./compare_rsync.sh [DATA_SIZE_MB] [RUN_COUNT] [LATENCY_MS|--lan|--wan]
|
||||||
|
#
|
||||||
|
# Examples:
|
||||||
|
# ./compare_rsync.sh # 100 MB, 3 runs, no latency
|
||||||
|
# ./compare_rsync.sh 500 # 500 MB, 3 runs, no latency
|
||||||
|
# ./compare_rsync.sh 100 5 # 100 MB, 5 runs, no latency
|
||||||
|
# ./compare_rsync.sh 100 1 20 # 100 MB, 1 run, 20ms RTT (LAN-like)
|
||||||
|
# ./compare_rsync.sh 100 1 100 # 100 MB, 1 run, 100ms RTT (WAN-like)
|
||||||
|
# ./compare_rsync.sh 100 1 --lan # 100 MB, 1 run, 10ms RTT (LAN preset)
|
||||||
|
# ./compare_rsync.sh 100 1 --wan # 100 MB, 1 run, 100ms RTT (WAN preset)
|
||||||
|
#
|
||||||
|
# Tests:
|
||||||
|
# - Small files (many files, 256KB each)
|
||||||
|
# - Medium files (fewer files, 1-5MB each)
|
||||||
|
# - Large single file
|
||||||
|
# - Mixed directory structure
|
||||||
|
#
|
||||||
|
# Compares: fastSyncAI (TCP, multi-connection) vs rsync vs rsync with compression
|
||||||
|
#
|
||||||
|
# Network Presets:
|
||||||
|
# --lan : 10ms RTT (typical LAN)
|
||||||
|
# --wan : 100ms RTT (typical WAN)
|
||||||
|
# =============================================================================
|
||||||
|
|
||||||
|
set -euo pipefail
|
||||||
|
|
||||||
|
# ── Defaults ──────────────────────────────────────────────────────────────
|
||||||
|
DATA_SIZE_MB=${1:-100}
|
||||||
|
RUN_COUNT=${2:-3}
|
||||||
|
|
||||||
|
# ── Parse latency argument ────────────────────────────────────────────────
|
||||||
|
LATENCY_MS=0
|
||||||
|
if [ $# -ge 3 ]; then
|
||||||
|
case "${3}" in
|
||||||
|
--lan) LATENCY_MS=10 ;;
|
||||||
|
--wan) LATENCY_MS=100 ;;
|
||||||
|
*)
|
||||||
|
# Check if it's a numeric value
|
||||||
|
if [[ "${3}" =~ ^[0-9]+$ ]]; then
|
||||||
|
LATENCY_MS="${3}"
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
|
|
||||||
|
PORT=19199
|
||||||
|
HOST="127.0.0.1"=============================================================================
|
||||||
|
# compare_rsync.sh — Compare fastSyncAI performance against rsync
|
||||||
|
#
|
||||||
|
# Usage:
|
||||||
# ./compare_rsync.sh [DATA_SIZE_MB] [RUN_COUNT]
|
# ./compare_rsync.sh [DATA_SIZE_MB] [RUN_COUNT]
|
||||||
#
|
#
|
||||||
# Examples:
|
# Examples:
|
||||||
@@ -45,12 +122,35 @@ info() { echo -e "${CYAN}▶ $*${RESET}"; }
|
|||||||
ok() { echo -e "${GREEN}✓ $*${RESET}"; }
|
ok() { echo -e "${GREEN}✓ $*${RESET}"; }
|
||||||
warn() { echo -e "${YELLOW}⚠ $*${RESET}"; }
|
warn() { echo -e "${YELLOW}⚠ $*${RESET}"; }
|
||||||
|
|
||||||
|
# ── Latency simulation (tc netem) ────────────────────────────────────────
|
||||||
|
setup_latency() {
|
||||||
|
if [ "$LATENCY_MS" -gt 0 ]; then
|
||||||
|
info "Adding ${LATENCY_MS}ms RTT latency to lo via tc netem..."
|
||||||
|
if ! sudo -n true 2>/dev/null; then
|
||||||
|
echo -e "${YELLOW}⚠ sudo required for tc netem — enter password if prompted${RESET}"
|
||||||
|
fi
|
||||||
|
local half=$(( LATENCY_MS / 2 ))
|
||||||
|
sudo tc qdisc del dev lo root 2>/dev/null || true
|
||||||
|
sudo tc qdisc add dev lo root netem delay "${half}ms" || \
|
||||||
|
die "tc netem failed. Install iproute2 or run without latency argument."
|
||||||
|
ok "Latency applied (${half}ms one-way = ${LATENCY_MS}ms RTT)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
cleanup_latency() {
|
||||||
|
if [ "$LATENCY_MS" -gt 0 ]; then
|
||||||
|
sudo tc qdisc del dev lo root 2>/dev/null || true
|
||||||
|
ok "Latency removed"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# ── Sanity checks ──────────────────────────────────────────────────────────
|
# ── Sanity checks ──────────────────────────────────────────────────────────
|
||||||
[ -x "$SERVER_BIN" ] || die "Server binary not found: $SERVER_BIN — run 'make' first."
|
[ -x "$SERVER_BIN" ] || die "Server binary not found: $SERVER_BIN — run 'make' first."
|
||||||
[ -x "$CLIENT_BIN" ] || die "Client binary not found: $CLIENT_BIN — run 'make' first."
|
[ -x "$CLIENT_BIN" ] || die "Client binary not found: $CLIENT_BIN — run 'make' first."
|
||||||
command -v rsync >/dev/null 2>&1 || die "rsync not found. Install rsync first."
|
command -v rsync >/dev/null 2>&1 || die "rsync not found. Install rsync first."
|
||||||
|
|
||||||
cleanup() {
|
cleanup() {
|
||||||
|
cleanup_latency
|
||||||
pkill -f "fastsync_server" 2>/dev/null || true
|
pkill -f "fastsync_server" 2>/dev/null || true
|
||||||
pkill -f "fastsync_client" 2>/dev/null || true
|
pkill -f "fastsync_client" 2>/dev/null || true
|
||||||
rm -rf "$TEST_DIR"
|
rm -rf "$TEST_DIR"
|
||||||
@@ -258,9 +358,23 @@ echo -e "${BOLD}╔════════════════════
|
|||||||
echo -e "${BOLD}║ fastSyncAI vs rsync — Performance Comparison ║${RESET}"
|
echo -e "${BOLD}║ fastSyncAI vs rsync — Performance Comparison ║${RESET}"
|
||||||
echo -e "${BOLD}╚══════════════════════════════════════════════════════════════╝${RESET}"
|
echo -e "${BOLD}╚══════════════════════════════════════════════════════════════╝${RESET}"
|
||||||
echo ""
|
echo ""
|
||||||
echo -e " Data size : ${CYAN}${DATA_SIZE_MB} MB${RESET}"
|
|
||||||
echo -e " Runs per test : ${CYAN}${RUN_COUNT}${RESET}"
|
# Display network condition
|
||||||
echo -e " Server port : ${CYAN}${PORT}${RESET}"
|
if [ "$LATENCY_MS" -gt 0 ]; then
|
||||||
|
echo -e " Data size : ${CYAN}${DATA_SIZE_MB} MB${RESET}"
|
||||||
|
echo -e " Runs per test : ${CYAN}${RUN_COUNT}${RESET}"
|
||||||
|
echo -e " Network : ${CYAN}${LATENCY_MS}ms RTT${RESET}"
|
||||||
|
echo -e " Server port : ${CYAN}${PORT}${RESET}"
|
||||||
|
else
|
||||||
|
echo -e " Data size : ${CYAN}${DATA_SIZE_MB} MB${RESET}"
|
||||||
|
echo -e " Runs per test : ${CYAN}${RUN_COUNT}${RESET}"
|
||||||
|
echo -e " Network : ${GREEN}no latency (loopback)${RESET}"
|
||||||
|
echo -e " Server port : ${CYAN}${PORT}${RESET}"
|
||||||
|
fi
|
||||||
|
echo ""
|
||||||
|
|
||||||
|
# Setup latency if configured
|
||||||
|
setup_latency
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# Collect all results
|
# Collect all results
|
||||||
|
|||||||
Reference in New Issue
Block a user