Linux зависає? Довідник з командами для діагностики

Linux зависає? Довідник з командами для діагностики

Колись вранці підходиш до компʼютера, а він не реагує — миша мертва, клавіатура не пише, екран ніби живий, але нічого не клікається. Жорсткий ребут. І ось ти знов працюєш, але питання залишається: що це було? Чи повториться?

Збираю сюди команди, які реально працюють, щоб наступного разу не гуглити з нуля. Тестовано на Ubuntu 24.04, але майже все актуально для будь-якого systemd-based дистрибутиву.


0. Спочатку — що саме сталося?

Перевірити, чи був реальний краш (жорсткий ребут):

Шукаємо crash поряд із сесією користувача — це означає, що система не була коректно вимкнута:

Подивитися список усіх завантажень:

Тут -1 — це попередня сесія (та, що крашнулась), 0 — поточна.


1. Логи попередньої сесії

Найкорисніша команда для діагностики — логи саме того завантаження, що завершилось крашем:

  • -k — тільки повідомлення ядра
  • -b -1 — попереднє завантаження
  • tail -200 — останні 200 рядків перед крашем

Важливо: якщо локаль українська (як у мене), команди типу --since "yesterday" не парсяться. Тоді використовуй ISO-формат:


2. OOM-killer — чи зʼїли всю памʼять?

Найчастіша причина крашу при роботі з Docker і важкими процесами:

Якщо побачиш щось подібне — діагноз готовий:

Тут видно: процес PHP зʼїв ~30 ГБ RAM (anon-rss), і ядро його прибило. Зазвичай це означає витік памʼяті в коді або відсутність лімітів на Docker-контейнер.


3. Зависання без OOM

Якщо grep по OOM мовчить, але система все одно впала — шукаємо інші ознаки:

Що тут шукаємо:

  • hung_task — процес завис на 120+ секунд
  • soft lockup / hard lockup — CPU не відповідає
  • BUG: / Oops: — баг в ядрі
  • watchdog — нічого не отримував сигналу життя від системи

Окремо корисний пошук — попередження systemd-watchdog у user-space:

Якщо побачиш щось на кшталт:

— це означає, що планувальник ядра десь надовго застряг. Часта причина — драйвери (особливо GPU).


4. Проблеми з графічним драйвером

Класичний симптом — миша/клавіатура мертві, але система ніби жива:

Перевірити, який саме драйвер NVIDIA встановлений:

Подивитись, які драйвери доступні для твоєї карти:

Якщо рекомендований драйвер свіжіший за встановлений — це може бути причиною. Старі legacy-драйвери (наприклад, NVIDIA 470) часто не дружать з новими ядрами 6.8+.


5. Диски та файлова система

Перевірити помилки I/O:

Стан SMART дисків:

Якщо побачиш FAILED у Health або ненульові Reallocated_Sector_Ct / Current_Pending_Sector — диск починає сипатися.


6. Температура та залізо

Встановити lm-sensors:

Глянути, чи були в логах попередження про перегрів:

Нормальні температури: CPU під навантаженням до 80°C, у спокої 30-50°C. Якщо бачиш CPU temperature above threshold — це перегрів, треба чистити кулери.


7. Памʼять та swap зараз

Топ памʼятежерливих процесів:

Для Docker:

В колонці LIMIT має бути конкретне число для кожного контейнера. Якщо там обсяг всієї системи (31.3GiB) — ліміт не виставлений, і один збожеволілий контейнер може покласти хост.


8. Полагодити NTFS після жорсткого ребуту

Після крашу системи Windows-розділи часто залишаються в “брудному” стані:

Якщо є файл гібернації:

На майбутнє: вимкни в Windows Fast Startup, інакше NTFS завжди буде “брудним” для Linux.


9. Заходи профілактики

earlyoom — захист від OOM до того, як ядро здасться

Звичайний OOM-killer ядра спрацьовує надто пізно — коли система вже у memory thrashing і повністю не реагує. earlyoom стежить за памʼяттю і прибиває процеси раніше:

За замовчуванням посилає SIGTERM при ≤10% вільної памʼяті і SIGKILL при ≤5%.

Ліміти для Docker-контейнерів

У docker-compose.yml для кожного сервісу:

Важливо: memswap_limit рівний mem_limit означає, що swap для контейнера ВИМКНЕНИЙ. Це навмисно — без swap OOM-killer спрацює одразу, і не буде сценарію “поступово свопимо до повного thrashing”.

Перевірка після перезапуску:

Постійний journal між ребутами

Якщо логи попередніх сесій не зберігаються — увімкни персистентне зберігання:

Після цього journalctl -b -1, -b -2 тощо працюватимуть для попередніх завантажень.

Збільшити swap (якщо мало)

2 ГБ swap на 32 ГБ RAM — це майже немає swap. Краще 8-16 ГБ:

І знизити swappiness, щоб swap використовувався рідше:


10. Якщо dpkg застряг після крашу

Жорсткий ребут міг лишити пакети в недоконфігурованому стані:

Після цього apt install має знову працювати.


11. Швидкий чек-лист при наступному крашу

  1. last -x | head — чи був краш
  2. journalctl --list-boots — який boot id потрібен
  3. journalctl -k -b -1 | grep -iE "oom|killed process" — OOM?
  4. journalctl -k -b -1 | grep -iE "hung_task|BUG:|panic|watchdog|lockup" — зависання ядра?
  5. journalctl -k -b -1 | grep -iE "drm|gpu|nvidia" — драйвер?
  6. journalctl -k -b -1 | tail -100 — останні події перед крашем
  7. sensors — температури зараз
  8. docker stats --no-stream — стан контейнерів
  9. sudo smartctl -a /dev/sda — здоровʼя дисків

Висновок

Linux дуже відвертий зі своїми логами — він майже завжди розповідає, від чого помер. Треба лише знати, як спитати. У 90% випадків відповідь є в journalctl -k -b -1, і її можна знайти за 10 хвилин.

Найчастіші причини крашу (з мого досвіду):

  1. OOM від Docker-контейнера без ліміту — PHP/Node з витоком памʼяті
  2. Драйвер GPU — особливо стара NVIDIA на свіжому ядрі
  3. Перегрів — забиті кулери, пересохла термопаста
  4. Диск помирає — повільне зависання при I/O

Профілактика проста: earlyoom + ліміти на контейнери + персистентний journal + регулярна чистка системи. Це 15 хвилин роботи разово і годинами зекономленого часу пізніше.

Залишити відповідь

Ваша e-mail адреса не оприлюднюватиметься. Обов’язкові поля позначені *