Гид по технологиям

Ограничение использования CPU процесса в Linux с помощью cpulimit

5 min read Linux Обновлено 03 Jan 2026
Ограничение CPU процесса в Linux — cpulimit
Ограничение CPU процесса в Linux — cpulimit

Кратко

Иллюстрация: ограничение использования CPU процессом

Когда вы работаете на Linux, в фоновом режиме запускается множество процессов. Они потребляют ресурсы системы — в первую очередь CPU и время выполнения.

В большинстве случаев ядро и планировщик справляются сами, но иногда тяжёлый или некорректно написанный процесс может занять большую часть CPU. Обычно решение — завершить процесс или ограничить его использование CPU.

На Linux есть простая утилита командной строки cpulimit, которая ограничивает процент CPU, доступный процессу.

Как найти процесс с высоким использованием CPU

Прежде чем ограничивать использование ресурсов, нужно определить идентификатор процесса (PID). PID — уникальный номер процесса в системе.

Самый быстрый способ увидеть список процессов и загрузку — команда top:

top

Вывод:

Вывод top: использование CPU по процессам

Колонка %CPU показывает процент использования CPU конкретным процессом. Если система перегружена, вы увидите процессы с высоким значением (иногда близким к 100%). Запомните или запишите PID интересующего процесса.

Помимо top, можно использовать ps, htop или pgrep/pgrep -a для поиска по имени:

ps aux --sort=-%cpu | head -n 10
pgrep -a имя_процесса

Совет: если процесс многопоточный, %CPU может превышать 100% (в системах с несколькими ядрами), поэтому интерпретируйте значения с учётом числа ядер.

Установка cpulimit

На большинстве дистрибутивов cpulimit не предустановлен — установите пакет вручную.

Ubuntu / Debian:

sudo apt install cpulimit

Arch / Manjaro:

sudo pacman -S cpulimit

CentOS / RHEL (через EPEL):

yum install epel-release
yum install cpulimit

Если у вас другая система, поищите пакет cpulimit в репозиториях или соберите из исходников.

Синтаксис команды

Перед запуском cpulimit необходимо указать процесс по одному из трёх способов:

  • -p или –pid: идентификатор процесса (PID)
  • -e или –exe: имя исполняемого файла
  • -P или –path: абсолютный путь к исполняемому файлу

Базовые примеры:

cpulimit -p 12345
cpulimit -e myprocess
cpulimit -P /usr/bin/myprocess

Флаг для задания предела — –limit или -l (значение в процентах CPU).

Примеры использования

Ограничить процесс с PID 81550 до 50% CPU:

sudo cpulimit -p 81550 --limit 50

Эта команда будет держать процесс в заданном лимите, пока работает сам cpulimit. Если cpulimit завершится, ограничение снимется.

Запустить cpulimit в фоне с флагом –background:

sudo cpulimit -p 81550 --limit 50 --background

Если –background не работает (в редких случаях), используйте амперсанд:

sudo cpulimit -p 81550 --limit 50 &

После запуска проверьте топ:

top

Отображение снижения использования CPU после cpulimit

В примере CPU процесса dd снизился до ≈48–50%, как и ожидалось.

Завершение процесса

Если вы хотите не ограничивать, а завершить процесс, у cpulimit есть флаг –kill:

sudo cpulimit -p 81550 --limit 50 --kill

Этот флаг завершит процесс, когда он превысит указанный лимит.

Когда cpulimit не подходит (ограничения и исключения)

  • Многопоточные процессы: cpulimit работает путём приостановки/возобновления процесса, основываясь на его общей загрузке; в многопоточных приложениях это может давать нестабильный эффект и неравномерное распределение по потокам.
  • Ядровые или системные потоки: cpulimit не управляет kernel threads и некоторыми привилегированными задачами.
  • Высокоинтерактивные процессы: при агрессивном ограничении возможны задержки и ухудшение отклика.

В таких случаях лучше использовать cgroups (systemd) или настроить планировщик/приоритеты.

Альтернативные подходы

  1. nice / renice — меняют приоритет планировщика; не ограничивают проценты CPU, но дают приоритет другим задачам:
nice -n 10 ./долгая_задача
renice +5 -p 12345
  1. cgroups (control groups) / systemd slices — гибко ограничивают CPU, память, I/O на уровне группы процессов. Рекомендуется для продакшн-систем.

  2. taskset — фиксирует процесс на определённые ядра (affinity); полезно для локализации нагрузки.

  3. cpuset — сочетание с cgroups для жёсткого выделения ядер и памяти.

  4. Контролируемое рестартование/перезапуск службы с systemd с настройками CPUQuota и CPUWeight:

# Пример в юнит-файле systemd
[Service]
CPUQuota=50%

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

Мини‑методология для быстрого реагирования (SOP)

  1. Выявление: запустите top/ps/htop и найдите PID.
  2. Оценка: проверьте, является ли процесс критичным (systemd status, lsof, strace при необходимости).
  3. Временное ограничение: примените cpulimit с разумным лимитом (30–70%).
  4. Мониторинг: следите за нагрузкой и поведением процесса 5–10 минут.
  5. Долговременное решение: если проблема повторяется, переводите в cgroup/systemd или фиксируйте код.
  6. Документирование: запишите причину и принятые меры.

Плейбук: Быстрая реакция для администратора

  1. Получите PID:
ps aux --sort=-%cpu | head -n 20
  1. Если процесс безопасно ограничить, установите лимит на 50%:
sudo cpulimit -p  --limit 50 --background
  1. Если процесс нужно завершить немедленно:
sudo kill -TERM 
# или, если не помогает
sudo kill -9 
  1. Если процесс — системная служба, используйте systemd:
sudo systemctl stop имя_сервиса
sudo systemctl edit имя_сервиса  # добавить настройки CPUQuota при необходимости
  1. Анализ причин: проверьте логи, трассировки и память (dmesg, journalctl, strace).

Роль‑специфичные чек‑листы

  • Для системного администратора:

    • Определить PID и зависимость сервиса
    • Проверить системные логи и смену конфигурации
    • При необходимости временно ограничить cpulimit и подготовить cgroup
  • Для разработчика приложений:

    • Локализовать узкое место (профайлеры: perf, gprof, py-spy и т.д.)
    • Исправить бесконечные циклы или неэффективный синхронный код
    • Написать тесты нагрузки и регрессионные тесты
  • Для пользователя рабочего стола:

    • Использовать System Monitor (GNOME) или htop
    • Временно ограничить процесс через cpulimit, если не хочет закрывать

Отладка и типичные проблемы

  • cpulimit не влияет: проверьте, запущен ли сам cpulimit и применён ли он к правильному PID или имени.
  • Процесс создаёт дочерние процессы: ограничение по PID не затронет дочерние процессы с другими PID; используйте –exe или cgroups.
  • Ограничение слишком жёсткое: если приложение теряет отклик, увеличьте лимит или примените gentle approach (nice).

Примеры команд и шпаргалка

  • Проверить процессы по CPU:
ps aux --sort=-%cpu | head
  • Ограничить процесс по PID до 30% и запустить в фоне:
sudo cpulimit -p 1234 --limit 30 --background
  • Ограничить процесс по имени:
sudo cpulimit -e myapp --limit 40 --background
  • Завершить процесс при превышении лимита:
sudo cpulimit -p 1234 --limit 20 --kill

Критерии приёмки

  • Процесс не использует больше заданного процента CPU в течение проверяемого интервала (например, 5 минут).
  • Система остаётся отзывчивой: задержка интерфейса и сервисов сохраняется в рабочих пределах.
  • Нет побочных эффектов: процессы-зависимости продолжают корректно работать.

Небольшая памятка: когда использовать что

  • cpulimit — для быстрого временного ограничения отдельного процесса на рабочей станции или сервере.
  • nice/renice — для понижения приоритета без жёсткого лимита.
  • cgroups/systemd — для постоянного, управляемого ограничения в продакшн-средах.

Краткая библиотека терминов (1‑строчные определения)

  • PID — идентификатор процесса в системе.
  • cgroups — механизм ядра для группировки и ограничения ресурсов.
  • nice — утилита для задания приоритета планировщика процесса.
  • affinity/taskset — привязка процесса к конкретным ядрам.

Диаграмма принятия решения

flowchart TD
  A[Проблема: высокий %CPU] --> B{Критично для системы?}
  B -- Да --> C[Проверить, служба или пользовательский процесс]
  C --> D{Служба?}
  D -- Да --> E[Использовать systemd/cgroups или рестарт сервиса]
  D -- Нет --> F[Временно: cpulimit или renice]
  B -- Нет --> G[Отложить, наблюдать и профилировать]
  F --> H[Если повторяется — перевести в cgroups или исправить код]
  E --> H
  G --> I[Профайлинг и оптимизация]

Итог

cpulimit — удобный инструмент для быстрого решения проблем с высоким использованием CPU отдельными процессами. Для единичных случаев и рабочих станций он прост в применении, но для постоянного и предсказуемого управления ресурсами лучше рассмотреть cgroups и системные механизмы планирования.

Важно: перед применением ограничений оцените влияние на приложение и тестируйте изменения в контролируемой среде.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Настроить чувствительность Google Home к Hey Google
Умный дом

Настроить чувствительность Google Home к Hey Google

Next.js: Context API для управления состоянием
Frontend

Next.js: Context API для управления состоянием

Как просмотреть и извлечь содержимое JAR‑файла
Java

Как просмотреть и извлечь содержимое JAR‑файла

Оптимизация энергопотребления в Windows 11
Windows

Оптимизация энергопотребления в Windows 11

Безопасный режим Mozilla Firefox — как и зачем
Браузеры

Безопасный режим Mozilla Firefox — как и зачем

Остановить обновление Windows 10 до версии
Windows

Остановить обновление Windows 10 до версии