Files
MasterHttpRelayVPN-RUST/scripts/bench-pipeline.sh
T
yyoyoian-pixel 919b13b166 feat(tunnel): pipelined polls with adaptive depth, wseq ordering, STUN blocking (#1115)
feat(tunnel): pipelined full-tunnel polls, ordered writes, and STUN blocking

Merged trusted PR #1115 by @yyoyoian-pixel after local verification and a small maintainer fix on the PR branch.

---
Answered via LLM, Supervised @therealaleph
2026-05-16 17:46:08 +03:00

141 lines
4.8 KiB
Bash
Executable File

#!/usr/bin/env bash
#
# bench-pipeline.sh — compare throughput: serial (depth=1) vs pipelined (depth=10)
#
# Builds mhrv-rs twice (patching the INFLIGHT_ACTIVE constant), runs each
# as a local SOCKS5 proxy, downloads through the full tunnel, reports.
#
# Usage:
# ./scripts/bench-pipeline.sh [CONFIG_FILE]
#
# Default: config.json
set -euo pipefail
CONFIG="${1:-config.json}"
RUNS=3
SOCKS_PORT=18088
HTTP_PORT=18087
TEST_URL="https://speed.cloudflare.com/__down?bytes=5000000"
SRC="src/tunnel_client.rs"
TMPDIR_BENCH=$(mktemp -d)
cleanup() {
rm -rf "$TMPDIR_BENCH"
kill $PROXY_PID 2>/dev/null || true
# Restore original constant
sed -i '' "s/^const INFLIGHT_ACTIVE: usize = [0-9]*/const INFLIGHT_ACTIVE: usize = 10/" "$SRC" 2>/dev/null || true
}
trap cleanup EXIT
if [ ! -f "$CONFIG" ]; then
echo "ERROR: Config not found: $CONFIG"
exit 1
fi
echo "╔══════════════════════════════════════════════╗"
echo "║ Pipeline Throughput Benchmark ║"
echo "╠══════════════════════════════════════════════╣"
echo "║ Config: $CONFIG"
echo "║ Test URL: $TEST_URL"
echo "║ Runs: $RUNS per mode"
echo "╚══════════════════════════════════════════════╝"
echo ""
# Write a temp config with our ports
TEMP_CONFIG="$TMPDIR_BENCH/config.json"
python3 -c "
import json
with open('$CONFIG') as f:
c = json.load(f)
c['listen_port'] = $HTTP_PORT
c['socks5_port'] = $SOCKS_PORT
c['log_level'] = 'warn'
with open('$TEMP_CONFIG', 'w') as f:
json.dump(c, f)
"
run_test() {
local label="$1"
local binary="$2"
echo "━━━ $label ━━━"
$binary -c "$TEMP_CONFIG" &
PROXY_PID=$!
sleep 3
if ! kill -0 $PROXY_PID 2>/dev/null; then
echo " ERROR: Proxy failed to start"
return
fi
# Wait for proxy
for attempt in $(seq 1 15); do
if curl -s --socks5-hostname localhost:$SOCKS_PORT --connect-timeout 5 -o /dev/null https://www.google.com 2>/dev/null; then
break
fi
sleep 1
done
local total_bytes=0
local total_time=0
for i in $(seq 1 $RUNS); do
local result
result=$(curl -s --socks5-hostname localhost:$SOCKS_PORT \
-o /dev/null \
-w '%{size_download} %{time_total} %{speed_download}' \
--connect-timeout 30 \
--max-time 90 \
"$TEST_URL" 2>/dev/null || echo "0 999 0")
local bytes time_s speed
bytes=$(echo "$result" | awk '{print $1}')
time_s=$(echo "$result" | awk '{print $2}')
speed=$(echo "$result" | awk '{printf "%.0f", $3/1024}')
total_bytes=$((total_bytes + ${bytes%.*}))
total_time=$(echo "$total_time + $time_s" | bc)
printf " Run %d: %.1fs %s KB/s\n" "$i" "$time_s" "$speed"
done
local avg_speed avg_time
avg_speed=$(echo "scale=1; $total_bytes / $total_time / 1024" | bc 2>/dev/null || echo "0")
avg_time=$(echo "scale=1; $total_time / $RUNS" | bc 2>/dev/null || echo "0")
printf " ➜ Average: %s KB/s (%.1fs per download)\n\n" "$avg_speed" "$avg_time"
kill $PROXY_PID 2>/dev/null || true
wait $PROXY_PID 2>/dev/null || true
sleep 1
echo "$label|$avg_speed|$avg_time" >> "$TMPDIR_BENCH/results.txt"
}
# Build serial (depth=1)
echo "Building serial mode (INFLIGHT_ACTIVE=1)..."
sed -i '' "s/^const INFLIGHT_ACTIVE: usize = [0-9]*/const INFLIGHT_ACTIVE: usize = 1/" "$SRC"
cargo build --release 2>&1 | tail -1
cp target/release/mhrv-rs "$TMPDIR_BENCH/mhrv-serial"
# Build pipelined (depth=10)
echo "Building pipelined mode (INFLIGHT_ACTIVE=10)..."
sed -i '' "s/^const INFLIGHT_ACTIVE: usize = [0-9]*/const INFLIGHT_ACTIVE: usize = 10/" "$SRC"
cargo build --release 2>&1 | tail -1
cp target/release/mhrv-rs "$TMPDIR_BENCH/mhrv-pipelined"
echo ""
# Run tests
run_test "Serial (depth=1)" "$TMPDIR_BENCH/mhrv-serial"
run_test "Pipelined (depth=10)" "$TMPDIR_BENCH/mhrv-pipelined"
# Summary
echo "╔══════════════════════════════════════════════╗"
echo "║ RESULTS ║"
echo "╠══════════════════════════════════════════════╣"
while IFS='|' read -r label speed time; do
printf "║ %-25s %6s KB/s %5ss\n" "$label" "$speed" "$time"
done < "$TMPDIR_BENCH/results.txt"
echo "╚══════════════════════════════════════════════╝"