Что показывает top?

Edit...
basics
Illustrated by Igan Pol

Привет, %username%! Для того, чтобы посмотреть чем именно занят ваш Linux-сервер, надо посмотреть, что же запущено в нем – какие процессы, сколько ресурсов они используют. Для этого есть замечательная утилита top, которая присутствует “из коробки”.

🔄 Обновлено 2026-08-09. Разбил на разделы, добавил что смотреть в первую очередь, полезные флаги запуска и раздел про steal time и метрики виртуалок. Сам вывод top с 2020 года не изменился — всё ниже актуально для procps-ng на любом современном дистрибутиве.

Запустить утилиту:

# От имени root'а
sudo top
# Или просто
top

Сразу пара флагов, которые экономят время:

top -o %MEM        # сразу отсортировать по памяти, а не по CPU
top -u postgres    # только процессы конкретного пользователя
top -p 1234,5678   # следить за конкретными PID
top -H             # показывать потоки, а не процессы
top -b -n 1        # разовый неинтерактивный вывод, удобно в скриптах и логах

Что показывает шапка#

Далее по порядку – что показывает данная утилита:

  1. 1-я строка — top:

    • Текущее время (22:43:39);
    • Аптайм, то есть время работы без перезагрузки (up 39 days, 7:32);
    • Количество подключенных пользователей (3 users);
    • Средняя загруженность системы (load average: 1.15, 1.11, 1.06) за 1 минуту, 5 минут и 15 минут;
  2. 2-я строка — Tasks:

    • Всего запущено процессов (628 total);
    • Исполняющихся сейчас процессов (2 running);
    • Спящих процессов (626 sleeping);
    • Остановленных процессов (0 stopped);
    • Процессов, ожидающих сигнала завершения от родителя, то есть зомби (0 zombie);
  3. 3-я строка — %Cpu(s):

    • Процент иcпользования процессора пользователями (1.1 us);
    • Процент иcпользования процессора системой (0.4 sy);
    • Процент использования процессора приоритеными процессами “команда nice” (0.0 ni);
    • Процент простаивающих мощностей (98,5 id);
    • Процент ожидающих I/O операций. (0.0 wa);
    • Процент использования процессора на обслуживание аппаратных прерываний Hardware IRQ (0.0 hi);
    • Процент использования процессора на обслуживание программных прерываний Software Interrupts (0.0 si);
    • Процент использования процессора для других задач, например, обслуживания гипервизора. Равен 0 на физической машине (0.0 st);
  4. 4-я и 5-я строка — memory usage

    • Общий объем памяти;
    • Использованный объем памяти;
    • Объём свободной памяти;
    • Объем буферов в кэше;
    • Далее тоже самое, но касательно swap;

Список процессов#

Оставшиеся строки – processes list, по которым показывается следующая информация:

  • PID – Proccess ID процесса;
  • USER – С правами какого пользователя выполняется;
  • PR – Приоритет процесса;
  • NI – Значение “nice” процесса;
  • VIRT – Виртуальная память, используемая процессом;
  • RES – Физическая память, используемая процессом;
  • SHR – Разделяемая память процесса;
  • S – Состояние процесса:
    • S - спящий;
    • R - запущенный;
    • Z - зомби;
  • %CPU – Процент использования процессора процессом;
  • %MEM – Процент использования памяти;
  • TIME+ - Общее время активности процесса;
  • COMMAND – Команда, которой был вызван процесс;

Данная утилита, как видно из описания предоставляет довольно подробную информацию, которой будет достаточно для диагностики. Так же эта утилита сразу есть в дистрибутиве, в отличии от “красивого” htop.

Управление с клавиатуры#

Управлять top’ом можно с помощью следующих “кнопочек”:

  • t - Включение и выключение вывода на экран суммарных данных;
  • m - Включение и выключение вывода на экран информации о памяти;
  • A - Сортировка строк по максимальному потреблению различных системных ресурсов;
  • f - Вход в меню конфигурирования данных, выводимыхмых на экран;
  • o - Позволяет интерактивно задавать порядок строк;
  • r - Изменение приоритета процесса с помощью команды renice;
  • k - Уничтожение процесса с помощью команды kill;
  • Y - Вывод количества используемой памяти в б, Кб, Мб, Гб и т.д. в зависимости от количества нажатий;
  • с - подробный вывод команды запуска процесса;

Ещё несколько, которых не было в списке выше, но которые пригождаются постоянно:

  • 1 — разложить строку %Cpu(s) по ядрам. Сразу видно, упёрлось ли всё в одно ядро или нагрузка размазана;
  • Shift+M — сортировать по памяти, Shift+P — по CPU (по умолчанию);
  • e и Shift+E — переключать единицы измерения в списке процессов и в шапке соответственно;
  • Shift+H — переключиться на потоки вместо процессов;
  • V — дерево процессов вместо плоского списка;
  • W — сохранить текущую конфигурацию в ~/.config/procps/toprc, чтобы не настраивать заново каждый раз.

В качестве бонуса – выглядит утилита в работе примерно так:

Вывод top: шапка с load average, строки Tasks и %Cpu(s), список процессов с колонками PID, USER, VIRT, RES, %CPU и %MEM

Что смотреть в первую очередь#

Когда сервер «тормозит», а времени разбираться нет, порядок такой.

load average против числа ядер. Само по себе значение 1.15 ни о чём не говорит. Сравнивать его надо с количеством ядер (nproc): load 4 на четырёхъядерной машине — это полная, но здоровая загрузка, а на одноядерной — очередь. Три числа показывают тренд за 1, 5 и 15 минут: если первое сильно больше третьего, нагрузка растёт прямо сейчас.

wa в строке %Cpu(s). Высокий wa означает, что процессор простаивает в ожидании диска. Тут проблема не в CPU, и дальше надо идти в iostat -x 1 и смотреть на утилизацию и latency дисков, а не искать прожорливый процесс.

Разница между VIRT и RES. Пугаться больших VIRT не надо: это адресное пространство, включая то, что никогда не будет тронуто. Реально занятая физическая память — это RES. При этом RES считает и разделяемую память (SHR), поэтому сумма RES по всем процессам почти всегда больше, чем реально занято.

Зомби. Ненулевой zombie сам по себе безвреден: зомби не потребляет ресурсов, кроме записи в таблице процессов. Но растущее их число — признак того, что родительский процесс не вызывает wait(), и это уже баг в приложении.

st — steal time и почему это важно на виртуалках#

Единственное поле, которое стоит отдельного упоминания, — st в строке %Cpu(s). Это доля времени, когда виртуальная машина хотела считать, но гипервизор отдал процессор кому-то другому.

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

Чем смотреть, если top мало#

top хорош тем, что есть везде. Когда его не хватает:

  • atop — умеет писать историю в файл, поэтому позволяет посмотреть, что происходило ночью, когда никто не смотрел;
  • htop и btop — интерактивнее и нагляднее, но их надо ставить;
  • strace — когда уже понятно, какой процесс виноват, но непонятно, чем он занят;
  • iostat -x 1, vmstat 1, pidstat — из пакета sysstat, когда нужны цифры по дискам и памяти, а не общая картина.

Утилита — это половина дела. top показывает цифры, но не подсказывает, какую гипотезу проверять первой и когда пора её бросить. Про сам метод разбора — USE, деление пополам, таймер на гипотезу — я собрал отдельный лист в карте компетенций SRE.

Собственно, на этом всё.