[2026-09-27] eagle: personal/plans/lampac-kraken.md personal/tech/kraken-host-resource-limits.md
This commit is contained in:
1 parent
89441662e5
commit
08cb8d8491
2 files changed
+231
No files matched your search
@@ -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
|
||||
|
||||
@@ -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` — уборка медиа
|
||||
Reference in new issue
Block a user