[2026-09-27] eagle: personal/plans/lampac-kraken.md personal/tech/kraken-host-resource-limits.md

This commit is contained in:
Alexey Martemyanov committed 2026-09-27 10:46:42 +06:00
1 parent 89441662e5
commit 08cb8d8491
2 files changed
+231

No files matched your search

@@ -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/<PID>/cgroup; ls -l /proc/<PID>/cwd" # опознать скрытый процесс
```
🔴 **`timeout N ssh kraken "<cmd>"` обязателен.** Команды, лезущие на 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` — уборка медиа