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

Когда вы работаете на Linux, в фоновом режиме запускается множество процессов. Они потребляют ресурсы системы — в первую очередь CPU и время выполнения.
В большинстве случаев ядро и планировщик справляются сами, но иногда тяжёлый или некорректно написанный процесс может занять большую часть CPU. Обычно решение — завершить процесс или ограничить его использование CPU.
На Linux есть простая утилита командной строки cpulimit, которая ограничивает процент CPU, доступный процессу.
Как найти процесс с высоким использованием CPU
Прежде чем ограничивать использование ресурсов, нужно определить идентификатор процесса (PID). PID — уникальный номер процесса в системе.
Самый быстрый способ увидеть список процессов и загрузку — команда top:
topВывод:
Колонка %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 cpulimitArch / Manjaro:
sudo pacman -S cpulimitCentOS / 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 процесса dd снизился до ≈48–50%, как и ожидалось.
Завершение процесса
Если вы хотите не ограничивать, а завершить процесс, у cpulimit есть флаг –kill:
sudo cpulimit -p 81550 --limit 50 --killЭтот флаг завершит процесс, когда он превысит указанный лимит.
Когда cpulimit не подходит (ограничения и исключения)
- Многопоточные процессы: cpulimit работает путём приостановки/возобновления процесса, основываясь на его общей загрузке; в многопоточных приложениях это может давать нестабильный эффект и неравномерное распределение по потокам.
- Ядровые или системные потоки: cpulimit не управляет kernel threads и некоторыми привилегированными задачами.
- Высокоинтерактивные процессы: при агрессивном ограничении возможны задержки и ухудшение отклика.
В таких случаях лучше использовать cgroups (systemd) или настроить планировщик/приоритеты.
Альтернативные подходы
- nice / renice — меняют приоритет планировщика; не ограничивают проценты CPU, но дают приоритет другим задачам:
nice -n 10 ./долгая_задача
renice +5 -p 12345cgroups (control groups) / systemd slices — гибко ограничивают CPU, память, I/O на уровне группы процессов. Рекомендуется для продакшн-систем.
taskset — фиксирует процесс на определённые ядра (affinity); полезно для локализации нагрузки.
cpuset — сочетание с cgroups для жёсткого выделения ядер и памяти.
Контролируемое рестартование/перезапуск службы с systemd с настройками CPUQuota и CPUWeight:
# Пример в юнит-файле systemd
[Service]
CPUQuota=50%Используйте эти методы, когда надо гарантированное и устойчивое ограничение, особенно на серверах.
Мини‑методология для быстрого реагирования (SOP)
- Выявление: запустите top/ps/htop и найдите PID.
- Оценка: проверьте, является ли процесс критичным (systemd status, lsof, strace при необходимости).
- Временное ограничение: примените cpulimit с разумным лимитом (30–70%).
- Мониторинг: следите за нагрузкой и поведением процесса 5–10 минут.
- Долговременное решение: если проблема повторяется, переводите в cgroup/systemd или фиксируйте код.
- Документирование: запишите причину и принятые меры.
Плейбук: Быстрая реакция для администратора
- Получите PID:
ps aux --sort=-%cpu | head -n 20- Если процесс безопасно ограничить, установите лимит на 50%:
sudo cpulimit -p --limit 50 --background - Если процесс нужно завершить немедленно:
sudo kill -TERM
# или, если не помогает
sudo kill -9 - Если процесс — системная служба, используйте systemd:
sudo systemctl stop имя_сервиса
sudo systemctl edit имя_сервиса # добавить настройки CPUQuota при необходимости- Анализ причин: проверьте логи, трассировки и память (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 и системные механизмы планирования.
Важно: перед применением ограничений оцените влияние на приложение и тестируйте изменения в контролируемой среде.
Похожие материалы
Настроить чувствительность Google Home к Hey Google
Next.js: Context API для управления состоянием
Как просмотреть и извлечь содержимое JAR‑файла
Оптимизация энергопотребления в Windows 11
Безопасный режим Mozilla Firefox — как и зачем