#!/bin/bash # Fission storage benchmark: local-path PV / vcd-disk-ext4 PV / S3 # Каждый вызов = полный путь: curl → Fission Router → Executor → Pod → Storage set -e N=${1:-10} # число итераций, по умолчанию 10 OUTDIR="$(cd "$(dirname "$0")/../../test-results" 2>/dev/null && pwd || echo /tmp)" OUTFILE="$OUTDIR/bench-storage-$(date +%Y-%m-%d_%H-%M-%S).txt" mkdir -p "$OUTDIR" # Port-forward router kubectl port-forward svc/router 8889:80 -n fission &>/tmp/pf-bench.log & PF_PID=$! trap "kill $PF_PID 2>/dev/null" EXIT sleep 3 ROUTER="http://localhost:8889" # JWT auth PASSWORD=$(kubectl get secret router -n fission -o jsonpath="{.data.password}" | base64 -d) USERNAME=$(kubectl get secret router -n fission -o jsonpath="{.data.username}" | base64 -d) TOKEN=$(curl -s -X POST "$ROUTER/auth/login" \ -H "Content-Type: application/json" \ -d "{\"username\":\"$USERNAME\",\"password\":\"$PASSWORD\"}" \ | python3 -c "import sys,json; print(json.load(sys.stdin)['accesstoken'])") if [ -z "$TOKEN" ]; then echo "ERROR: не удалось получить JWT токен" >&2 exit 1 fi AUTH="-H \"Authorization: Bearer $TOKEN\"" # Функция запуска N итераций и сбора статистики bench_endpoint() { local LABEL="$1" local URL="$2" local times=() local errors=0 echo "" echo "=== $LABEL ===" printf "%-5s %-12s %s\n" "iter" "ms" "response" for i in $(seq 1 $N); do START=$(date +%s%N) RESP=$(curl -s --max-time 60 -H "Authorization: Bearer $TOKEN" "$URL" 2>/dev/null) END=$(date +%s%N) MS=$(( (END - START) / 1000000 )) if echo "$RESP" | python3 -c "import sys,json; d=json.load(sys.stdin); assert d['status']=='ok'" 2>/dev/null; then STATUS="ok" INNER=$(echo "$RESP" | python3 -c "import sys,json; d=json.load(sys.stdin); k=list(d.keys()); print(' '.join(f'{k}={d[k]}' for k in k if k not in ['status']))" 2>/dev/null) else STATUS="ERR" INNER="$RESP" (( errors++ )) || true fi times+=($MS) printf "%-5s %-12s %s\n" "$i" "${MS}ms" "$STATUS $INNER" done # Статистика local sum=0 min=999999999 max=0 for t in "${times[@]}"; do sum=$((sum + t)) [ $t -lt $min ] && min=$t [ $t -gt $max ] && max=$t done local avg=$((sum / N)) local ok=$((N - errors)) echo "---" printf " Успешно: %d/%d | min=%dms avg=%dms max=%dms\n" "$ok" "$N" "$min" "$avg" "$max" } # Заголовок отчёта { echo "============================================================" echo " Fission Storage Benchmark" echo " Дата: $(date)" echo " Итераций: $N на endpoint" echo " Стек: curl → Router → Executor → Pod → Storage" echo "============================================================" bench_endpoint "local-path PV (100Mi, rawfile CSI, WaitForFirstConsumer)" \ "$ROUTER/check/local" bench_endpoint "vcd-disk-ext4 PV (10Gi, VMware Cloud Director)" \ "$ROUTER/check/vcd" bench_endpoint "S3 ngcloud (s3.msk-1.ngcloud.ru, bucket=sless-functions)" \ "$ROUTER/check/s3" echo "" echo "============================================================" echo " Завершено: $(date)" echo "============================================================" } | tee "$OUTFILE" echo "" echo "Результаты записаны: $OUTFILE"