7.2 KiB
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):
- Сбор логов:
\\192.168.1.116\eventhub-cursor\scripts\restart-wsl-and-collect-logs.ps1(илиcollect-ift-loadtest-logs.ps1) wsl --shutdownпри необходимости- Restore:
restore-ift.ps1(Windows OpenSSH) →ift-loadtest-restore.sh(retry/--forceприupdate out of sequence)
Auth path (smoke / full)
POST /v1/admin/login(admin-api) — учётка изift-admin.csvPOST /v1/register→user.idGET /v1/admin/users/:id/verification-token— спец. admin-методPOST /v1/verifyPOST /v1/login→ user JWT
Stress hot-path
Пользователи сидятся заранее (seed-ift-users.sh → ift-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.
Под hold также: Mnesia is overloaded: {dump_log, write_threshold|time_threshold}. Краткосрочно: MNESIA_DUMP_LOG_WRITE_THRESHOLD (IFT default 50000, EventHubBack#34). Долгосрочно: меньше sync-транзакций / hot-path вне Mnesia.
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)
- DNS:
api.ift.eventhub.localиadmin-api.ift.eventhub.local→ IP IFT. sudo apt install tsung- TLS: доверить CA стенда (
EventHubDevOps/ift/traefik/certs). Проверка:
curl -sf https://api.ift.eventhub.local/health - Из корня
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.