12 KiB
Executable File
title, created, updated, type, namespace, status, tags, related
| title | created | updated | type | namespace | status | tags | related | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Кра́кен — исчерпание ресурсов хоста (RAM / HDD I/O) | 2026-09-27 | 2026-09-27 | tech | personal | open-incident |
|
|
Кра́кен — исчерпание ресурсов хоста (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
# 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 ГБ). HDDsda— только/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.- Нулевой риск для данных: существующие файлы не трогаются, разметка не меняется.
Порядок:
- Сначала снять приступ (load 60) — нельзя регистрировать swap на задыхающейся машине.
dd/fallocateswap-файл (4–8 ГБ) на/srv/...,chmod 600,mkswap,swapon.- ⚠️ OMV управляет
/etc/fstabсам — ручная правка может быть перезаписана. Регистрировать постоянно через OMV-совместимый механизм, НЕ руками в fstab.
⚠️ Swap на USB-HDD (ROTA=1) медленный. Для страховки от OOM — годен. Как рабочий инструмент под нагрузкой — нет, повторно упрётся в I/O.
Диагностические команды (проверенные)
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 + MMpersonal/plans/kraken-media-inventory-cleanup.md— уборка медиа