Files
EventHubBack/test/tsung
..
2026-04-23 22:01:45 +03:00

Tsung — нагрузка EventHub

Профили

Файл Назначение
eventhub_ift_smoke.xml Короткий smoke на IFT после prepare
eventhub_ift.xml Mix: auth_browse 60% + create_flow 40%, фазы warmup/ramp/peak
eventhub_ift_stress.xml Hot-path stress: browse 70% / write 30%, ladder arrival, поиск верхней границы
eventhub_ift_stress_hold.xml Controlled hold: maxusers=300, thinktime=1s, ladder 0.2→0.1→0.05→0.035
eventhub_ift_stress_bump.xml Запрещён по умолчанию (uncapped arrival; клинит WSL IFT)
eventhub_tsung.xml Legacy localhost (не для IFT)
eventhub_http.xml Legacy короткий localhost

Цель: HTTPS api.ift.eventhub.local (+ admin-api.ift.eventhub.local для seed/verify).

Правила безопасности IFT (обязательно)

IFT = Docker Swarm внутри WSL2 на Windows. Aggressive open-loop без лимитов клинит vmmem и рвёт SSH.

Правило Значение
Рекомендуемый stress eventhub_ift_stress_hold.xml (stress-hold)
maxusers 300
thinktime 1 s на hot-path hold
Плановый interarrival 0.1 s (~10 VU/s); ниже — только с наблюдением
Uncapped / bump / maxusers≫300 запрещено на IFT без явного согласования
Рабочий потолок (2026-07-15) ~10 VU/s hot-path на текущем железе

Recover после клина (на Windows-хосте IFT):

  1. Сбор логов: \\192.168.1.116\eventhub-cursor\scripts\restart-wsl-and-collect-logs.ps1 (или collect-ift-loadtest-logs.ps1)
  2. wsl --shutdown при необходимости
  3. Restore: restore-ift.ps1 (Windows OpenSSH) → ift-loadtest-restore.sh (retry/--force при update out of sequence)

Auth path (smoke / full)

  1. POST /v1/admin/login (admin-api) — учётка из ift-admin.csv
  2. POST /v1/registeruser.id
  3. GET /v1/admin/users/:id/verification-token — спец. admin-метод
  4. POST /v1/verify
  5. POST /v1/login → user JWT

Stress hot-path

Пользователи сидятся заранее (seed-ift-users.shift-users.csv). Сессия Tsung: login → browse/write. Без admin/register/verify на VU.

Критерий верхней границы (2A):

  • error rate > 1% (4xx/5xx + nomatch + match_stop относительно числа запросов), или
  • cumulative / late-phase mean request > 500 ms (hold ≥2 мин в фазах ladder).

Разбор: python3 test/tsung/summarize-tsung-stress.py [tsung.log]verdict=BOUNDARY_HIT|UNDER_THRESHOLD.

В error rate входят и transport-ошибки Tsung (error_connect_closed, error_timeout, error_abort_max_conn_retries).

Результат 2026-07-15 aggressive (20260715-1027/): BOUNDARY_HIT — mean ~735 ms, error ~88%, maxusers=5000, SSH wedge.

Controlled hold ×1 (20260715-1200/): фазы 0.2/0.1 GREEN; 0.05 OVER (timeout 290, ~17%); overall BOUNDARY_HIT (err ~2.9%).

Controlled hold ×2 (20260715-1336/, EVENTHUB_REPLICAS=2): фазы 0.2/0.1 GREEN (mean ≈37 ms); 0.05 OVER мягче (timeout 106, ~3%); overall UNDER_THRESHOLD (err ~0.94%, mean ~64 ms).

Controlled hold ×3 (20260715-1411/, EVENTHUB_REPLICAS=3): connect по фазам 0.2→0.035 GREEN (0.05 mean≈40 ms); overall BOUNDARY_HIT из‑за 3772× HTTP 429 — узкое место сместилось на Traefik api-ratelimit (per source IP, было 5000/1m≈83 rps). После поднятия IFT-лимитов до 2000/1s (EventHubBack#32) перепроверить hold ×3.

Restore fallback: оркестратор → WSL SSH, при fail Windows restore-ift.ps1.

Если после stress SSH «висит на banner» — reboot IFT, затем:

bash /opt/eventhub-ift/devops/scripts/ift-loadtest-restore.sh

Подготовка учётки admin

# из /opt/eventhub-ift/.env или локальной копии
cp test/tsung/ift-admin.csv.example test/tsung/ift-admin.csv
# одна строка без комментариев: email;password
printf '%s;%s\n' "$ADMIN_SUPER_EMAIL" "$ADMIN_SUPER_PASSWORD" > test/tsung/ift-admin.csv

ift-admin.csv в .gitignore.

Пул пользователей для stress

# из корня EventHubBack; нужны DNS/TLS до IFT и docker/.env.ift
COUNT=400 bash test/tsung/seed-ift-users.sh
# → test/tsung/ift-users.csv  (email;password), gitignore

Перед прогоном (хост IFT)

EVENTHUB_REPLICAS=1 bash /opt/eventhub-ift/devops/scripts/ift-loadtest-prepare.sh
# EVENTHUB_REPLICAS=N — больше нод

Оставляет traefik + eventhub×N.

Дех-машина (WSL)

  1. DNS: api.ift.eventhub.local и admin-api.ift.eventhub.local → IP IFT.
  2. sudo apt install tsung
  3. TLS: доверить CA стенда (EventHubDevOps/ift/traefik/certs). Проверка:
    curl -sf https://api.ift.eventhub.local/health
  4. Из корня EventHubBack или оркестратор:
tsung -f test/tsung/eventhub_ift_smoke.xml start
tsung -f test/tsung/eventhub_ift.xml start
tsung -f test/tsung/eventhub_ift_stress.xml start
# оркестратор (prepare + seed при необходимости + restore):
bash ~/.cursor/eventhub/run-ift-loadtest.sh smoke|full|stress|stress-bump|stress-hold
# replicas: EVENTHUB_REPLICAS=2|3 bash ~/.cursor/eventhub/run-ift-loadtest.sh stress-hold
# restore fallback: если WSL SSH не отвечает — Windows OpenSSH
#   powershell -File $env:USERPROFILE\.cursor\eventhub\restore-ift.ps1

Отчёт: ~/.tsung/log/<timestamp>/. Для stress — также ~/.tsung/ift-docker-stats-*.log.

После прогона

bash /opt/eventhub-ift/devops/scripts/ift-loadtest-restore.sh

Настройка интенсивности

В eventhub_ift.xml / eventhub_ift_stress*.xml блок <load>: interarrival и duration фаз.
thinktime в stress XML отключён (Tsung отклоняет min="0"; дробные max тоже) — максимальная плотность для поиска потолка.

Замечания

  • Все URL в IFT-сценариях абсолютные (https://api… / https://admin-api…): после запроса на admin-api относительный путь у Tsung остаётся на том же Host → 404.
  • В smoke/full каждый VU делает admin login — нагрузка и на admin-api; stress этого не делает.
  • Из hot path убраны: dummy refresh, reports/tickets, завышенные thinktime старого eventhub_tsung.xml.