From 4653aa5e8e1131e7e7908887710856524cfc2c39 Mon Sep 17 00:00:00 2001 From: naeel Date: Mon, 17 Aug 2026 18:32:06 +0400 Subject: [PATCH] =?UTF-8?q?Docs:=20=D0=B4=D0=B8=D0=B0=D0=B3=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8=D0=BA=D0=B0=20HTTP=20502=20=D0=BD=D0=B0=2019?= =?UTF-8?q?=D0=9C=D0=91=20PDF=20=E2=80=94=20OOMKill=20=D0=BF=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=20(=D0=BB=D0=B8=D0=BC=D0=B8=D1=82=201Gi)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- History/session-2026-08-17-upload-502-oom.md | 71 ++++++++++++++++++++ 1 file changed, 71 insertions(+) create mode 100644 History/session-2026-08-17-upload-502-oom.md diff --git a/History/session-2026-08-17-upload-502-oom.md b/History/session-2026-08-17-upload-502-oom.md new file mode 100644 index 0000000..0699efa --- /dev/null +++ b/History/session-2026-08-17-upload-502-oom.md @@ -0,0 +1,71 @@ +# Сессия 2026-08-17 — HTTP 502 при парсинге 19 МБ PDF = OOMKill пода + +_Стенд: ТЕСТ, `contractor.pythonk8s.dev.nubes.ru` (приставка `dev.nubes.ru` общая для dev+test). +instanceUid: `b4523aba-b5e6-40f1-be56-bb4d2509357c`, realm `iot-naeel`, domain `contractor`._ + +## 1. Симптом (из UI, колонка «Парсинг») + +Файл `0144-03-2023_отчет об оценке.pdf` (19.0 МБ) в списке **дважды**: +- первый проход: **✗ HTTP 502**; +- повторный: **✓ 4083 эл. (0.0с)**. + +Остальные файлы (623 КБ, 473 КБ, 596 КБ) парсились нормально. +Вывод: загрузка файла проходит, падает **парсинг** (тяжёлая операция в запросе). + +## 2. Диагностика kubectl (с ВМ remote-dev = 5.172.178.213) + +``` +kubectl get pods -n b4523aba-... + pythonk8s-589db8db9c-qjjnc 1/1 Running 1 (5m18s ago) 17m +``` + +`kubectl describe pod`: +``` +Last State: Terminated + Reason: OOMKilled + Exit Code: 137 +Restart Count: 1 +Limits: cpu: 1, memory: 1Gi +Requests: cpu: 1, memory: 1Gi +``` + +`kubectl top pod` (текущий под, простое): **727Mi из 1Gi (~71%)**. + +События: +``` +17m Killing pod/pythonk8s-5895c478b5-7dcqq — Stopping container app +``` +(убитый OOM-ом под; текущий `pythonk8s-589db8db9c-qjjnc` — новый). + +Логи прежнего контейнера (`--previous`): обычные запросы (health, batch-progress, +apply-groups, process-v2, cleanup), обрыв на 14:13:14 → OOM. + +## 3. Вывод (по фактам) + +**HTTP 502 = OOMKill пода (exit 137).** Синхронный парсинг 19 МБ PDF +(`site/routes/upload_bp.py`: `parse_file` → `set_parsed` в том же запросе, +pdfplumber → 4083 элемента) превышает лимит памяти **1Gi** → kubelet убивает под → +шлюз не получает ответ → 502. После рестарта повторный парсинг проходит. + +- **Это НЕ** проблема сети/размера тела (как 64KB на `services`), а **нехватка памяти**. +- Базовое потребление уже ~71% лимита, парсинг большого PDF добивает под. + +## 4. Связь с прежними находками + +| Симптом | Причина | Платформа | +|---|---|---| +| «64KB / HTTP 000, Сеть» (исторически) | ddos-guard + таймауты Ingress + медленная обработка | `pythonk8s.services.ngcloud.ru` | +| HTTP 502 на 19 МБ PDF (сейчас) | OOMKill: лимит 1Gi, синхронный парсинг | `pythonk8s.dev.nubes.ru` (ТЕСТ) | + +## 5. Варианты решения (НЕ ВНЕСЕНЫ, ждут команды) + +1. Поднять память инстанса: `clusterConfiguration.memory` 1024 → 2048 (быстрый обходной путь). +2. Убрать синхронный парсинг из `/upload` — парсинг в фон (thread / отдельный endpoint), + ответ сразу; снижает пик памяти в запросе (правильный фикс). +3. Оба варианта. + +## 6. Статус (следующий шаг) + +Пользователь планирует **редеплой на обычном облачном кластере со стандартными настройками** +(не на своём `iot-naeel`) — проверить, как ведёт себя парсинг 19 МБ при стандартных лимитах. +Результат сравнить с данным диагностикой.