Linux: команда top и htop

Как читать вывод, что означают цифры и где искать причину проблемы

Содержание

  1. Зачем нужен top
  2. Запуск и первый взгляд
  3. Верхняя часть: заголовок
  4. Строка Load average
  5. Строка Tasks: состояния процессов
  6. Строка %Cpu: расшифровка каждого поля
  7. Строки памяти: Mem и Swap
  8. Таблица процессов: колонки
  9. Клавиши управления
  10. Параметры запуска и полезные режимы
  11. htop: что добавляет
  12. Практика: разбираем типичные ситуации
  13. Лайфхаки
  14. Шпаргалка

1. Зачем нужен top

top — это интерактивный монитор процессов и ресурсов системы. Он отвечает на три вопроса, которые задают себе администраторы при любом инциденте:

Команда есть почти везде: в любом дистрибутиве Linux она установлена по умолчанию. Поэтому её знание — базовый навык, который спрашивают на собеседованиях и который спасает, когда нет графического интерфейса и доступен только SSH.

Простыми словамиtop — это «приборная панель» сервера. Заголовок — общие показания приборов, таблица ниже — список того, что сейчас потребляет ресурсы.

2. Запуск и первый взгляд

top            # интерактивный режим
htop           # улучшенная версия (если установлена)
top -bn1 | head -n 20    # один снимок, удобно для скриптов и логов

После запуска экран делится на две части: сверху заголовок с общими показателями, снизу таблица процессов, отсортированная по загрузке CPU.

top - 14:02:11 up 12 days, 3 users, load average: 0.42, 0.37, 0.31 Tasks: 187 total, 1 running, 186 sleeping, 0 stopped, 0 zombie %Cpu(s): 3.1 us, 1.2 sy, 0.0 ni, 95.4 id, 0.2 wa, 0.0 hi, 0.1 si MiB Mem : 7982.1 total, 512.4 free, 2140.7 used, 5329.0 buff/cache PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 4312 www-data 20 0 412344 98120 9812 S 4.3 1.2 12:41.02 nginx 1187 postgres 20 0 1204512 310220 88012 S 2.0 3.8 80:12.55 postgres 882 root 20 0 210988 22010 8120 S 0.7 0.3 3:01.87 sshd 1 root 20 0 169584 13552 8400 S 0.0 0.2 0:12.44 systemd Заголовок (сверху): общая картина. Таблица (снизу): кто что потребляет.
Схема экрана top: верхний блок — показатели системы, нижний — таблица процессов (пример вывода условный)

3. Верхняя часть: заголовок

Первая строка — время, аптайм, количество пользователей и load average. Далее идут строки Tasks, %Cpu, Mem и Swap. Рассмотрим их по порядку.

СтрокаЧто показывает
top - 14:02:11 up 12 days, 3 usersТекущее время, сколько система работает без перезагрузки, число вошедших пользователей
load average: 0.42, 0.37, 0.31Средняя очередь задач за 1, 5 и 15 минут
Tasks: ...Количество процессов и их состояния
%Cpu(s): ...Распределение времени процессора по категориям
MiB Mem / MiB SwapСостояние оперативной памяти и файла подкачки

4. Строка load average

Load average — число, которое часто путают с процентом загрузки. На самом деле это средняя длина очереди задач, которые либо выполняются, либо ждут выполнения. Значений три: за последнюю минуту, за пять и за пятнадцать минут.

nproc                       # сколько ядер у системы
cat /proc/loadavg           # тот же load average в сыром виде
Правило большого пальцаСравнивайте load с количеством ядер. На 4 ядрах load 3–4 — нормальная работа под полной нагрузкой, load 10 — серьёзная перегрузка.

5. Строка Tasks: состояния процессов

Строка показывает, сколько процессов в каждом состоянии. Главные:

СостояниеЗначениеЧто делать, если много
runningВыполняется на процессоре или готов выполнятьсяНорма для нагруженной системы, проверяйте %Cpu
sleepingЖдёт события: сеть, таймер, ввод пользователяНорма, большинство процессов в этом состоянии
stoppedОстановлен сигналом (например, Ctrl+Z)Вернуть через fg или завершить
zombieЗавершился, но родитель не забрал код возвратаИсправить родительский процесс или перезапустить его

В выводе также встречается состояние D (uninterruptible sleep) — процесс ждёт диск и не может быть прерван даже сигналом SIGKILL. Большое число D — признак проблем с дисковой подсистемой или зависшей NFS-монтировкой.

6. Строка %Cpu: расшифровка каждого поля

Это главная строка для понимания нагрузки процессора. Пример: %Cpu(s): 3.1 us, 1.2 sy, 0.0 ni, 95.4 id, 0.2 wa, 0.0 hi, 0.1 si, 0.0 st. Все значения — проценты времени процессора за последний интервал, в сумме дают 100%.

us us — пользовательские программы sy — ядро (системные вызовы) wa — ожидание диска (CPU простаивает) id — простой (idle) ni — процессы с изменённым приоритетом (nice) hi / si — прерывания (аппаратные / программные) st — steal: гипервизор отбирает CPU у виртуалки Одна полоса = 100% процессорного времени
Схема распределения времени CPU: цвета условные, важны пропорции и смысл полей
ПолеРасшифровкаКогда важно
us (user)Время в пользовательском коде приложенийВысокий us — приложение много считает: ищите процесс в таблице
sy (system)Время в ядре: системные вызовы, сеть, файловая системаВысокий sy при большом числе соединений или I/O — повод смотреть на сеть и диск
ni (nice)Время процессов с ручным приоритетомОбычно ноль, если кто-то не менял приоритеты через nice
id (idle)Простой процессораНизкий id — процессор занят. Высокий id при высоком load — проблема с I/O
wa (iowait)Процессор ждёт завершения операций ввода-выводаУстойчиво выше 10–20% — медленный диск или перегруженная база
hi / siОбработка аппаратных и программных прерыванийВысокий si бывает при интенсивной сетевой нагрузке
st (steal)Время, которое гипервизор отдал другим виртуалкамЗаметный steal в облаке — перегрузка хоста, помочь может только провайдер или другой тариф
Частая ошибкаВысокий %CPU у процесса и высокий us — не одно и то же по смыслу. Процесс может быть «горячим» из-за ядра (sy), а не из-за своего кода. Смотрите оба поля.

7. Строки памяти: Mem и Swap

MiB Mem :  7982.1 total,   512.4 free,  2140.7 used,  5329.0 buff/cache
MiB Swap:  2048.0 total,  2048.0 free,     0.0 used.  5512.3 avail Mem
Смотрите на avail Mem, а не на freeЕсли free близок к нулю, но avail Mem большой, системе памяти хватает. Тревожиться стоит, когда падает avail Mem и растёт использование swap.
used buff/cache доступно (avail) free Память, которую можно освободить под приложения: free + часть buff/cache. Именно её показывает avail Mem. Кэш занимает память не зря: он ускоряет чтение с диска и отдаётся приложениям по требованию.
Как распределена память: свободная память почти всегда мала, потому что система держит кэш

Swap — файл или раздел на диске, куда ядро выгружает редко используемые страницы памяти. Небольшое использование swap нормально. Опасны признаки активной подкачки: растущее used в Swap и высокий wa одновременно — система «ходит» по диску и тормозит.

free -h          # та же картина в удобном виде
vmstat 1 5       # колонки si и so: сколько страниц читается и пишется в swap за секунду

8. Таблица процессов: колонки

КолонкаРасшифровка
PIDИдентификатор процесса. Нужен для kill, renice, strace
USERПользователь, от которого запущен процесс
PR (priority)Приоритет планировщика ядра. Для обычных процессов обычно 20
NI (nice)Настройка приоритета пользователем: от -20 (самый высокий) до 19 (самый низкий)
VIRTВся виртуальная память процесса, включая то, что не загружено. Сильно больше реального потребления, мало о чём говорит
RES (resident)Физическая память, которую процесс реально держит. Главный показатель потребления памяти
SHRЧасть RES, которая общая с другими процессами (библиотеки)
S (state)Состояние: R — выполняется, S — спит, D — ждёт диск, Z — зомби, T — остановлен
%CPUДоля процессорного времени за последний интервал. Может быть больше 100% на многоядерных системах
%MEMДоля физической памяти от общего объёма
TIME+Общее процессорное время, которое процесс уже использовал
COMMANDИмя программы или команда запуска
Как понять колонку VIRTПрограммы часто резервируют большие объёмы виртуальной памяти, которые не используют. Поэтому смотрите на RES и %MEM, а не на VIRT.

9. Клавиши управления

Все команды работают прямо в интерактивном режиме. Экран не блокирует работу, поэтому можно сортировать, фильтровать и завершать процессы.

КлавишаДействие
qВыход
1Показать загрузку каждого ядра отдельно
t / mПереключить вид строк CPU и памяти (графика или цифры)
PСортировать по %CPU
MСортировать по памяти
TСортировать по TIME+
kОтправить сигнал процессу (по умолчанию SIGTERM, введите PID)
rИзменить приоритет (nice) процесса
uПоказать процессы только одного пользователя
cПоказать полную команду запуска вместо имени
HПоказывать потоки вместо процессов
VПоказать дерево процессов (родитель и дочерние)
dИзменить интервал обновления
WСохранить настройки в файл ~/.toprc
?Подсказка по всем клавишам
Осторожно с клавишей kСигнал SIGKILL (9) не даёт процессу корректно завершиться. Сначала пробуйте SIGTERM (15, по умолчанию), и только если процесс не реагирует, — SIGKILL.

10. Параметры запуска и полезные режимы

top -bn1                   # один снимок в обычный текст (для скриптов и логов)
top -b -n 3 -d 5 > top.log  # три снимка с интервалом 5 секунд в файл
top -p 1187,4312           # следить только за указанными PID
top -u www-data            # только процессы пользователя
top -o %MEM                # сортировка по памяти при запуске
top -H -p 1187             # потоки конкретного процесса
Лайфхак для логовРучной top нельзя сохранить в лог, а top -bn1 -o %CPU | head -n 15 можно вписать в скрипт мониторинга или отправить в тикет.

11. htop: что добавляет

htop — более удобная версия top с цветами, мышью и наглядными полосками. Установка: sudo apt install htop (Debian/Ubuntu) или sudo dnf install htop (RHEL/Fedora).

Цвет полосы CPU (htop)Что означает
ЗелёныйОбычная пользовательская нагрузка (user)
КрасныйРабота ядра (system)
СинийНизкоприоритетные процессы (nice)
Серый / оранжевыйОжидание I/O или steal, в зависимости от версии
Когда брать htopДля быстрого осмотра на своём рабочем сервере — htop удобнее. На чужих и минимальных серверах top есть всегда, поэтому знать оба стоит.

12. Практика: разбираем типичные ситуации

Ситуация 1. Сервер «тормозит», load высокий

  1. Смотрим load average и число ядер: nproc. Например, load 12 на 4 ядрах.
  2. Смотрим %Cpu. Если us высокий — ищем процесс с большим %CPU в таблице.
  3. Если id высокий, а load всё равно большой — смотрим состояние D и поле wa. Это ждём диск.
  4. Для диска: iostat -x 1 и vmstat 1.

Ситуация 2. Память «кончилась», но процессы небольшие

  1. Смотрим avail Mem, а не free. Если avail большой — паники нет.
  2. Если avail мал, сортируем по памяти клавишей M и смотрим RES.
  3. Проверяем журнал ядра на OOM: dmesg -T | grep -i oom.

Ситуация 3. Процесс съедает 100% CPU на одном ядре

  1. Сортируем по CPU клавишей P, запоминаем PID.
  2. Смотрим, что за процесс: колонка COMMAND и клавиша c.
  3. Выясняем, зациклился ли он: strace -p PID покажет, какие системные вызовы он делает.
  4. Решаем: исправить конфиг или перезапустить сервис через systemd.

Ситуация 4. Высокий steal в облаке

Поле st растёт, а ваши процессы простаивают. Это значит, что хост перегружен и гипервизор не даёт вашей виртуалке процессорное время. Внутри системы это не исправить: нужна поддержка провайдера или смена тарифа.

Ситуация 5. Много зомби

В строке Tasks растёт zombie. Зомби не потребляют CPU и память, но показывают, что родитель не забирает статус дочернего процесса. Найдите родителя: ps -o ppid= -p PID_ЗОМБИ, затем исправьте программу или перезапустите её.

13. Лайфхаки

14. Шпаргалка

Команда / клавишаДля чего
topИнтерактивный монитор
top -bn1Один снимок в текст
nprocЧисло ядер для сравнения с load
free -hПамять в удобном виде
vmstat 1 5Память, swap, I/O и CPU по секундам
iostat -x 1Нагрузка на диски
P / M / TСортировка по CPU, памяти, времени
1Загрузка каждого ядра
kСигнал процессу
HПотоки вместо процессов
htopУдобная альтернатива с цветами и мышью

↑ Наверх