Как найти процессы, потребляющие много CPU или памяти на VPS?

В этой статье разберём на примере Ubuntu/Debian:

  • какие инструменты использовать: top, htop, ps, pidstat;
  • как найти процессы, которые съедают CPU;
  • как отфильтровать процессы по потреблению памяти;
  • как быстро вывести «топ-10 прожорливых» одной командой;
  • что делать после того, как процесс найден (а что делать точно не стоит).

Основные инструменты для поиска «тяжёлых» процессов

Для анализа загрузки CPU и памяти на VPS чаще всего используют:

  • top — встроенный в систему монитор. Показывает общую загрузку и список процессов, можно сортировать по CPU и памяти.

  • htop — более удобная версия top с цветами, прокруткой, фильтрацией и деревом процессов.

  • ps — одноразовые выборки процессов (например, «покажи 10 самых прожорливых по CPU»).

  • pidstat — детальный мониторинг отдельных процессов по CPU/памяти во времени (по желанию).

Сначала убедимся, что базовые утилиты есть в системе:

top -v
ps --version

Если htop или pidstat не установлены — добавим их:

sudo apt update
sudo apt install -y htop sysstat
Инструменты для поиска прожорливых процессов

Поиск прожорливых процессов через top

top есть практически в любом Linux «из коробки». Он показывает в реальном времени нагрузку на CPU, память и список процессов.

Запуск top

top

Наверху увидите общую информацию:

  • load average — средняя загрузка системы;

  • %Cpu(s) — проценты использования CPU (user/system/idle и т.д.);

  • KiB Mem / MiB Mem — использование оперативной памяти;

  • KiB Swap / MiB Swap — использование swap.

В таблице ниже по умолчанию сортировка идёт по CPU (столбец %CPU) — сверху будут процессы, которые сильнее всего грузят процессор.

Полезные клавиши в top

  • P — сортировка по CPU (от большего к меньшему).

  • M — сортировка по памяти (столбец %MEM).

  • 1 — показать нагрузку по каждому ядру.

  • q — выход.

Если хочешь сразу запустить top с сортировкой по CPU:

top -o %CPU

Ищем строку с высоким значением в %CPU или %MEM. Обращай внимание на столбцы COMMAND и USER, чтобы понять, что это за процесс и под кем он запущен.

Поиск процессов с высокой нагрузкой через top

Типичная ошибка: новички видят высокий load average, но не смотрят на %CPU. Иногда высокую нагрузку даёт не CPU, а ожидание диска (процессы в состоянии D — uninterruptible sleep).

Удобный просмотр через htop

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

Запуск htop

sudo htop

Сверху увидите цветные полосы CPU, памяти и swap, а ниже — список процессов. Процессы можно сортировать кликом (в некоторых терминалах) или клавишами.

Полезные функции htop

  • F6 (SortBy) — выбор поля сортировки (CPU, MEM, TIME и др.).

  • F3 (Search) — поиск по имени процесса (например, php-fpm, nginx, mysql).

  • F5 (Tree) — древовидный вид: удобно видеть, какие процессы запущены кем.

  • F9 (Kill) — отправить сигнал процессу (по умолчанию SIGTERM).

Чтобы быстро найти тяжёлые процессы, отсортируй по колонке %CPU или %MEM и прокрути вверх списка. Обычно всё плохое живёт в первых строках.

Настройка сортировки в htop

Аккуратно: не надо сразу «убивать» всё, что наверху. Например, mysqld или postgres логично потребляют ресурсы. Важно отличать нормальную нагрузку от аномальной (например, десяток одинаковых PHP-процессов, каждый по 80–100% CPU).

Быстрая выборка top-10 процессов через ps

Иногда не хочется открывать интерактивный интерфейс, особенно если SSH-канал лагает. В таких случаях выручает связка ps + сортировка.

Топ-10 по CPU

ps aux --sort=-%cpu | head -n 15

Пояснения:

  • ps aux — вывод всех процессов;

  • --sort=-%cpu — сортировка по столбцу %CPU (убывание);

  • head -n 15 — выводим заголовок + первые 14 строк.

Топ-10 по памяти

ps aux --sort=-%mem | head -n 15

Удобно использовать это в сочетании с grep, если хочешь посмотреть конкретный сервис:

ps aux --sort=-%cpu | grep php-fpm | head
ps aux --sort=-%mem | grep nginx | head
Сортировка процессов по CPU через ps aux

Важно: не используй просто ps aux | grep имя для поиска «самых прожорливых» процессов — без сортировки можно легко пропустить настоящий проблемный процесс ниже в списке.

Поиск проблем в конкретном сервисе (php-fpm, nginx, mysql)

Часто уже понятно, кто виноват: «у нас сайт на PHP», «падает база», «подозреваю cron-скрипт». В этом случае удобно смотреть только процессы нужного сервиса.

Примеры команд

PHP-FPM:

ps -C php-fpm -o pid,%cpu,%mem,command

Nginx:

ps -C nginx -o pid,%cpu,%mem,command

MariaDB/MySQL:

ps -C mysqld -o pid,%cpu,%mem,command

Если имя бинарника неизвестно, можно использовать pgrep:

pgrep -fl php
pgrep -fl node
pgrep -fl python

Комбинируем с top или htop, чтобы в реальном времени наблюдать за конкретным сервисом.

Мониторинг во времени через pidstat (опционально)

Если грузящий процесс «проскакивает» и не всегда попадает в top/htop, можно использовать pidstat из пакета sysstat.

Пример: наблюдаем за CPU-потреблением всех процессов

sudo pidstat 5

Команда будет каждые 5 секунд показывать использование CPU по процессам.

Наблюдаем за конкретным PID

sudo pidstat -p 12345 5

Где 12345 — PID процесса, найденного через ps или top.

Мониторинг CPU через pidstat

Практика: удобно запускать pidstat, когда клиент жалуется «иногда сайт виснет». Так можно поймать периодические всплески нагрузки от какого-то крона или скрипта.

Что делать, когда процесс найден

Нашли процесс, который ест 200% CPU или половину оперативки. Вариантов действий несколько:

  • Посмотреть, что это за процесс:

    ps -p PID -o pid,user,%cpu,%mem,command

    Понимание команды и пользователя уже даёт контекст (скрипт сайта, демон бэкапа, база и т.д.).

  • Проверить логи сервиса: веб-сервер (nginx/apache), PHP-FPM, база данных — часто там прямо написано, что процесс «сходит с ума» из-за конкретного запроса или ошибки.

  • Попробовать мягко перезапустить сервис (nginx, php-fpm, queue-worker и т.д.), если очевидно, что проблема в нём.

  • В крайнем случае — убить процесс:

    sudo kill PID      # мягкий сигнал SIGTERM
    sudo kill -9 PID   # жёсткий SIGKILL (крайняя мера)

    SIGTERM даёт процессу шанс корректно завершиться, SIGKILL — рубит без разговоров (есть риск повредить данные).

Не делай так: не надо первым делом делать killall php или killall java — можно случайно убить всё подряд, включая нужные сервисы.

Типичные ситуации и подводные камни

  • 1–2 процесса на 100% CPU — это нормально?

    Если у тебя 2–4 ядра, вполне нормально, что временно какие-то процессы используют ядро на 100%. Важно смотреть, возвращается ли нагрузка к норме или висит постоянно.

  • Процесс в состоянии D (uninterruptible sleep)

    Это обычно означает проблемы с диском (I/O wait). Такой процесс не всегда получается убить, нужно разбираться с дисковой подсистемой: iostat, iotop, логи.

  • Swap используется почти полностью

    Даже если CPU нормальный, но память забита и всё ушло в swap — VPS будет тормозить. Смотри топ по памяти и думай, кого ограничить или «выселить».

  • htop/iftop/nload не установлены

    Это нормально, на «голых» образах часто только базовые утилиты. Всё нужное ставится через apt install.

Итоги

  • Научились искать тяжёлые процессы через top и htop.

  • Получили удобные команды ps aux --sort=-%cpu и --sort=-%mem для быстрого «среза».

  • Разобрали, как анализировать конкретные сервисы (php-fpm, nginx, mysql) и мониторить процессы через pidstat.

  • Обсудили, что делать после того, как процесс найден — и какие действия лучше не делать сгоряча.

Вывод: умение быстро найти пару «жирных» процессов по CPU/памяти экономит кучу времени и нервов. Это один из базовых навыков администрирования VPS, который стоит довести до автоматизма.

Оставить комментарий