Насколько я понимаю, для одного и того же уровня двух cgroups (только), например:
foo
|
+- bar
|
+- baz
Тогда bar и baz сначала будут делить процессорзанято на foo в соответствии с cpu.share
.
Допустим, общий процессор равен 1 ядру с cpu.cfs_period_us
, установленным как 100ms .cpu.share
устанавливается как 1024 для бар и 1024 для баз .
если оба значения bar и baz устанавливают cpu.cfs_quota_us
больше 50 мс , например, 75 мс .Тогда обе группы будут делить процессор пополам, с точным значением 50 мс .
, если для обоих из них cpu.cfs_quota_us
установлено меньше 50 мс , например, 25мс .Они по-прежнему будут делить процессор 1: 1, но с точным значением 25 мс .
что если bar устанавливает квоту как 25 мс , в то время как баз устанавливает квоту как 75 мс (это именно то, что мне было интересно).Поскольку bar и baz имеют одинаковые cpu.share
, а bar имеет верхний предел, установленный как 25ms , это означает bar никогда не должно превышать 25 мс .Таким образом, с учетом периода 100 мс, бар будет потреблять 25 мс . Будет ли баз также потреблять 25 мс как бар из-за того же cpu.share
?Если да, то как мы можем оставить 50 мс?
Согласно документу RHEL6 :
Поскольку CFS не требует равного использованияПроцессор, трудно предсказать, сколько процессорного времени будет разрешено использовать группе.Когда задачи в одной группе неактивны и не используют процессорное время, оставшееся время собирается в глобальном пуле неиспользованных циклов ЦП.Другим группам разрешено заимствовать циклы ЦП из этого пула.
Мы можем видеть, что baz допустимо использовать незанятые циклы ЦП, то есть baz будет потреблять 75 мс за один период.
Вывод
cpu.share
и cpu.cfs_quota_us
работают вместе.
Учитывая общую квоту процессора, мы должны сначала распределить cpu.share
каждой группы.Затем найдите группы, чья точная квота превышает их cpu.cfs_quota_us
, найдите все такие группы и сохраните их квоту как cpu.cfs_quota_us
и соберите превышенную часть как неиспользованный пул ЦП.Распределите этот неиспользованный пул ЦП среди других cgroups снова cpu.share
и повторяйте, как указано выше, пока ни одна cgroup не превысит верхний предел.