Процессы и ядро изнутри: от top до strace
Поднимаемся на уровень глубже обычных команд: что такое процесс с точки зрения ядра, откуда берётся Load Average, как работает OOM Killer, что скрывается за системным вызовом и почему у файла может быть несколько дескрипторов.
- Определить, какой процесс перегружает CPU/память, и корректно его остановить
- Прочитать Load Average и объяснить, что стоит за каждым из трёх чисел
- Проследить системные вызовы процесса через strace
- Найти, какой процесс держит открытым нужный файл или порт
- Настроить лимиты на количество открытых файлов для пользователя/сервиса
강의 시작 부분
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 " # найти все процессы в непрерываемом сне
전체 강의는 구독 후 이용 가능
전체 버전에는 24개의 슬라이드가 더 있습니다.
로그인하고 구독하면 영상, 모든 슬라이드, 노트, 테스트, AI 튜터, 면접을 이용할 수 있습니다.
로그인 또는 회원가입 구독하기강의 목차
- Load Average огромный, процессор свободен — и вы понятия не имеете почему
- ps, top и htop: три способа посмотреть на процессы живьём
- Буква рядом с процессом — это не мусор, а его реальное состояние
- Зомби-процесс: он уже мёртв, но всё ещё занимает место в таблице
- SIGTERM и SIGKILL — это не два флага одной команды, а совсем разные просьбы
- Грабли: kill -9 первым делом — и потерянные данные вдобавок к зависанию
- nice и renice: указываем ядру, кому уступать процессор в первую очередь
- free -m: четыре числа, и «мало свободной памяти» — почти всегда не проблема
- Page Cache: занятая память, которую ядро отдаст обратно за миллисекунды
- SWAP: диск вместо памяти — работает, но обманчиво медленно
- OOM Killer: когда памяти совсем не осталось, кто-то должен умереть
- Load Average: три числа — это очередь, а не только загрузка процессора
- Куда смотреть, если LA высокий, а CPU почти свободен
- ❓ Стоп-проверка: LA=12, процессор простаивает, а kill -9 не помогает
- 💡 Разбор: процесс в состоянии D не видит сигналов вообще, даже SIGKILL
- Системный вызов: единственная дверь из программы в ядро
- Что реально происходит, когда вы набираете команду ls
- strace: видеокамера, направленная на разговор программы с ядром
- strace с фильтром: не весь шум, а только то, что вас интересует
- inode: настоящий адрес файла на диске, а не его имя
- Диск не полный, а файл не создаётся: закончились не байты, а inode
- Файловый дескриптор: номер, через который процесс общается с миром
- lsof: кто именно держит открытым этот файл или этот порт
- Реальная задача: перенести сервис, о котором известен только порт
- ulimit и limits.conf: лимиты не только для развлечения дескрипторов
- Проект «Пиксель»: пишем скрипт-наблюдатель за ресурсами
- Дальше — а хватает ли Пикселю вообще места на диске
이 강의 관련 글
- 리눅스란 무엇인가: 커널, 배포판, 파일 시스템을 쉽게 설명합니다
- 리눅스 명령어 정리: 초보자와 관리자를 위한 치트시트
- SSH 키 설정: 서버에 비밀번호 없이 로그인하기
- 리눅스 파일 권한: chmod, chown, sudo 예제로 이해하기
- systemd란 무엇이며 어떻게 동작하고 리눅스 서비스를 관리하는지
이 강좌의 모든 강의
- Linux: с нуля до уверенного администрирования
- Как устроена файловая система Linux: от корня до загрузки ядра
- Пользователи, права доступа и sudo: кто и что может делать в системе
- Bash-скрипты: от команды в терминале до рабочего скрипта автоматизации
- Пакеты, окружение и первая автоматизация: apt, профиль и cron
- Обработка текста и данных в терминале: grep, sed, awk, jq и curl
- Процессы и ядро изнутри: от top до strace
- Диски, разделы и хранилище: от lsblk до LVM и RAID
- systemd: как на самом деле запускаются сервисы в современном Linux
- Журналы и мониторинг: journald, rsyslog и sysstat
- Сеть в Linux: от IP-адреса до сокета и DNS
- Удалённый доступ и сетевые хранилища: SSH, rsync, NFS и SMB
- Firewall и защита сервера: ufw, nftables, fail2ban и GPG
- Финал: собираем защищённый и автоматизированный сервер целиком