Как ограничить использование CPU процессом в Linux
Как найти процесс с высокой загрузкой CPU
На Linux PID (идентификатор процесса) нужен, чтобы привязать ограничение к конкретному процессу. Несколько способов найти процессы с высокой загрузкой:
- top — интерактивный монитор процессов.
- htop — улучшенная версия top.
- ps с сортировкой по %CPU.
- pgrep или pidof для поиска по имени.
Пример команд и вывода:
topВ колонке %CPU видно, сколько процентов CPU использует процесс. Запишите PID процессa с высокой нагрузкой.
Полезные команды:
ps aux --sort=-%cpu | head -n 10
pgrep -f my_heavy_process
pidof my_heavy_processСовет: если процесс многопоточный, %CPU в top может превышать 100%, потому что он суммируется по потокам на всех ядрах.
Установка cpulimit
Cpulimit не всегда предустановлен. Установите пакет под вашей дистрибуцией:
Ubuntu / Debian:
sudo apt install cpulimitArch / Manjaro:
sudo pacman -S cpulimitCentOS / RHEL (через EPEL):
sudo yum install epel-release
sudo yum install cpulimitЕсли вы используете другую систему, ищите пакет cpulimit в репозиториях или собирайте из исходников.
Базовый синтаксис cpulimit
Cpulimit ограничивает процесс, привязываясь к процессу по PID, имени исполняемого файла или пути к нему.
Ключи для выбора процесса:
- -p или –pid — указать PID
- -e или –exe — имя исполняемого файла
- -P или –path — абсолютный путь к исполняемому файлу
Примеры базового вызова:
cpulimit -p 12345
cpulimit -e myprogram
cpulimit -P /usr/bin/myprogramОграничение CPU процесса
Чтобы ограничить процесс с PID 81550 до 50% CPU:
sudo cpulimit -p 81550 --limit 50Cpulimit будет периодически отправлять процессу SIGSTOP и SIGCONT, чтобы удерживать среднюю загрузку в заданных пределах.
Запустить cpulimit в фоне:
sudo cpulimit -p 81550 --limit 50 --backgroundЕсли параметр –background не сработал, добавьте амперсанд (&):
sudo cpulimit -p 81550 --limit 50 &Проверьте результат в top или htop.
Как видно на примере, команда dd снизила загрузку до ~48–50%.
Завершение процесса
Если вы хотите не ограничивать, а полностью остановить процесс, используйте опцию –kill:
sudo cpulimit -p 81550 --limit 50 --killЗамечание: –kill попытается корректно завершить процесс. При необходимости используйте sudo kill -9 PID, но это крайняя мера.
Альтернативы и когда лучше не использовать cpulimit
Cpulimit подходит для быстрого ручного вмешательства. Однако у него есть ограничения:
- Механизм основан на приостановке/возобновлении (SIGSTOP/SIGCONT). Это может влиять на время отклика и сетевые операции.
- В контейнерах (Docker, LXC) cpulimit внутри контейнера может не дать ожидаемого эффекта. Для контейнеров ограничивайте ресурсы через orchestrator или cgroups на хосте.
- Для сервисов systemd лучше использовать CPUQuota и cgroups — они более предсказуемы и устойчивы после перезапуска.
Примеры альтернатив:
- nice / renice — изменяют приоритет планирования (не ограничивают процент, а снижают приоритет).
- systemd (CPUQuota=/CPUWeight=) — ограничение на уровне cgroups.
- cgroups v1/v2 — явное управление ресурсами для групп процессов.
Пример запуска команды с ограничением CPU через systemd:
sudo systemd-run --scope -p CPUQuota=50% --unit=limited dd if=/dev/zero of=/dev/null bs=1MДля служб можно задать ограничение навсегда:
sudo systemctl set-property myservice.service CPUQuota=30%Эти методы не зависят от сигналов SIGSTOP/SIGCONT и работают на уровне планировщика ядра.
Как уменьшить приоритет процесса
Если вы хотите не жестко ограничивать CPU, а дать процессу меньший приоритет, используйте nice и renice.
Запустить процесс с низким приоритетом:
nice -n 10 my_commandИзменить приоритет уже запущенного процесса:
sudo renice +10 -p 81550Чем выше значение nice, тем ниже приоритет. Значения от -20 (высший приоритет) до +19 (низкий приоритет).
Диагностика и отладка
Если ограничение не работает, проверьте:
- Применился ли cpulimit к правильному PID (процесс мог перезапуститься с новым PID).
- Не является ли процесс системным (kernel thread) или уже запущен от другого пользователя.
- Работаете ли вы в контейнере.
- Нет ли ограничений со стороны cgroups или SELinux.
Полезные инструменты для детальной диагностики:
pidstat -p 81550 1 5 # показывает загрузку CPU по процессу с интервалами
ps -o pid,ppid,cmd,%cpu -p 81550
cat /proc/81550/statusПрактическое руководство: быстрый SOP для админа
- Найдите процесс:
- ps aux –sort=-%cpu | head
- top / htop
- Определите, нужен ли процесс. Если нет — завершите его.
- Если процесс нужен, но грузит CPU, временно ограничьте cpulimit:
- sudo cpulimit -p
–limit <процент> –background
- sudo cpulimit -p
- Для долгосрочного контроля переведите сервис в systemd с CPUQuota или настройте cgroups.
- Мониторьте влияние: top, pidstat, systemd-cgtop.
Роли и быстрые чек-листы:
- Для админа: проверить логи, назначение сервиса, настроить systemd CPUQuota.
- Для разработчика: локально профилировать процесс, найти утечку ЦП, оптимизировать код.
- Для пользователя рабочего стола: использовать System Monitor (GNOME) или cpulimit для локальных задач.
Когда cpulimit не подойдёт
- Процесс делает блокирующие операции ввода-вывода и не чувствителен к приостановке.
- Процесс — контейнерный воркер, где контейнер уже ограничён по CPU.
- Требуются гарантированные SLA/SLI по CPU — лучше использовать cgroups и systemd для квотирования.
Фактбокс — важные моменты
- Механизм cpulimit: отправка SIGSTOP/SIGCONT для регулировки средней загрузки.
- nice/renice меняют приоритет, но не задают жесткий процент CPU.
- systemd CPUQuota задаёт ограничение на уровне cgroup и работает даже после перезапуска службы.
Мини-методология выбора метода
- Если нужно временно и локально — cpulimit.
- Если нужен постоянный контроль для службы — systemd CPUQuota или cgroups.
- Если задача — снизить влияние на систему, но не ограничивать CPU жёстко — nice/renice.
Критерии приёмки
- CPU процесса после применения ограничения стабильно ниже заданного процента (среднее за 1–5 минут).
- Функциональность процесса остаётся корректной (нет неожиданных таймаутов или ошибок).
- Ограничение переживает перезапуск сервиса (для постоянных настроек применён systemd/cgroups).
Краткий глоссарий
- PID — идентификатор процесса в системе.
- cgroups — механизм группировки процессов и ограничения ресурсов.
- CPUQuota — параметр systemd для ограничения CPU в процентах.
Часто задаваемые вопросы
В: Нужно ли запускать cpulimit от root? A: Для ограничения процессов других пользователей или системных процессов потребуется root; для процессов своего пользователя можно запускать без sudo.
В: Можно ли ограничить одновременнo несколько процессов? A: Да. Для каждого процесса запустите отдельный cpulimit либо объедините процессы в cgroup и ограничьте её.
В: Как восстановить нормальную работу после cpulimit? A: Остановите процесс cpulimit (find pid cpulimit и kill) или перезапустите целевой процесс; при остановке cpulimit процесс вернётся к нормальной загрузке.

Важно следить за поведением приложения после ограничения. Иногда лучше оптимизировать код или архитектуру, чем постоянно ограничивать процесс.
Итог
Cpulimit полезен для быстрого вмешательства и локального контроля использования CPU. Для устойчивых и предсказуемых ограничений предпочтительнее systemd/cgroups. Выбирайте инструмент в зависимости от срока действия ограничения и среды (локальная машина, сервер, контейнер).
Похожие материалы
Запуск Sticky Notes при включении Windows 11
Как исправить WDF_Violation в Windows
Добавить Windows 11 в меню GRUB
Удаление колонтитулов в Word — быстрое руководство
Ярлык «Свойства системы» в Windows 11