Learning Platform
Глоссарий Troubleshooting
Урок 11.03 · 20 мин
Начальный
tophtopbtopglancesmonitoringload average

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

Разберём:

Header top — что показывает

Верхняя часть top показывает состояние всей системы

uptimeСколько система работает без перезагрузки. 47 дней — стандартный долгоиграющий сервер
usersСколько пользователей сейчас залогинено через ssh/console
load avgLoad average за 1, 5, 15 минут. Грубо — сколько процессов в R+D состоянии в среднем
tasksВсего процессов в системе, по состояниям
runningСейчас в R (running/runnable). Обычно 0-2
sleepingВ S (sleeping). Большинство обычно тут
zombieZ (zombie). Должно быть 0. Если растёт — кто-то не вызывает wait()
us %User CPU — CPU тратится на user-space код (Postgres, Airflow, ваш скрипт)
sy %System CPU — CPU в ядре (syscall, drivers, schedulers). Если высокий — много I/O или syscall
id %Idle — CPU простаивает. На спокойной системе — большая часть
wa %I/O wait — CPU ждёт диск/сеть. Если высокое — bottleneck в I/O

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 — нагрузка растёт. Если наоборот — снижается.

NOTE

Высокий 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 — горячие клавиши:

Hotkeys в top

Что можно нажать когда top открыт

MSort by %MEM. Сразу видно, кто ест больше всего памяти
PSort by %CPU. По умолчанию top именно так и сортирует
TSort by TIME+ (CPU time с начала)
NSort by PID
1Toggle per-CPU view. По умолчанию показывает агрегированно. Нажми 1 — увидишь по каждому ядру отдельно
cToggle full command. По умолчанию показывает только имя бинаря — c показывает полную командную строку
uFilter by user. Спросит имя — оставит только процессы этого пользователя
kKill. Спросит PID и сигнал. Удобно прибить процесс не выходя из top
rRenice. Изменить nice value процесса
dChange refresh delay. По умолчанию 3.0 секунд
hHelp screen — все hotkeys
qQuit
# Топ-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 vs top — отличия

Почему htop удобнее даже для тех, кто привык к top

ЦветаCPU/memory bars показаны цветом — user vs system vs cache. Намного быстрее парсить глазами
МышкаМожно кликать мышкой по процессам и колонкам
Tree viewF5 переключает в tree mode — видна иерархия родитель-потомок. Полезно понять, какой процесс кого породил
F-keysF-клавиши снизу: F1 help, F2 setup, F3 search, F4 filter, F5 tree, F6 sort, F9 kill, F10 quit
ПоискF3 — поиск по имени. Подсвечивает процесс. F3 -> дальше
ФильтрF4 — фильтрация по имени. Показывает только matching процессы

Главные 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.


Проверка знанийKnowledge check
На сервере с 8 CPU-ядрами вы видите в top: load average 12.5, %us 5.0, %sy 1.0, %id 90.0, %wa 4.0. Какой главный вывод о состоянии системы и где bottleneck?
ОтветAnswer
Load average 12.5 на 8 ядер означает перегрузку: load > nproc. Однако смотрим на CPU usage: id (idle) = 90%, us (user) = 5%, sy (system) = 1% — CPU простаивает! При этом wa (I/O wait) = 4.0% — выглядит небольшой, но в сочетании с высоким load average ясно: процессы стоят в состоянии D (uninterruptible disk wait), которое тоже считается в load average. Bottleneck — не в CPU, а в дисковой подсистеме. Нужно искать процессы в D через ps aux и проверять состояние дисков через iostat или iotop. Возможные причины: умирающий диск, висящий NFS-mount, сломанный iSCSI. Это типичный паттерн: high load + idle CPU = disk I/O проблема.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. В top видно: load average 0.42, 0.51, 0.48 на сервере с 8 CPU-ядрами. Что это значит?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5