/
rustwizard
/
pgtrace
Обзор
Документация
Войти
/
rustwizard
/
pgtrace
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
deploy/bench/overhead.sh
93 строки
3 KB
Rust Wizard
bench: report median overhead and add stable-measurement hints
07 авг 2026, 14:59
Верифицирован
07 авг 2026, 14:59
96029dc
Код
Авторство
О чём код?
#!/usr/bin/env bash # Measures pgtrace overhead: pgbench TPS with and without the agent running. # # Run on the Lima VM: # limactl shell ebpf-dev -- sudo bash deploy/bench/overhead.sh # # The agent must not be running already (the script starts and stops it). set -euo pipefail REPO="$(cd "$(dirname "${BASH_SOURCE[0]}")/../.." && pwd)" PG_BENCH="${PG_BENCH:-$(command -v pgbench 2>/dev/null || echo /usr/lib/postgresql/16/bin/pgbench)}" DB="${PG_BENCH_DB:-pgbench}" DURATION="${PG_BENCH_T:-30}" CLIENTS="${PG_BENCH_C:-8}" JOBS="${PG_BENCH_J:-4}" RUNS="${PG_BENCH_RUNS:-3}" THRESHOLD="${PG_BENCH_THRESHOLD:-1ms}" run_pgbench() { "$PG_BENCH" -c "$CLIENTS" -j "$JOBS" -T "$DURATION" "$DB" 2>&1 | grep -oE "tps = [0-9.]+" | awk '{print $3}' } mean() { awk '{ s += $1; n++ } END { printf "%.1f", s / n }' } median() { sort -n | awk ' { a[NR] = $1 } END { mid = int((NR + 1) / 2) if (NR % 2 == 1) printf "%.1f", a[mid] else printf "%.1f", (a[mid] + a[mid + 1]) / 2 }' } start_agent() { cd "$REPO" sudo ./bin/pgtrace agent \ --dsn "postgres://$USER:$USER@localhost/$DB" \ --threshold "$THRESHOLD" \ --window 10s \ --http :19092 > /tmp/pgtrace-overhead.log 2>&1 & AGENT_PID=$! sleep 2 } stop_agent() { if [[ -n "${AGENT_PID:-}" ]]; then sudo kill -INT "$AGENT_PID" 2>/dev/null || true wait "$AGENT_PID" 2>/dev/null || true fi } trap stop_agent EXIT echo "== baseline (no agent) ==" BASELINE=() for _ in $(seq "$RUNS"); do BASELINE+=("$(run_pgbench)") done echo "== with agent (threshold $THRESHOLD) ==" start_agent AGENT=() for _ in $(seq "$RUNS"); do AGENT+=("$(run_pgbench)") done stop_agent AGENT_PID= echo printf "%-12s %-20s %-20s\n" "run" "baseline tps" "with agent tps" for i in $(seq "${#BASELINE[@]}"); do printf "%-12d %-20s %-20s\n" "$i" "${BASELINE[$((i-1))]}" "${AGENT[$((i-1))]}" done BASE_MEAN="$(printf '%s\n' "${BASELINE[@]}" | mean)" AGENT_MEAN="$(printf '%s\n' "${AGENT[@]}" | mean)" BASE_MEDIAN="$(printf '%s\n' "${BASELINE[@]}" | median)" AGENT_MEDIAN="$(printf '%s\n' "${AGENT[@]}" | median)" OVERHEAD_MEDIAN="$(awk -v b="$BASE_MEDIAN" -v a="$AGENT_MEDIAN" 'BEGIN { printf "%.2f", (b - a) / b * 100 }')" echo echo "baseline tps (mean/median): $BASE_MEAN / $BASE_MEDIAN" echo "with agent tps (mean/median): $AGENT_MEAN / $AGENT_MEDIAN" echo "overhead (median): ${OVERHEAD_MEDIAN}%" echo echo "Note: below ~1-2% the difference is within VM noise. For stable numbers:" echo " - stop autovacuum/checkpoints during the run:" echo " sudo -u postgres psql -c 'ALTER SYSTEM SET autovacuum = off' && sudo systemctl restart postgresql" echo " - use a longer run / more repetitions: PG_BENCH_T=60 PG_BENCH_RUNS=5" echo " - the median is more robust than the mean against outliers"