Модуль 6.3: Відлагодження процесів
Вирішення проблем | Складність:
[COMPLEX]| Час: 30–35 хв
Передумови
Розділ «Передумови»Перед початком цього модуля:
- Обов’язково: Модуль 1.2: Процеси та systemd
- Обов’язково: Модуль 6.2: Аналіз логів
- Бажано: Розуміння концепції системних викликів (syscalls).
Що ви зможете робити після цього модуля
Розділ «Що ви зможете робити після цього модуля»Після завершення цього модуля ви зможете:
- Діагностувати зависання процесів, падіння та витоки ресурсів за допомогою strace, lsof та /proc
- Відстежити системні виклики, щоб зрозуміти, що процес насправді робить
- Визначити витоки файлових дескрипторів, зомбі-процеси та застряглі операції I/O
- Дебажити процеси контейнерів, входячи в їхній простір імен за допомогою nsenter
Чому цей модуль важливий
Розділ «Чому цей модуль важливий»Коли логів недостатньо, потрібно дивитися глибше. Відлагодження процесів дозволяє побачити, що саме програма робить у цю секунду: які файли відкриває, які системні виклики робить і де саме вона “зависла”.
Розуміння відлагодження процесів допоможе вам:
- Розбирати «чорні скриньки» — розуміти роботу програм без доступу до їхнього коду.
- Знаходити причини зависань — чому цей процес нічого не робить?
- Відстежувати помилки — який саме виклик завершився збоєм і чому?
- Аналізувати поведінку — що насправді відбувається під час виконання?
Іноді єдиний спосіб зрозуміти проблему — це подивитися на процес у дії.
Файлова система /proc
Розділ «Файлова система /proc»Кожен запущений процес має свою віртуальну папку в /proc/<PID>/. Це вікно у внутрішній світ процесу.
Важливі файли в /proc:
Розділ «Важливі файли в /proc:»- cmdline — команда, якою було запущено процес.
- cwd — посилання на поточну робочу директорію.
- environ — змінні оточення процесу.
- exe — посилання на файл програми на диску.
- fd/ — папка з усіма відкритими файлами (file descriptors).
- limits — ліміти ресурсів (макс. кількість файлів тощо).
- status — статус процесу в зрозумілому для людини виді.
# Порахувати кількість відкритих файлів для процесуls /proc/1234/fd/ | wc -lstrace: Перехоплення системних викликів
Розділ «strace: Перехоплення системних викликів»strace — це найпотужніший інструмент для дебагу. Він показує кожен системний виклик, який програма робить до ядра.
Основні команди:
Розділ «Основні команди:»# Відстежити виконання команди з нуляstrace ls /tmp
# Підключитися до вже запущеного процесуstrace -p 1234
# Тільки виклики, пов'язані з мережеюstrace -e trace=network curl google.com
# Тільки виклики, пов'язані з файламиstrace -e trace=file cat /etc/passwd
# Підрахувати кількість викликів та час (статистика)strace -c -p 1234Стани процесів (Process States)
Розділ «Стани процесів (Process States)»Ви побачите літери у колонці STAT команди ps aux.
┌─────────────────────────────────────────────────────────────┐│ СТАНИ ПРОЦЕСІВ │├─────────────────────────────────────────────────────────────┤│ ││ R - Running (працює або чекає на CPU) ││ S - Sleeping (спить, чекає на подію — це нормально) ││ D - Uninterruptible sleep (чекає на ввід/вивід — погано!) ││ Z - Zombie (завершений, але не прибраний батьком) ││ T - Stopped (зупинений сигналом) ││ │└─────────────────────────────────────────────────────────────┘Стан D є найнебезпечнішим. Якщо ви бачите процес у стані D — він завис на операції з диском або мережевим сховищем (NFS). Такий процес неможливо вбити навіть через kill -9.
lsof: Список відкритих файлів
Розділ «lsof: Список відкритих файлів»В Linux “усе є файлом”, тому lsof показує і звичайні файли, і мережеві з’єднання.
# Всі файли, відкриті конкретним процесомlsof -p 1234
# Хто зараз використовує 80-й порт?sudo lsof -i :80
# Всі мережеві з'єднання в системіlsof -iТест
Розділ «Тест»-
Яка команда Linux показує всі системні виклики, які робить програма?
Відповідь
`strace`. -
Що означає стан ‘Z’ (Zombie) у списку процесів?
Відповідь
Процес завершив свою роботу, але його батьківський процес ще не прочитав його статус виходу. Зомбі не споживають ресурсів, але займають місце в таблиці PID. -
Як за допомогою
lsofзнайти процес, що займає конкретний мережевий порт?Відповідь
`lsof -i :<номер_порту>`. Наприклад: `lsof -i :8080`. -
Процес знаходиться у стані ‘D’ і не реагує на
kill -9. Чому?Відповідь
Стан 'D' (Uninterruptible sleep) означає, що процес чекає на відповідь від ядра (зазвичай ввід/вивід на диск). В такому стані він не може обробляти сигнали, поки ядро не завершить операцію.
Практична вправа
Розділ «Практична вправа»Завдання: Навчитися бачити дії програми “під капотом”.
- Подивіться, які конфіги читає команда
id:Terminal window strace -e openat id - Знайдіть всі відкриті файли вашої поточної оболонки:
Terminal window lsof -p $$ - Подивіться на ліміти ресурсів вашого процесу:
Terminal window cat /proc/$$/limits - Підрахуйте статистику системних викликів для команди
find /etc:Terminal window strace -c find /etc
Критерії успіху: Ви вмієте підключатися до процесів через strace та знаходити відкриті ними ресурси.
Підсумок
Розділ «Підсумок»- /proc — база даних про всі процеси в реальному часі.
- strace — перехоплення спілкування програми з ядром.
- lsof — пошук власників відкритих файлів та портів.
- Стан D — головна ознака проблем із дисками або мережевими дисками.
Далі: Модуль 6.4: Відлагодження мереж — навчіться розв’язувати проблеми зі зв’язком за допомогою tcpdump.