SystemdDoctor

Ограничение процессора: доля и жёсткий предел работают по-разному

Доля процессора распределяет время только при нехватке: пока процессор свободен, служба не ограничена вовсе. Жёсткий предел режет потребление всегда, даже на простаивающей машине. Из-за этой разницы одна и та же настройка выглядит то работающей, то нет.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Доля не ограничивает при свободном процессоре

    Доля действует только при соперничестве. На свободной машине служба использует столько, сколько может.

  2. Жёсткий предел вызывает придержки и рост времени ответа

    При достижении предела процессы придерживаются до следующего периода учёта. Время ответа растёт скачками.

  3. Ограничение задано на срезе, а ожидается на службе

    Пределы среза действуют на все службы внутри вместе. Служба может упираться в предел среза при своём свободном.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Фактическое потребление процессора по срезам и службам.

systemd-cgtop -1 -n1 | head -10

Настройки процессора и срез службы.

systemctl show myapp.service -p CPUWeight -p CPUQuota -p Slice

Счётчики использования и придержек.

cat /sys/fs/cgroup/system.slice/myapp.service/cpu.stat 2>/dev/null

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Доля не ограничивает при свободном процессоре
Почему происходит
Доля действует только при соперничестве. На свободной машине служба использует столько, сколько может.
Как проверить
Посмотрите настройки и фактическое потребление.
systemctl show myapp.service -p CPUWeight -p CPUQuota
systemd-cgtop -1 -n1 2>/dev/null | head -8
Как исправить
Если нужен предел в любых условиях, задавайте жёсткий предел в процентах. Доля годится для расстановки приоритетов между службами.
[Service]
CPUQuota=50%
2. Жёсткий предел вызывает придержки и рост времени ответа
Почему происходит
При достижении предела процессы придерживаются до следующего периода учёта. Время ответа растёт скачками.
Как проверить
Посмотрите счётчики придержек.
systemctl show myapp.service -p CPUQuota
cat /sys/fs/cgroup/system.slice/myapp.service/cpu.stat 2>/dev/null | grep -i throttled
Как исправить
Поднимите предел или распределите нагрузку. Придержки при жёстком пределе — штатное поведение, а не сбой.
3. Ограничение задано на срезе, а ожидается на службе
Почему происходит
Пределы среза действуют на все службы внутри вместе. Служба может упираться в предел среза при своём свободном.
Как проверить
Посмотрите пределы службы и её среза.
systemctl show myapp.service -p Slice -p CPUQuota
systemctl show system.slice -p CPUQuota
Как исправить
Разберитесь, где задан предел. Пределы складываются, и узкое место может быть выше по дереву.

Пример вывода

Жёсткий предел даёт придержки при свободном процессоре. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

$ systemctl show myapp.service -p CPUQuota
CPUQuota=20%

$ cat /sys/fs/cgroup/system.slice/myapp.service/cpu.stat | grep throttled
nr_throttled 18422
throttled_usec 412008311

Связанные ошибки

Источники

  • systemd.resource-control(5)
    CPUWeight=, CPUQuota= и их различие.
    официальная документация, systemd 255
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Проверено на systemd 255: доля не ограничивает при свободном процессоре, жёсткий предел ограничивает всегда.
    собственная проверка, systemd 255
    сверено 15 сентября 2026