В этой статье разберём на примере 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, чтобы понять, что это за процесс и под кем он запущен.
Типичная ошибка: новички видят высокий 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 и прокрути вверх списка. Обычно всё плохое живёт в первых строках.
Аккуратно: не надо сразу «убивать» всё, что наверху. Например, 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
Важно: не используй просто 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.
Практика: удобно запускать 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, который стоит довести до автоматизма.