Ограничение процессора: доля и жёсткий предел работают по-разному
Доля процессора распределяет время только при нехватке: пока процессор свободен, служба не ограничена вовсе. Жёсткий предел режет потребление всегда, даже на простаивающей машине. Из-за этой разницы одна и та же настройка выглядит то работающей, то нет.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Доля не ограничивает при свободном процессоре
Доля действует только при соперничестве. На свободной машине служба использует столько, сколько может.
-
Жёсткий предел вызывает придержки и рост времени ответа
При достижении предела процессы придерживаются до следующего периода учёта. Время ответа растёт скачками.
-
Ограничение задано на срезе, а ожидается на службе
Пределы среза действуют на все службы внутри вместе. Служба может упираться в предел среза при своём свободном.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Фактическое потребление процессора по срезам и службам.
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Решение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Доля действует только при соперничестве. На свободной машине служба использует столько, сколько может.
- Как проверить
-
Посмотрите настройки и фактическое потребление.
systemctl show myapp.service -p CPUWeight -p CPUQuota systemd-cgtop -1 -n1 2>/dev/null | head -8
- Как исправить
-
Если нужен предел в любых условиях, задавайте жёсткий предел в процентах. Доля годится для расстановки приоритетов между службами.
[Service] CPUQuota=50%
- Почему происходит
- При достижении предела процессы придерживаются до следующего периода учёта. Время ответа растёт скачками.
- Как проверить
-
Посмотрите счётчики придержек.
systemctl show myapp.service -p CPUQuota cat /sys/fs/cgroup/system.slice/myapp.service/cpu.stat 2>/dev/null | grep -i throttled
- Как исправить
- Поднимите предел или распределите нагрузку. Придержки при жёстком пределе — штатное поведение, а не сбой.
- Почему происходит
- Пределы среза действуют на все службы внутри вместе. Служба может упираться в предел среза при своём свободном.
- Как проверить
-
Посмотрите пределы службы и её среза.
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
Связанные ошибки
- Служба работает медленно: упор в CPUQuota Квота процессора ограничивает службу: признаки, как измерить и когда квота вредна.
- Ограничение среза душит службу Предел у службы поднят, а упор остаётся: ограничение действует на уровне среза.
- Перегрев: частота снижена, службы работают медленнее Ядро сообщает о снижении частоты из-за температуры. Службы отвечают медленнее без ошибок в своих журналах.
- cgroup: fork rejected by pids controller Служба не может создать процесс: исчерпан предел числа задач в срезе. Разбор пределов на службе и срезе.
- Ограничения ресурсов не работают: система в смешанном режиме срезов Параметры памяти и процессора не действуют: используется устаревший режим срезов или смешанный.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Disk quota exceeded для службы Место на разделе есть, а запись отклоняется: исчерпана дисковая квота пользователя или группы.
- Elasticsearch: max virtual memory areas vm.max_map_count is too low Elasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
Источники
-
systemd.resource-control(5)
CPUWeight=, CPUQuota= и их различие. -
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Проверено на systemd 255: доля не ограничивает при свободном процессоре, жёсткий предел ограничивает всегда.