LinuxRuLinux без лишней теории
Процессы

htop и процессы Linux: как найти нагрузку и правильно убить процесс

Редакция LinuxRu7 мин чтенияИнструкции

htop в Linux показывает, какой процесс грузит процессор и память: сортировка P и M, дерево F5, сигнал F9. Убивать процесс правильно в два шага: сначала kill PID (SIGTERM), и только если он не ответил за несколько секунд, kill -9 PID.

htop и процессы Linux: как найти нагрузку и правильно убить процесс
Фото: The htop developer team, GPL, Wikimedia Commons
Содержание
  1. Установка
  2. Как читать экран
  3. Поиск нагрузки
  4. Сигналы
  5. Не убивается
  6. nice и renice
  7. Кончилась память
  8. top и btop
  9. Частые вопросы

Установка htop и первый запуск

htop есть в репозиториях всех крупных дистрибутивов, на серверах его часто ставят первым же пакетом после обновления системы.

sudo apt install htop      # Debian, Ubuntu, Mint
sudo dnf install htop      # Fedora
sudo pacman -S htop        # Arch
htop

Запускайте от обычного пользователя. Через sudo htop покажет то же самое, но позволит менять приоритет и завершать чужие и системные процессы. Это удобно, когда понимаете, что делаете, и опасно, когда тыкаете наугад.

Экран делится на две части. Сверху счётчики: загрузка каждого ядра, память, swap, число задач, Load average и Uptime. Снизу таблица процессов, внизу подсказка по функциональным клавишам. Если F-клавиши в терминале перехвачены, работают буквенные аналоги или клик мышью по подсказке.

Как читать верхнюю панель и колонки

Полоски процессоров раскрашены по типу нагрузки: зелёный это пользовательские программы, красный ядро, синий процессы с пониженным приоритетом. Если красного много, ищите проблему с драйвером, диском или сетью, а не в браузере.

У памяти зелёная часть занята программами, синяя и жёлтая отданы под буферы и кэш. Кэш ядро освободит само, как только память понадобится, так что заполненная наполовину жёлтым шкала не повод паниковать. Тревожный признак другой: растущий swap и тормоза.

Load average это три числа: средняя очередь задач за 1, 5 и 15 минут. Сравнивайте их с числом ядер. На восьмиядерном процессоре 8 означает полную загрузку, 16 означает, что задачи ждут своей очереди.

Колонки таблицы

  • PID номер процесса, его передают в kill и renice.
  • NI значение nice, от -20 до 19, и PRI итоговый приоритет для планировщика.
  • VIRT вся виртуальная память, обычно огромная и мало о чём говорит. RES реально занятая физическая память, смотреть надо на неё.
  • S состояние: R работает, S спит, D ждёт ввода-вывода и не прерывается, Z зомби, T остановлен.
  • CPU% может превышать 100: это сумма по ядрам для многопоточной программы.

Если привыкли к выводу ps, сравнение колонок с ним есть в статье про команду ps aux.

Как найти, что грузит процессор, память или диск

Сценарий обычный: вентилятор воет, система подтормаживает. В htop это ищется за полминуты.

  1. Нажмите P, чтобы отсортировать по процессору, или M, чтобы по памяти. Виновник окажется наверху.
  2. Нажмите F5, чтобы включить дерево. Так видно, что двадцать процессов chrome на самом деле одна программа, а сборка запущена из конкретного терминала.
  3. Если строк слишком много, F4 оставит только процессы с нужным словом в названии, u отфильтрует по пользователю.
  4. H прячет или показывает потоки, K потоки ядра. Обычно и то и другое удобнее скрыть.

Для диска нужна колонка ввода-вывода. Откройте настройку F2, раздел Columns, и добавьте IO_READ_RATE и IO_WRITE_RATE. Для полной картины по диску запускайте htop через sudo, иначе статистика чужих процессов недоступна. Альтернатива для этой задачи утилита iotop.

КлавишаДействие
F3 или /Поиск процесса по имени, F3 повторно переходит к следующему
F4 или \Фильтр, остаются только совпадения
F5 или tДерево процессов
F6 или < >Выбор колонки для сортировки
P, M, TСортировка по CPU, памяти, времени
F7 / F8Повысить или понизить приоритет (nice)
F9 или kОтправить сигнал выделенным процессам
ПробелОтметить процесс, сигнал уйдёт всем отмеченным
F2 или SНастройка панелей, цветов и колонок
F10 или qВыход

kill и сигналы: чем SIGTERM отличается от kill -9

Процесс в Linux не убивают, ему посылают сигнал. Что произойдёт дальше, зависит от сигнала и от того, как программа его обрабатывает. Нужно помнить пять:

  • 15 SIGTERM вежливая просьба завершиться. Программа успевает сохранить данные, закрыть файлы и удалить временные. Его kill посылает по умолчанию.
  • 9 SIGKILL немедленное завершение силами ядра. Перехватить нельзя, сохранить ничего программа не успеет.
  • 2 SIGINT то же, что Ctrl+C в терминале.
  • 1 SIGHUP многие службы по нему перечитывают конфигурацию без перезапуска.
  • 19 SIGSTOP и 18 SIGCONT заморозить и разморозить процесс. Полезно, чтобы временно остановить тяжёлую задачу, не теряя её.

В htop выделите процесс, нажмите F9, выберите сигнал и Enter. В терминале то же самое:

# найти PID по имени
pgrep -a firefox
# вежливо
kill 12345
# если через несколько секунд не помогло
kill -9 12345
# по имени, всем процессам с этим именем
pkill firefox
killall -9 firefox
# список сигналов
kill -l

Правильный порядок всегда один: сначала SIGTERM, подождать пять-десять секунд, и только потом kill -9. SIGKILL по базе данных, менеджеру пакетов или программе, которая пишет файл, может оставить повреждённые данные и блокировки. На некоторых архитектурах номера сигналов отличаются, поэтому в скриптах надёжнее писать имена: kill -TERM, kill -KILL. Полный список описан в signal(7).

Процесс не завершается даже после kill -9

Состояние Z, зомби

Зомби уже завершился, от него осталась только запись в таблице процессов, которую родитель не забрал. Память и процессор он не ест, убивать там нечего. Найдите родителя по колонке PPID (её можно добавить в htop через F2) или командой ps -o ppid= -p PID и перезапустите его.

Состояние D, непрерываемое ожидание

Процесс ждёт ответа от диска, USB-накопителя или сетевой папки и не реагирует ни на какие сигналы до возврата из ядра. Типичный случай: отвалившийся NFS или умирающая флешка. Верните устройство или сеть, и процесс завершится сам. Если диск неисправен, поможет только перезагрузка.

Процесс возвращается после kill

Его перезапускает systemd. Службу останавливают не через kill, а через sudo systemctl stop имя, иначе systemd добросовестно поднимет её снова через пару секунд. Как найти, к какой службе относится процесс, и управлять ею, разобрано в статье про systemctl.

Если завис весь графический сеанс и мышь не двигается, переключитесь на текстовую консоль Ctrl+Alt+F3, войдите своим логином и запустите там htop. Оттуда можно спокойно завершить виновника, а потом вернуться в графику через Ctrl+Alt+F1 или F2, в зависимости от дистрибутива.

Приоритеты: nice, renice и ionice

Иногда убивать ничего не нужно: архивация или сборка пусть идёт, но не мешает работать. Для этого понижают приоритет. Значение nice от -20 (самый высокий приоритет) до 19 (самый низкий). Обычный пользователь может только повышать nice своих процессов, то есть делать их скромнее. Понижать nice и трогать чужие процессы может только root.

# запустить сразу с низким приоритетом
nice -n 19 tar -cJf backup.tar.xz ~/Documents
# понизить уже работающий процесс
renice -n 10 -p 12345
# вернуть приоритет выше обычного нужно через sudo
sudo renice -n -5 -p 12345
# понизить приоритет ввода-вывода: класс idle
ionice -c 3 -p 12345

В htop то же делают клавиши F7 и F8. На дисковые операции nice почти не влияет, поэтому для копирования и резервных копий полезнее ionice -c 3: процесс будет читать и писать диск, только когда он больше никому не нужен.

Программа исчезла сама: работа OOM killer

Бывает наоборот: вы ничего не убивали, а браузер или игра закрылись без следа. Скорее всего, кончилась память, и система выбрала жертву сама. В современных Fedora и Ubuntu этим занимается systemd-oomd, который следит за давлением на память и завершает самую прожорливую группу процессов заранее, до полного зависания. Если он не успел, срабатывает OOM killer ядра.

# кого завершил systemd-oomd
journalctl -u systemd-oomd -b
# сообщения ядра о нехватке памяти
journalctl -k -b | grep -i "out of memory"

Если такие записи есть, дело не в программе, а в объёме памяти и подкачки. Помогает сжатая подкачка в ZRAM, её настройка разобрана в статье ZRAM и swap в Linux.

top на любом сервере и btop для красоты

top есть везде, даже в минимальном контейнере и на роутере. Клавиши похожи: P и M сортируют, 1 показывает все ядра по отдельности, k спрашивает PID и сигнал, r меняет nice, c показывает полную командную строку, q выходит. Для отчёта в файл или чат пригодится пакетный режим:

top -b -n 1 | head -20

btop развивает идею htop: графики процессора, памяти, дисков и сети на одном экране, управление мышью, темы. Ставится из стандартных репозиториев: sudo apt install btop, sudo dnf install btop, sudo pacman -S btop. Для ежедневного наблюдения за домашним ПК он нагляднее, для работы с процессами по SSH htop быстрее и привычнее. Ещё один вариант в том же духе описан в обзоре gotop.

Частые вопросы

Чем kill отличается от kill -9?

kill без параметров посылает SIGTERM: программа может корректно завершиться и сохранить данные. kill -9 посылает SIGKILL, процесс снимается ядром мгновенно и ничего не успевает сохранить.

Как убить процесс по имени?

Командой pkill имя или killall имя. Перед этим посмотрите pgrep -a имя, чтобы не завершить заодно что-то с похожим названием.

Почему процесс не убивается kill -9?

Он либо зомби (состояние Z, нужно разобраться с родителем), либо ждёт ответа устройства в состоянии D. Ещё бывает, что его тут же перезапускает systemd, тогда остановите службу через systemctl stop.

Почему в htop CPU больше 100 процентов?

Процент считается от одного ядра. Программа, которая полностью занимает четыре ядра, покажет около 400.

Что лучше: htop, top или btop?

top есть всегда, htop удобнее для управления процессами, btop нагляднее показывает графики дисков и сети. Многие держат htop для работы и btop для наблюдения.

Документация и источники

Читайте также

Команды проверены на актуальных версиях дистрибутивов на момент обновления. Перед изменением системных настроек сделайте резервную копию.