From 08cb8d84911e281614f750c68fa2759c6854df7d Mon Sep 17 00:00:00 2001 From: Alexey Martemyanov Date: Sun, 27 Sep 2026 10:46:42 +0600 Subject: [PATCH] [2026-09-27] eagle: personal/plans/lampac-kraken.md personal/tech/kraken-host-resource-limits.md --- personal/plans/lampac-kraken.md | 9 + personal/tech/kraken-host-resource-limits.md | 222 +++++++++++++++++++ 2 files changed, 231 insertions(+) create mode 100644 personal/tech/kraken-host-resource-limits.md diff --git a/personal/plans/lampac-kraken.md b/personal/plans/lampac-kraken.md index 2c34db61..c5b5f8db 100755 --- a/personal/plans/lampac-kraken.md +++ b/personal/plans/lampac-kraken.md @@ -80,6 +80,15 @@ OS на **SD-карте**: 14G всего, 8.6G свободно. `/srv/...` — Каталог с медиа на Кра́кене: `/srv/dev-disk-by-uuid-49e8f586-3839-4c5d-a1e1-58bfc3579ade/media` (старый UUID `49e8f586...` — **symlink** на актуальный диск `6194539b-03e0-4f33-986b-4da09834e82f`). +## 🔴 Потребление памяти + +**Lampac — главный потребитель RAM на Кра́кене.** Процесс называется `dotnet Core.dll` (без имени!) — +598 МБ (14.4% RAM), + Playwright 99 МБ + TorrServer 35 МБ = **~730 МБ ≈ 18% памяти хоста**. +На хосте всего **4 ГБ RAM и swap = 0** → лампа вносит основной вклад в OOM-давление. + +Подробности, замеры и план по swap: **`personal/tech/kraken-host-resource-limits.md`** +(инцидент 2026-09-27: load 57, Mattermost недоступен из-за дефицита RAM). + `ssh kraken` работает через `~/.ssh/config`: ``` Host kraken diff --git a/personal/tech/kraken-host-resource-limits.md b/personal/tech/kraken-host-resource-limits.md new file mode 100644 index 00000000..d08dfdb7 --- /dev/null +++ b/personal/tech/kraken-host-resource-limits.md @@ -0,0 +1,222 @@ +--- +title: Кра́кен — исчерпание ресурсов хоста (RAM / HDD I/O) +created: '2026-09-27' +updated: '2026-09-27' +type: tech +namespace: personal +status: open-incident +tags: + - kraken + - resources + - ram + - swap + - hdd + - incident +related: + - '[[personal/plans/lampac-kraken.md]]' + - '[[personal/plans/kraken-media-inventory-cleanup.md]]' + - '[[personal/tech/kraken-media-inventory-facts.md]]' + - '[[personal/projects/balda/balda-kraken-mm-deploy.md]]' +--- + +# Кра́кен — исчерпание ресурсов хоста (RAM / HDD I/O) + +> Инцидент 2026-09-27. Симптом: **Alex не может зайти в Mattermost**, Balda не отвечает. +> Диагноз: **не диск, а дефицит RAM без swap** → каскад D-state → HDD перестаёт отдавать чтение. + +## Симптом + +- Mattermost недоступен, вход невозможен. +- Balda не отвечает. +- `docker ps` **виснет** (демон не отвечает). +- `find` по `/srv` (HDD) **виснет**. + +## Что показали замеры (2026-09-27 ~10:19) + +| Показатель | Значение | +|---|---| +| `uptime` | up 3 дня 19:26 | +| **load average** | **57.17 / 57.90 / 58.62** | +| RAM total | 4.0 Gi | +| RAM used | **3.7 Gi (94%)** | +| RAM free | **65–73 Mi** | +| buff/cache | 1.2 Gi | +| available | **~234 Mi** | +| **Swap** | **0 B — swap отсутствует** | + +## 🔴 Ключевой вывод: CPU пустой, load 57 + +`ps -eo pcpu --sort=-pcpu` показал **пустой CPU** — ни один процесс не грузит процессор. +Load 57 при пустом CPU = **процессы стоят в D-state** (непрерываемое I/O-ожидание), +ждут не CPU, а **выделения памяти**. Ядро не может освободить страницы → всё встаёт в очередь. + +Каскад: **нет swap → нет куда вытеснить → OOM-давление → D-state → I/O-очередь на HDD не рассасывается → диск «перестаёт читать».** + +### D-state процессы (подтверждение) + +`ps -eo stat,pid,comm | awk '$1 ~ /D/'`: + +``` +D 225 usb-storage +D 1077 jbd2/sda1-8 # журнал ФС +D 5747 python3 # homeassistant +D 1278422 MainThread # mcp-proxy +D 1428866 chromium +D 1429061 tar +D 1485159 chromium +D 1487106 node +D 1515954 kworker/u20:1+flush-8:0 +D 1520023 git +D 1521739 postgres +D 1521849 watchtower +D 1521893 pg_isready +D 1521913 sh +``` + +🔴 `jbd2/sda1-8` + `kworker/flush-8:0` в D-state = **запись на ФС sda1 не завершается**. + +## Что проверено и НЕ подтвердилось + +| Проверка | Результат | +|---|---| +| `dmesg \| grep -i 'I/O error\|usb\|sda\|ata\|EXT4\|hung'` | **ПУСТО** — ошибок диска нет | +| `journalctl -p err -b` (без monit) | Ошибок диска нет | +| `dmesg` хвост | только veth-события Docker | +| `lsblk` | `sda` отвечает, разметка читается | + +**Вывод: диск физически в порядке.** Проблема — память. HDD встал как следствие, не как причина. + +### Единственное старое упоминание + +`folder2ram-hdd-bind.service - Bind folder2ram persistent dirs to HDD` — **Failed to start 2026-09-23 14:48** (при загрузке, 4 дня назад). +Старая рана, к сегодняшнему затору не относится, но требует отдельного разбора (OMV folder2ram). + +### monit забивает журнал + +``` +monit[1168]: 'kraken' loadavg (1min) of 60.4 matches resource limit [loadavg (1min) > 8.0] +monit[1168]: 'kraken' mem usage of 94.1% matches resource limit [mem usage > 90.0%] +monit[1168]: 'kraken' loadavg (5min) of 59.4 matches resource limit [loadavg (5min) > 4.0] +``` +Каждые 30 секунд, непрерывно. Пороги: load1 > 8.0, load5 > 4.0, mem > 90%. +При разборе журнала `journalctl -p err` **всегда фильтровать `| grep -v monit`**, иначе монит скрывает всё остальное. + +## 🔴 Кто съел память — топ по RSS (2026-09-27) + +| RSS | %MEM | PID | Процесс | Что это | +|---|---|---|---|---| +| **598 МБ** | **14.4%** | 590428 | **`dotnet Core.dll`** | **Lampac** (внутри контейнера `c2273502a869`) | +| 377 МБ | 9.0% | 5747 | `python3 -m homeassistant` | Home Assistant | +| 288 МБ | 6.9% | 4250 | `/jellyfin/jellyfin` | Jellyfin | +| 162 МБ | 3.8% | 287897 | Radarr | | +| 144 МБ | 3.4% | 397211 | Prowlarr | | +| 142 МБ | 3.4% | 5480 | Sonarr | | +| 139 МБ | 3.3% | 5039 | `hermes gateway` | Hermes на Кра́кене | +| 120 МБ | 2.8% | 412796 | `flaresolverr.py` | FlareSolverr | +| 101 МБ | 2.4% | 1009816 | `mattermost server` | Mattermost | +| 99 МБ | 2.3% | 724044 | `/lampac/.playwright/node ... run-driver` | Playwright у Lampac | +| 64 МБ | 1.5% | 3553 | `dockerd` | | +| 50 МБ | 1.2% | 1357 | `containerd` | | +| 43 МБ | 1.0% | 1278422 | `mcp-proxy --port 3101 -- mcpvault /vault` | MCP Obsidian | +| 39 МБ | 0.9% | 1397761 | `/usr/local/bin/balda start` | Balda | +| 36 МБ | 0.8% | 1289020 | `python3 /app/server.py ... --port 8890` | | +| 35 МБ | 0.8% | 590897 | `TorrServer-linux` (внутри Lampac) | | + +**~2.4 ГБ занято прикладными процессами из 4 ГБ.** Остаток — ядро, Docker, кэш. + +### Как опознан `dotnet Core.dll` + +```bash +# cgroup → контейнер +cat /proc/590428/cgroup +# 0::/system.slice/docker-c2273502a8692e8e9fe8948d8d5e923e37f6daa866a1c2dcca2dba02bed9fc90.scope +ls -l /proc/590428/cwd +# -> /lampac ← рабочий каталог контейнера Lampac +``` + +🔴 **`dotnet Core.dll` без имени = Lampac.** Lampac написан на .NET (.NET 10), процесс называется просто `dotnet Core.dll`. +Не искать заново — **это лампа**. Всё дерево Lampac (dotnet 598 + Playwright 99 + TorrServer 35) ≈ **730 МБ ≈ 18% RAM хоста**. + +## Железо и раскладка (проверено 2026-09-27) + +``` +NAME SIZE ROTA MOUNTPOINT TYPE +sda 1.8T 1 disk # TOSHIBA External USB 3.0 +└─sda1 1.8T 1 /srv/dev-disk-by-uuid-6194539b-03e0-4f33-986b-4da09834e82f part +mmcblk0 14.6G 0 disk # SD/eMMC +├─mmcblk0p1 512M 0 /boot/firmware part +└─mmcblk0p2 14.1G 0 / part +``` + +- **OS — на eMMC/SD** (`mmcblk0`, 14.6 ГБ). HDD `sda` — только `/srv`. +- `sda` — **вращающийся** (ROTA=1), внешний USB 3.0, 2000 ГБ. +- Разметка: **msdos**, **один раздел** `sda1` (ext4), занимает весь диск 1049kB→2000GB. +- Монтирование: `rw,relatime,quota,usrquota,grpquota`. +- Занято 1.1 ТБ, свободно **689 ГБ (61%)**. + +## План: swap-файл на HDD + +**Вопрос Alex: «На hdd возможно добавить свап не грохнув данные?» → ДА.** + +Обоснование безопасности: +- **689 ГБ свободно** — места с запасом. +- **Раздел один, менять разметку НЕ нужно** — swap-файл создаётся как обычный файл **внутри** ext4. +- `sda1` смонтирован `rw`. +- **Нулевой риск для данных**: существующие файлы не трогаются, разметка не меняется. + +Порядок: +1. Сначала снять приступ (load 60) — **нельзя регистрировать swap на задыхающейся машине**. +2. `dd`/`fallocate` swap-файл (4–8 ГБ) на `/srv/...`, `chmod 600`, `mkswap`, `swapon`. +3. ⚠️ **OMV управляет `/etc/fstab` сам** — ручная правка может быть перезаписана. + Регистрировать постоянно через OMV-совместимый механизм, НЕ руками в fstab. + +⚠️ **Swap на USB-HDD (ROTA=1) медленный.** Для страховки от OOM — годен. Как рабочий инструмент под нагрузкой — нет, повторно упрётся в I/O. + +## Диагностические команды (проверенные) + +```bash +ssh kraken "uptime; free -h" +ssh kraken "ps -eo rss,pmem,pcpu,pid,etime,args --sort=-rss | head -25" +ssh kraken "lsblk -o NAME,SIZE,ROTA,MOUNTPOINT,TYPE" +ssh kraken "ps -eo stat,pid,comm | awk '\$1 ~ /D/' | head -20" # D-state +ssh kraken "dmesg | grep -i -E 'I/O error|usb|sda|ata|EXT4|hung'" +ssh kraken "journalctl -p err -b --no-pager | grep -v monit | head -40" +ssh kraken "cat /proc//cgroup; ls -l /proc//cwd" # опознать скрытый процесс +``` + +🔴 **`timeout N ssh kraken ""` обязателен.** Команды, лезущие на HDD (`docker ps`, `find /srv`), +**виснут бесконечно** при заторе. Без `timeout` SSH-сессия повисает и съедает весь лимит инструмента. + +## Решения (по возрастанию эффекта) + +| # | Мера | Эффект | Риск | +|---|---|---|---| +| 1 | Остановить Lampac | сразу −730 МБ | лампа недоступна | +| 2 | Swap-файл на HDD | страховка от OOM | медленно, нужен OMV-совместимый монтаж | +| 3 | `mem_limit` для контейнеров (Lampac, FlareSolverr) | долговечно | правка compose + пересоздание | +| 4 | **Добавить RAM / переехать на хост 8–16 ГБ** | **единственное настоящее лечение** | деньги | + +🔴 **4 ГБ мало для этого стека.** На хосте одновременно: Mattermost + PostgreSQL + Balda + Jellyfin + +Home Assistant + Radarr + Prowlarr + Sonarr + FlareSolverr + Lampac (+Playwright +TorrServer) + +Hermes gateway + mcp-proxy + cloudflared + Portainer + xray + rclone + watchtower. +Это в 2–3 раза больше, чем 4 ГБ выдержат. + +## Открытые вопросы + +- [ ] Приступ 2026-09-27 не снят на момент записи (load 60, MM недоступен). +- [ ] Alex просил: остановить **Balda + Mattermost + mcp-proxy** (чтобы не стартовали) и **ребутнуть Кра́кен**. + Разведка заблокирована: `docker ps` виснет → **точные имена контейнеров, compose-файлы и restart-политики НЕ установлены**. +- [ ] Не выяснено, в одном ли compose Balda и MM. +- [ ] Не выяснено, где живёт `postgres` (системный или контейнер) — стартует ли сам при ребуте. +- [ ] Не проверено, какие кроны / вебхуки завязаны на Kraken-`hermes gateway` (Alex просил не трогать gateway и arr-стек). +- [ ] `folder2ram-hdd-bind.service` — разобрать отдельно (падал 2026-09-23). + +**Порядок дальнейших действий:** разведка (compose, имена, restart-политики) → бэкап/коммит перед правкой → +`docker stop` + `restart: no` для Balda/MM/mcp-proxy → проверка → ребут → проверка, что не встали → swap-файл. + +## Связанные документы + +- `personal/plans/lampac-kraken.md` — развёртывание Lampac (главный потребитель RAM) +- `personal/tech/kraken-media-inventory-facts.md` — цифры по диску и медиа +- `personal/projects/balda/balda-kraken-mm-deploy.md` — деплой Balda + MM +- `personal/plans/kraken-media-inventory-cleanup.md` — уборка медиа