У меня есть 3 процесса на одноядерном компьютере. Каждый процесс точно такой же и сжигает процессор так быстро, как может (замкнутый цикл). Два из них ( A
и B
) запускаются с помощью cgexec в отдельных группах с общими ресурсами 512 и 512. Третий ( C
) запускается регулярно, а не с cgexec.
Как только все запущено и работает, C
получает 66% процессорного времени A
и B
делится на 33%. Если я убью C
тогда A
и B
получу 50% каждый (как и ожидалось).
Почему C
получают 66%? Я бы ожидал 33% каждый в этом сценарии, или, может быть, 50% (C), 25% (A) и 25% (B). 66% C
не получится, как бы я ни учил математику.
В общем, я хочу понять, как процессы, запущенные без участия, cgexec
взаимодействуют с процессами, запущенными cgexec
при совместном использовании ресурсов (в частности, ЦП, но был бы признателен более общий ответ, если он не слишком сложен).
top
и я считаю, что они были запущены довольно просто из командной строки:cgexec -g cpu:foo myprogram
и./myprogram
. Это было какое-то время, поэтому я не помню точно.cpu.shares
это очень своеобразный вариант конфигурации; Я рекомендую делить вещи по процессорам, если возможно, используяcpuset.cpus
вместо этого.Ответы:
Cgroups являются иерархическими, и они наследуются всеми подпроцессами. Таким образом, все процессы должны быть в некоторой группе. По умолчанию это корневая группа, и по умолчанию она имеет 1024 доли, что вдвое больше, чем A и B в вашем примере.
Время ЦП делится между группами в соответствии с назначенным им весом в cpu.shares.
Если бы А имел 1024 доли, а В 512 и С 256 и D 256, то распределение времени процессора составило бы А - 50%, В - 25%, С и D 12,5%.
источник
cgexec
. Таким образом,cgexec
непроцесс получит 50%, а сгруппированные процессы - все оставшиеся 50%. Внутри сгруппированных процессов они делят свои 50% равномерно, то есть оба получают 25%. Это имело бы смысл, но это не то поведение, которое я наблюдал. То, что я видел, составляет 66%, 33% и 33%. Можете ли вы обновить ответ, чтобы включить больше деталей и, возможно, пример распространения?cgexec
получает 1024 доли. Любой запущенный процессcgexec
получает указанные акции. Таким образом, в этом случае один процесс получает 1024 акций, а два других - по 512, в результате чего я увидел распределение. Не могли бы вы обновить свой ответ, чтобы дать немного больше ясности, например, с примером?1024 + 512 + 512 = 2048
,512/2048 == 25%
, Я не верю, что этот ответ на самом деле правильный, по крайней мере, не на поверхности.