docs(loadtest): hold/stress профили и правила безопасности IFT. Refs EventHub/EventHubBack#31 [skip ci]
This commit is contained in:
+73
-7
@@ -6,12 +6,34 @@
|
||||
|------|------------|
|
||||
| `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` для verify).
|
||||
Цель: **HTTPS** `api.ift.eventhub.local` (+ `admin-api.ift.eventhub.local` для seed/verify).
|
||||
|
||||
### Auth path
|
||||
### Правила безопасности 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`
|
||||
@@ -19,6 +41,35 @@
|
||||
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
|
||||
@@ -30,6 +81,14 @@ printf '%s;%s\n' "$ADMIN_SUPER_EMAIL" "$ADMIN_SUPER_PASSWORD" > test/tsung/ift-a
|
||||
|
||||
`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
|
||||
@@ -45,14 +104,20 @@ EVENTHUB_REPLICAS=1 bash /opt/eventhub-ift/devops/scripts/ift-loadtest-prepare.s
|
||||
2. `sudo apt install tsung`
|
||||
3. TLS: доверить CA стенда (`EventHubDevOps/ift/traefik/certs`). Проверка:
|
||||
`curl -sf https://api.ift.eventhub.local/health`
|
||||
4. Из корня `EventHubBack`:
|
||||
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>/`.
|
||||
Отчёт: `~/.tsung/log/<timestamp>/`. Для stress — также `~/.tsung/ift-docker-stats-*.log`.
|
||||
|
||||
## После прогона
|
||||
|
||||
@@ -62,10 +127,11 @@ bash /opt/eventhub-ift/devops/scripts/ift-loadtest-restore.sh
|
||||
|
||||
## Настройка интенсивности
|
||||
|
||||
В `eventhub_ift.xml` блок `<load>`: `interarrival` и `duration` фаз.
|
||||
`thinktime` — **секунды**.
|
||||
В `eventhub_ift.xml` / `eventhub_ift_stress*.xml` блок `<load>`: `interarrival` и `duration` фаз.
|
||||
`thinktime` в stress XML **отключён** (Tsung отклоняет `min="0"`; дробные `max` тоже) — максимальная плотность для поиска потолка.
|
||||
|
||||
## Замечания
|
||||
|
||||
- Каждый VU делает admin login — это нагрузка и на admin-api; при необходимости позже вынести общий admin JWT в csv.
|
||||
- Все 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`.
|
||||
|
||||
Reference in New Issue
Block a user