Lecture preview

Процессы и ядро изнутри: от top до strace

Поднимаемся на уровень глубже обычных команд: что такое процесс с точки зрения ядра, откуда берётся Load Average, как работает OOM Killer, что скрывается за системным вызовом и почему у файла может быть несколько дескрипторов.

ps/top/htop Load Average и использование памяти сигналы и kill системные вызовы и strace inode и файловые дескрипторы ulimit
What you will learn in this lecture
  • Определить, какой процесс перегружает CPU/память, и корректно его остановить
  • Прочитать Load Average и объяснить, что стоит за каждым из трёх чисел
  • Проследить системные вызовы процесса через strace
  • Найти, какой процесс держит открытым нужный файл или порт
  • Настроить лимиты на количество открытых файлов для пользователя/сервиса

Beginning of the lecture

Load Average огромный, процессор свободен — и вы понятия не имеете почему

  • Высокий Load Average не всегда значит «процессор перегружен»
  • top показывает цифры, но не объясняет их причину
  • Сегодня — разбираемся, что на самом деле стоит за этими цифрами

Пользователи жалуются: сайт отвечает по десять секунд. Открываете top — Load Average зашкаливает, а процессор при этом почти простаивает. Цифры есть, объяснения нет. Знакомых команд для просмотра процессов вам хватало, пока всё работало быстро — сегодня выясняем, что на самом деле происходит внутри системы, когда что-то идёт не так.

ps, top и htop: три способа посмотреть на процессы живьём

  • ps aux — снимок всех процессов на момент запуска команды
  • top — тот же снимок, но обновляется на лету
  • htop — то же самое, но удобнее для человека (цвета, мышь, дерево)

ps показывает список процессов один раз, ровно на момент запуска команды — статичный снимок. top показывает почти то же самое, но обновляет экран каждые несколько секунд, превращая снимок в живое наблюдение. htop — это тот же top, только с человеческим лицом: цвета, прокрутка, дерево родитель-потомок и управление мышью, без необходимости запоминать горячие клавиши.

# Снимок всех процессов прямо сейчас
ps aux

# Живое обновление раз в пару секунд
top

# То же самое, но с деревом процессов и цветом
htop

Буква рядом с процессом — это не мусор, а его реальное состояние

  • R (Running) — выполняется или ждёт своей очереди на CPU
  • S (Sleeping) — ждёт события, можно прервать в любой момент
  • D (Uninterruptible sleep) — ждёт диск, нельзя прервать вообще

Рядом с каждым процессом в top стоит буква состояния, и она говорит больше, чем кажется. R значит, что процесс либо реально работает, либо стоит в очереди на процессор. S — процесс спит, ожидая события, и его можно прервать в любой момент. А вот D — это сон, который прервать нельзя никак: процесс ждёт ответа от диска и в этот момент даже не реагирует на сигналы.

# Статус конкретного процесса
cat /proc/1234/status | grep State
# State: D (disk sleep)

ps aux | grep " D "   # найти все процессы в непрерываемом сне

The full lecture is available with a subscription

24 more slides in the full version.

The video, all slides, notes, tests, AI tutor and interview unlock after you sign in and subscribe.

Sign in or register Get a subscription

Lecture contents

  1. Load Average огромный, процессор свободен — и вы понятия не имеете почему
  2. ps, top и htop: три способа посмотреть на процессы живьём
  3. Буква рядом с процессом — это не мусор, а его реальное состояние
  4. Зомби-процесс: он уже мёртв, но всё ещё занимает место в таблице
  5. SIGTERM и SIGKILL — это не два флага одной команды, а совсем разные просьбы
  6. Грабли: kill -9 первым делом — и потерянные данные вдобавок к зависанию
  7. nice и renice: указываем ядру, кому уступать процессор в первую очередь
  8. free -m: четыре числа, и «мало свободной памяти» — почти всегда не проблема
  9. Page Cache: занятая память, которую ядро отдаст обратно за миллисекунды
  10. SWAP: диск вместо памяти — работает, но обманчиво медленно
  11. OOM Killer: когда памяти совсем не осталось, кто-то должен умереть
  12. Load Average: три числа — это очередь, а не только загрузка процессора
  13. Куда смотреть, если LA высокий, а CPU почти свободен
  14. ❓ Стоп-проверка: LA=12, процессор простаивает, а kill -9 не помогает
  15. 💡 Разбор: процесс в состоянии D не видит сигналов вообще, даже SIGKILL
  16. Системный вызов: единственная дверь из программы в ядро
  17. Что реально происходит, когда вы набираете команду ls
  18. strace: видеокамера, направленная на разговор программы с ядром
  19. strace с фильтром: не весь шум, а только то, что вас интересует
  20. inode: настоящий адрес файла на диске, а не его имя
  21. Диск не полный, а файл не создаётся: закончились не байты, а inode
  22. Файловый дескриптор: номер, через который процесс общается с миром
  23. lsof: кто именно держит открытым этот файл или этот порт
  24. Реальная задача: перенести сервис, о котором известен только порт
  25. ulimit и limits.conf: лимиты не только для развлечения дескрипторов
  26. Проект «Пиксель»: пишем скрипт-наблюдатель за ресурсами
  27. Дальше — а хватает ли Пикселю вообще места на диске

Articles on this lecture

All lectures in this course

  1. Linux: с нуля до уверенного администрирования
  2. Как устроена файловая система Linux: от корня до загрузки ядра
  3. Пользователи, права доступа и sudo: кто и что может делать в системе
  4. Bash-скрипты: от команды в терминале до рабочего скрипта автоматизации
  5. Пакеты, окружение и первая автоматизация: apt, профиль и cron
  6. Обработка текста и данных в терминале: grep, sed, awk, jq и curl
  7. Процессы и ядро изнутри: от top до strace
  8. Диски, разделы и хранилище: от lsblk до LVM и RAID
  9. systemd: как на самом деле запускаются сервисы в современном Linux
  10. Журналы и мониторинг: journald, rsyslog и sysstat
  11. Сеть в Linux: от IP-адреса до сокета и DNS
  12. Удалённый доступ и сетевые хранилища: SSH, rsync, NFS и SMB
  13. Firewall и защита сервера: ufw, nftables, fail2ban и GPG
  14. Финал: собираем защищённый и автоматизированный сервер целиком