Compare commits

...
2 Commits
3 changed files with 62 additions and 3 deletions
+59
View File
@@ -0,0 +1,59 @@
# Диагностика медленной/нестабильной загрузки + v0.0.43 — 2026-08-19
**Дата:** 2026-08-19
**Версия:** 0.0.42 → 0.0.43
---
## Проблема
Юзер: «Таймаут 30с» при загрузке 19 МБ PDF в drhider. Раньше (11с) грузилось.
## Диагностика (факты)
### Таймаут 30с
- Введён 14.07.2026 (коммит `b6dac6f`, «не висеть бесконечно»), НЕ мой код.
- 19 МБ / 30с = 0.63 МБ/с — при медленном/нестабильном канале не хватает.
### Замеры загрузки с ВМ (внешний путь)
- 1 МБ → 0.16с (быстро)
- 5 МБ → 51.6с (медленно)
- 10 МБ → 52.4с (медленно)
- Повтор 10 МБ ×4: **1.07с / 52.3с / 52.3с / 52.3с** — НЕСТАБИЛЬНО, чаще 52с.
- Повтор 1 МБ: то 51с, то 0.5с — задержка НЕ зависит от размера.
### Тайминг (10 МБ)
- `connect=0.046с`, `starttransfer=0.09с`, `total=52.5с`.
- Сервер отвечает быстро (starttransfer), но соединение «висит» ~52с после ответа.
- `Connection: close` — НЕ помогает (то же 52с).
### Сервер
- Из loadtest: внутри кластера 10 МБ = 0.2с — сервер/Flask быстрые.
- ClusterIP с ВМ недоступен (ВМ вне кластера) — проверить напрямую не вышло.
## Применённые аннотации ingress (НЕ помогли)
Добавлены на ingress `pythonk8s` (ns 20a75175...):
```yaml
nginx.ingress.kubernetes.io/proxy-request-buffering: "false"
nginx.ingress.kubernetes.io/client-body-buffer-size: "1024m"
```
- `kubectl patch` — применено, nginx reload (75с).
- В конфиге: `client_body_buffer_size 1024m` — применилось.
- `proxy_request_buffering on` — НЕ применилось (аннотация не подхватилась shturval-контроллером).
- Замер после: 5 МБ = 51.7с, 19 МБ = 53.8с — эффекта НЕТ.
## Вывод
- Задержка ~50с НЕ в коде drhider, НЕ в буферизации nginx, НЕ зависит от размера,
НЕСТАБИЛЬНА (то 0.5с, то 52с). Вероятно: внешний путь шлюз/балансировщик/сеть
(потеря пакетов / TCP RTO ~50с, или периодическая задержка шлюза).
- Совпадает с диагнозом loadtest: «на iot-naeel шлюз держит ~50с».
## Решение (v0.0.43) — защита от ошибки юзера
- `xhr.timeout`: 30000 → **300000 (300с)** — при нестабильной загрузке файл
догрузится (медленно, но без «Таймаут 30с»).
- Сообщение: «Таймаут 30с» → «Таймаут 300с».
## Осталось
- Аннотации на ingress оставлены (`client-body-buffer-size 1024m` не вредит;
`proxy-request-buffering` не работает на shturval — искать правильный способ).
- Корень задержки ~50с на внешнем пути — НЕ найден, требует сетевой диагностики
(tcpdump, проверка балансировщика/шлюза платформы).
+1 -1
View File
@@ -20,7 +20,7 @@ if _sys_path_root not in sys.path:
sys.path.insert(0, _sys_path_root) sys.path.insert(0, _sys_path_root)
# Версия приложения (меняется при изменениях) # Версия приложения (меняется при изменениях)
VERSION = "0.0.42" VERSION = "0.0.43"
def create_app(): def create_app():
+2 -2
View File
@@ -393,7 +393,7 @@ async function uploadFiles() {
const url = '/api/upload?_=' + Date.now(); const url = '/api/upload?_=' + Date.now();
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open('POST', url); xhr.open('POST', url);
xhr.timeout = 30000; xhr.timeout = 300000; // 300с: загрузка больших файлов нестабильна через шлюз
xhr.upload.onprogress = function(e) { xhr.upload.onprogress = function(e) {
if (e.lengthComputable) { if (e.lengthComputable) {
const pct = Math.round(e.loaded / e.total * 100); const pct = Math.round(e.loaded / e.total * 100);
@@ -417,7 +417,7 @@ async function uploadFiles() {
} }
}; };
xhr.onerror = function() { reject(new Error('Сеть')); }; xhr.onerror = function() { reject(new Error('Сеть')); };
xhr.ontimeout = function() { reject(new Error('Таймаут 30с')); }; xhr.ontimeout = function() { reject(new Error('Таймаут 300с')); };
activeXHR = xhr; activeXHR = xhr;
xhr.send(fd); xhr.send(fd);
}); });