CPUQuota задаёт верхнюю границу процессорного времени для процессов systemd-службы. Это удобно для фоновой обработки, мешающей основному приложению. Лимит не ускоряет программу: он может увеличить время ответа и длительность задания.

Как считать процент

CPUQuota=50% означает половину времени одного CPU, а не половину всех ядер VPS. На четырёхъядерной машине 200% позволяет службе суммарно использовать эквивалент двух полностью занятых CPU. Квота распределяется между процессами службы.

CPUWeight задаёт относительный приоритет при конкуренции, а не жёсткий потолок. nice также не заменяет процентную квоту. Для контейнера предпочтительнее штатные настройки его runtime, а не изменение системной службы Docker целиком.

1. Найдите нужную службу

В примерах my-worker.service — имя вашей фоновой службы. Замените его на реальное после проверки. Не применяйте пример к ssh, базе данных или всему system.slice наугад.

systemctl status my-worker.service
systemctl cat my-worker.service
systemctl show my-worker.service -p ControlGroup -p CPUQuotaPerSecUSec

Сохраните вывод текущей конфигурации в рабочем журнале. Если лимит уже задан, запишите его исходное значение: отмена нового ограничения должна вернуть именно прежнюю политику.

2. Примените временную квоту

sudo systemctl set-property --runtime my-worker.service CPUQuota=50%

Свойство применяется к работающей службе без обычного редактирования unit-файла. Флаг --runtime делает изменение временным, до перезагрузки. Не перезагружайте VPS ради проверки лимита.

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

3. Проверьте значение и фактическую нагрузку

systemctl show my-worker.service -p CPUQuotaPerSecUSec
systemd-cgtop

Для 50% значение квоты в единицах времени соответствует примерно 500 миллисекундам на секунду. Низкая нагрузка не доказывает действие квоты, если служба просто не имеет работы; сравнивайте сопоставимые реальные задания, не создавайте искусственную нагрузку на продакшене.

4. Верните прежнюю настройку

Если до эксперимента квоты не было, снимите только временный CPUQuota:

sudo systemctl set-property --runtime my-worker.service CPUQuota=

Если ранее было другое ограничение, например 80%, восстановите его той же командой с CPUQuota=80%. Не используйте systemctl revert для этой единственной правки: он может затронуть другие локальные изменения службы.

Постоянное ограничение

После успешного наблюдения можно задать то же свойство без --runtime. Зафиксируйте изменение и способ возврата прежнего значения. Если процесс запущен вручную, сначала определите, как им управляют: ограничение случайного PID не равнозначно контролю всего дерева приложения.

Связанные инструкции

Официальные источники