Реальный 4-часовой soak (Sprint 28 overnight): 03:15 → 07:15. iterations: 718482 @ 49.89/s (target 50) api_mem: 250-300 MiB, без линейного роста ✓ pg_conn: 18-19 steady, no exhaust ✓ p95 latency: me=269ms / products=327ms / stats=328ms (steady) http_req_failed: 24.8% — НЕ из-за API. Внешний TLS-терминатор 88.204.171.93 (между dev-vm и stage) перодически ронял соединения с 'unexpected EOF' / 'connection reset by peer'. На внутренней сети stage'а (`docker exec curl localhost:8085`) — Healthy всё время. ISP/Cloudflare-level ограничение на длительные RPS, не баг food-market. Артефакты: tests/load/soak-runs/2026-06-09/summary.json tests/load/soak-runs/2026-06-09/metrics.csv Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| soak-runs/2026-06-09 | ||
| monitor-soak.sh | ||
| README.md | ||
| retail-sales-parallel.js | ||
| sales-report-heavy.js | ||
| signup-burst.js | ||
| soak-4h.js | ||
k6 нагрузочные тесты
Сценарии нагрузочного тестирования API food-market через k6.
Подготовка
# k6 standalone (Linux)
wget -O- https://github.com/grafana/k6/releases/download/v0.55.0/k6-v0.55.0-linux-amd64.tar.gz | tar xz
mv k6-*-linux-amd64/k6 ~/bin/
# проверить
k6 version
Сценарии
| Файл | Что меряет |
|---|---|
signup-burst.js |
100 signup'ов за минуту — bootstrap новых tenant'ов под нагрузкой |
retail-sales-parallel.js |
1000 проведённых чеков параллельно за 5 минут (один tenant) |
sales-report-heavy.js |
Чтение отчёта /api/reports/sales при 10 000 уже-существующих продажах |
Запуск против stage
BASE_URL=https://test.admin.food-market.kz \
k6 run signup-burst.js
BASE_URL=https://test.admin.food-market.kz \
k6 run retail-sales-parallel.js
BASE_URL=https://test.admin.food-market.kz \
k6 run sales-report-heavy.js
Результаты сводятся в docs/performance-baseline.md.
Что k6 печатает
checks_total....: 100.00% 1000/1000
http_req_duration: p(50)=82ms p(95)=312ms p(99)=580ms
http_req_failed.: 0.00% 0/1000
iteration_duration: avg=512ms
Это «человеческие» метрики. Тонкое — через --out json=summary.json
или --out csv=... (k6 не имеет своего хранилища, только stdout/file).