106 lines
3.4 KiB
Bash
106 lines
3.4 KiB
Bash
#!/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"
|