104 lines
3.8 KiB
Bash
Executable File
104 lines
3.8 KiB
Bash
Executable File
#!/bin/bash
|
|
# Updated: 2026-04-12 05:40 UTC
|
|
# payload_latency_probe.sh — узкий замер SendMessage latency для payload 10KB и 32KB.
|
|
|
|
set -euo pipefail
|
|
|
|
# ysqs выполняет aws sqs для Yandex MQ.
|
|
ysqs() {
|
|
AWS_ACCESS_KEY_ID="$Y_AK" AWS_SECRET_ACCESS_KEY="$Y_SK" \
|
|
AWS_DEFAULT_REGION="$Y_REGION" \
|
|
aws --endpoint-url "$Y_EP" --output json sqs "$@" >/dev/null 2>&1
|
|
}
|
|
|
|
# osqs выполняет aws sqs для shared-sqs.
|
|
osqs() {
|
|
AWS_ACCESS_KEY_ID="$O_AK" AWS_SECRET_ACCESS_KEY="$O_SK" \
|
|
AWS_DEFAULT_REGION="$O_REGION" \
|
|
aws --endpoint-url "$O_EP" --output json sqs "$@" >/dev/null 2>&1
|
|
}
|
|
|
|
# ms_now возвращает текущее время в миллисекундах.
|
|
ms_now() {
|
|
date +%s%3N
|
|
}
|
|
|
|
# calc_stats считает min/avg/max/p95 по файлу latency.
|
|
calc_stats() {
|
|
local file_path="$1"
|
|
sort -n "$file_path" | awk '
|
|
{ values[NR] = $1; total += $1 }
|
|
END {
|
|
p95_index = int(NR * 0.95)
|
|
if (p95_index < 1) p95_index = 1
|
|
printf "%d %d %d %d\n", values[1], int(total / NR), values[NR], values[p95_index]
|
|
}'
|
|
}
|
|
|
|
# cleanup удаляет временные объекты после замера.
|
|
cleanup() {
|
|
set +e
|
|
if [[ -n "${Y_QURL:-}" ]]; then
|
|
AWS_ACCESS_KEY_ID="$Y_AK" AWS_SECRET_ACCESS_KEY="$Y_SK" AWS_DEFAULT_REGION="$Y_REGION" \
|
|
aws --endpoint-url "$Y_EP" --output json sqs delete-queue --queue-url "$Y_QURL" >/dev/null 2>&1 || true
|
|
fi
|
|
if [[ -n "${O_QURL:-}" ]]; then
|
|
AWS_ACCESS_KEY_ID="$O_AK" AWS_SECRET_ACCESS_KEY="$O_SK" AWS_DEFAULT_REGION="$O_REGION" \
|
|
aws --endpoint-url "$O_EP" --output json sqs delete-queue --queue-url "$O_QURL" >/dev/null 2>&1 || true
|
|
fi
|
|
rm -rf "$TMPDIR"
|
|
}
|
|
|
|
trap cleanup EXIT
|
|
|
|
Y_AK="YCAJEQDz_Eg_i4C4M7TAen2fd"
|
|
Y_SK="YCMDfD8OKFK51knPyydwQOYts7Q81_3YBhv4sd_j"
|
|
Y_REGION="ru-central1"
|
|
Y_EP="https://message-queue.api.cloud.yandex.net"
|
|
|
|
O_AK="SSAK-ed0b0c64dcc135adad9e11be"
|
|
O_SK="f917c133e4ad74cf37c8e3ba29d74a39f42f117a202bd672436c92fdb6b6f3dc"
|
|
O_REGION="us-east-1"
|
|
O_EP="https://qu.kube5s.ru"
|
|
O_TID="t-e0ce25e83be94c58"
|
|
|
|
ITERATIONS=7
|
|
TMPDIR=$(mktemp -d /tmp/payload_latency_probe_XXXXX)
|
|
TS=$(date +%s)
|
|
|
|
head -c 10240 /dev/urandom | base64 | head -c 10240 > "$TMPDIR/payload_10k.txt"
|
|
head -c 32768 /dev/urandom | base64 | head -c 32768 > "$TMPDIR/payload_32k.txt"
|
|
|
|
Y_QNAME="payload-probe-y-${TS}"
|
|
O_QNAME="payload-probe-o-${TS}"
|
|
|
|
Y_CREATE_RAW=$(AWS_ACCESS_KEY_ID="$Y_AK" AWS_SECRET_ACCESS_KEY="$Y_SK" AWS_DEFAULT_REGION="$Y_REGION" aws --endpoint-url "$Y_EP" --output json sqs create-queue --queue-name "$Y_QNAME")
|
|
Y_QURL=$(echo "$Y_CREATE_RAW" | python3 -c 'import json,sys; print(json.load(sys.stdin)["QueueUrl"])')
|
|
osqs create-queue --queue-name "$O_QNAME"
|
|
O_QURL="${O_EP}/${O_TID}/${O_QNAME}"
|
|
|
|
run_probe() {
|
|
local provider_name="$1"
|
|
local queue_url="$2"
|
|
local payload_file="$3"
|
|
local result_file="$4"
|
|
local runner="$5"
|
|
|
|
: > "$result_file"
|
|
for _ in $(seq 1 "$ITERATIONS"); do
|
|
local started_at
|
|
started_at=$(ms_now)
|
|
"$runner" send-message --queue-url "$queue_url" --message-body "file://$payload_file"
|
|
echo $(( $(ms_now) - started_at )) >> "$result_file"
|
|
done
|
|
|
|
local stats_line
|
|
stats_line=$(calc_stats "$result_file")
|
|
echo "${provider_name}|$(echo "$stats_line" | awk '{print $1"|"$2"|"$3"|"$4}')"
|
|
}
|
|
|
|
echo "payload_kb|provider|min|avg|max|p95"
|
|
run_probe "yandex" "$Y_QURL" "$TMPDIR/payload_10k.txt" "$TMPDIR/y_10k.txt" ysqs | awk -F'|' '{print "10|"$0}'
|
|
run_probe "shared-sqs" "$O_QURL" "$TMPDIR/payload_10k.txt" "$TMPDIR/o_10k.txt" osqs | awk -F'|' '{print "10|"$0}'
|
|
run_probe "yandex" "$Y_QURL" "$TMPDIR/payload_32k.txt" "$TMPDIR/y_32k.txt" ysqs | awk -F'|' '{print "32|"$0}'
|
|
run_probe "shared-sqs" "$O_QURL" "$TMPDIR/payload_32k.txt" "$TMPDIR/o_32k.txt" osqs | awk -F'|' '{print "32|"$0}' |