4.0 KiB
4.0 KiB
drhider — тесты загрузки и стресс (2026-08-23, v0.0.59–0.0.60)
Платформа: Штурвал, кластер naeel-test-3 (kubeconfig ~/.kube/config-naeel-test-3 на ВМ).
ВМ-буфер: https://contracts.kube5s.ru/drhider-upload/ (nginx dav). Тест-режим: ?upload-only=1.
Изменения за день
- v0.0.58 — ВМ-загрузка: PUT на ВМ +
/api/upload_refs(egress pull) + тест-режим?upload-only=1. - v0.0.59 — убран лимит 100 МБ/файл (фронт; остался суммарный 1 ГБ).
- v0.0.60 — дедуп по имя+размер (дату игнорируем), при совпадении остаётся более свежий.
Edge-case тесты (v0.0.59, браузер/Playwright)
- Нулевой размер (
empty.txt0 B) — принимается, грузится (0 B/s), в сессии size=0. ✅ - Бинарный файл (
bin.dat) — принимается, грузится. ✅ - Одинаковое имя, разный размер — суффикс
_2. ✅ - Одинаковые имя+размер, разная дата — дедуп (было
_2, с v0.0.60 — один, свежий). ✅ - Один файл в архиве и отдельно — дедуп (было
_2из-за mtime, с v0.0.60 — один). ✅
Стресс-тест загрузки (v0.0.60)
Под: pythonk8s-8dbc866bb-d84p6, requests/limits cpu 2 / memory 4Gi.
Путь: PUT на ВМ → POST /api/upload_refs (один JSON со всеми refs) → GET /api/session_files.
Сессии (11 успешных + 1 OOM)
| Сес. | Файлов | Объём | PUT | refs |
|---|---|---|---|---|
| A | 120 | 364МБ | 34.4с | 37.8с |
| B | 120 | 316МБ | 29.9с | 33.3с |
| C | 1×250МБ | 250МБ | 23.2с | 23.9с |
| D | 120 | 378МБ | 40.0с | 41.6с |
| E | 120 | 301МБ | 26.7с | 31.5с |
| F | 1×200МБ | 200МБ | 18.9с | 33.8с |
| G | 120 | 360МБ | 34.8с | 36.4с |
| H | 120 | 309МБ | 29.0с | 38.4с |
| I | 1×250МБ | 250МБ | 23.2с | 24.1с |
| J | 120 | 357МБ | 33.4с | 37.9с |
| K | 120 | 366МБ | 34.3с | 40.1с |
| L | 120 | 369МБ | — | FAIL (OOM) |
| M | 120 | 347МБ | 32.5с | 36.0с (после рестарта) |
| N | 120 | 358МБ | 33.1с | 37.5с (после рестарта) |
Память пода (рост линейный, ~1.2× объёма сессий)
55Mi (база) → 744Mi (3 сес.) → 1991Mi (6 сес.) → 3235Mi (9 сес., ~80% лимита) → OOMKilled на L.
Итог OOM
restarts=1, lastReason=OOMKilled, exitCode=137(лимит 4Gi).- После авто-рестарта под работает, загрузка продолжается (M, N ok).
- Все сессии A–L потеряны (in-memory хранилище, TTL 30 мин, без персиста).
Выводы / факты
- Загрузка через ВМ стабильна на больших объёмах: до OOM — 11 сессий ~3.3ГБ, 0 ошибок, скорость не деградирует.
- Потолок памяти = лимит пода 4Gi; OOM при ~3.5ГБ резидентных сессий.
- Апп переживает OOM (рестарт + продолжение работы), но сессии теряются.
- Код:
session.py MAX_SESSION_BYTES = 500МБ(на сессию) — OOM реален только при ~8+ одновременных сессий. upload_refsпри переполнении сессии отвечает 404 «Session not found» (вводит в заблуждение — это лимит размера).- ГРАБЛЯ: на Krupski
ddалиасится наdocker compose down; прокси172.17.192.1:10808— тесты только--noproxy '*'/NO_PROXY. - Браузер-автоматизация (Playwright) видит Windows-ФС (
C:\tmp\...) — тестовые файлы класть в/mnt/c/tmp/(WSL).