top, htop, btop: живой мониторинг процессов
ps из предыдущего урока — снапшот. Запустил, увидел, ушёл. А если нужно смотреть, как меняется — здесь нужны интерактивные инструменты: top, htop, btop.
DE-задача номер один: сервер тормозит, надо понять, кто виноват. Открываешь top — и видишь живую картину: какой процесс ест CPU, какой память, сколько свободной памяти, какая нагрузка на систему.
top — классика, есть везде
top существует на любом UNIX-подобном с 1984 года. Он всегда установлен, даже на самом голом сервере. Запуск:
top
По умолчанию обновляется каждые 3 секунды. Выход — клавиша q.
Верхняя часть экрана — глобальная статистика:
top - 14:23:45 up 47 days, 3:12, 2 users, load average: 0.42, 0.51, 0.48
Tasks: 218 total, 1 running, 217 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.2 us, 1.1 sy, 0.0 ni, 95.6 id, 0.1 wa, 0.0 hi, 0.0 si, 0.0 st
MiB Mem : 31876.4 total, 8432.1 free, 15240.3 used, 8204.0 buff/cache
MiB Swap: 8192.0 total, 8090.4 free, 101.6 used. 16104.8 avail Mem
Разберём:
Верхняя часть top показывает состояние всей системы
Load average — самый важный сигнал
load average — это среднее число процессов в состоянии R или D за последние 1/5/15 минут. Грубо — насколько «загружена» система.
Правило: если load average > количества CPU-ядер — система перегружена.
# Сколько у тебя ядер
nproc
# 8
# Load 12.5 на 8 ядер = перегрузка
# Load 4.0 на 8 ядер = ок
# Load 0.5 на 8 ядер = расслабона
Три цифры (1м, 5м, 15м) показывают тренд. Если 1м=10.0, 5м=8.0, 15м=4.0 — нагрузка растёт. Если наоборот — снижается.
Высокий load average не всегда означает CPU bound. Процессы в D (disk wait) тоже считаются. Поэтому если load = 20, а %CPU idle = 80% — у вас bottleneck в дисках, а не в CPU.
Колонки и процессы в top
Нижняя часть — таблица процессов:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1300 postgres 20 0 245680 87232 12440 S 2.1 0.3 8:23.45 postgres
2800 levo 20 0 28432 18920 4320 R 1.2 0.1 0:00.32 python
Колонки PID, USER, VIRT (=VSZ), RES (=RSS), S (=STAT), %CPU, %MEM, COMMAND — те же, что у ps.
Новые:
- PR — priority. Базово 20 для обычных процессов.
- NI — nice value. От -20 (high prio) до 19 (low prio). Можно менять через
nice/renice. - TIME+ — CPU time с точностью до 1/100 секунды.
Hotkeys в top
Внутри top — горячие клавиши:
Что можно нажать когда top открыт
# Топ-5 по памяти не выходя из top
# 1. Запусти: top
# 2. Нажми M
# 3. Запиши себе глазами топ-5
# 4. q
# То же одной командой через batch mode
top -b -n 1 -o %MEM | head -12
# -b batch mode (не интерактивно)
# -n 1 один цикл
# -o %MEM сортировать по %MEM
htop — гораздо удобнее
htop — это улучшенный top: цвета, мышка, tree view, лёгкая фильтрация. Не идёт в стандартной поставке Ubuntu — нужно установить:
sudo apt install htop # Debian/Ubuntu
sudo dnf install htop # RHEL/Fedora
brew install htop # macOS
Запуск:
htop
Преимущества:
Почему htop удобнее даже для тех, кто привык к top
Главные F-клавиши в htop:
- F3 — поиск по имени процесса
- F4 — фильтр (показать только matching)
- F5 — toggle tree view (дерево родитель-потомок)
- F6 — сменить sort column
- F9 — kill (выбрать сигнал из меню)
- F10 — выход
Также работают M, P, T для быстрой сортировки.
Метрики через /proc: что читает top под капотом
btop — современный hipster-tool
btop — переписанный с нуля на C++ (раньше был bpytop на Python) современный мониторинг. Красивый UI, mouse, графики CPU/memory во времени.
sudo apt install btop # Ubuntu 26.04 / Debian 13 идёт с btop
brew install btop # macOS
Запуск:
btop
Что добавляет:
- Графики во времени — видно историю CPU/memory за последние минуты.
- GPU мониторинг — если есть NVIDIA/AMD.
- Network — графики траффика по интерфейсам.
- Disk I/O — графики чтения/записи.
Для DE на ноутбуке — btop приятен. На сервере по ssh может быть медленнее (много рендеринга), там лучше htop.
glances — мульти-system overview
glances — Python-приложение, показывает разом всё: CPU, mem, network, disk I/O, файловые системы, alerts. Полезно когда нужен «обзор системы целиком».
sudo apt install glances
glances
Glances умеет работать как сервер — поднять на сервере, и смотреть удалённо в браузере:
# На сервере
glances -w
# Открывает HTTP-сервер на порту 61208
# В браузере открываешь http://server:61208
DE-сценарий: дашборд для маленького homelab или dev-сервера, который смотришь раз в день.
Watch — превратить ps в «top»
Если установлен только ps (например, минимальный контейнер), можно сделать псевдо-top через watch:
# Запускает команду каждые 2 секунды
watch 'ps aux --sort=-%cpu | head'
# Чаще — каждую секунду
watch -n 1 'ps aux --sort=-%mem | head -10'
# Выделять различия (что изменилось)
watch -d 'ps -u postgres'
Выход из watch — Ctrl-C.
Это бывает удобно в Docker-контейнерах, где из утилит мониторинга есть только ps.
DE-сценарии
1. «У нас сервер тормозит, кто виноват»
# Шаг 1: глобальная картина
top
# Смотри: load average, %CPU, %MEM, %wa
# Если %wa высокий — bottleneck в I/O
# Если %us высокий — bottleneck в CPU (приложение)
# Если %sy высокий — bottleneck в ядре (syscall, контекст-свитчи)
# Шаг 2: топ-консумеров
# В top нажми M — топ по памяти. Запиши.
# Затем P — топ по CPU. Запиши.
# Шаг 3: детали выявленного процесса
ps -p <PID> -o pid,ppid,user,etime,%cpu,%mem,vsz,rss,cmd
2. «Airflow съел всю память»
# Все процессы airflow с памятью
ps -C airflow -o pid,rss,vsz,etime,cmd
# Суммарно
ps -C airflow -o rss --no-headers | awk '{sum+=$1} END {print sum/1024 " MB"}'
3. «Какой process тратит много CPU из-за GIL»
Открываете htop, нажимаете F5 (tree view), находите Python-процесс и его потомков. Возможно видите, что CPU грузит один thread, а остальные простаивают — классический Python GIL.
# В htop включи показ threads: H (Hide threads -> Show threads)
# Тогда видны все threads процесса, и какой % CPU каждый ест
4. «Зомби копятся — кто родитель?»
ps aux | awk '$8 ~ /Z/'
# Видишь зомби (PID), и его PPID
# Идёшь к PPID — лечишь его (обычно перезапуск)
Попробуй сам
# 1. Открой top и поэкспериментируй с hotkeys
top
# Внутри: нажми M, P, 1, c, u, q
# 2. Поставь htop и сравни
sudo apt install htop # Ubuntu/Debian
# или
sudo dnf install htop # Fedora
htop
# Нажми F5 — переключи в tree view
# F3 — найди процесс
# F10 — выход
# 3. Watch как процесс ps в режиме top
watch -n 1 'ps aux --sort=-%cpu | head -10'
# 4. Запусти что-то ресурсоёмкое и посмотри в top
yes > /dev/null &
# Это бесконечно пишет y в /dev/null, грузит CPU
top
# Найди процесс yes, посмотри %CPU
kill %1 # убей его (по job id, узнаешь в уроке 05)
# 5. Memory pressure
# В одном окне:
top
# Во втором:
python3 -c "x = ' ' * (500 * 1024 * 1024); input()"
# Это занимает 500MB. Найди в top, посмотри RSS
# 6. Простоял ли load average
uptime
# или
cat /proc/loadavg
# Сравни с количеством ядер: nproc
Cross-link: предыдущий урок 02 — ps. Следующий урок 04 — kill и сигналы. Модуль 13 — disk I/O детально, важно для понимания %wa.