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 не равнозначно контролю всего дерева приложения.