Files
EventHubBack/test/tsung/README.md
T

138 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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/register``user.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.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.
Restore fallback: оркестратор → WSL SSH, при fail Windows `restore-ift.ps1`.
Если после stress SSH «висит на banner» — **reboot IFT**, затем:
```bash
bash /opt/eventhub-ift/devops/scripts/ift-loadtest-restore.sh
```
## Подготовка учётки admin
```bash
# из /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
```bash
# из корня 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)
```bash
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` или оркестратор:
```bash
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
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`.