Как cgroups взаимодействуют с негруппированными процессами?

12

У меня есть 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при совместном использовании ресурсов (в частности, ЦП, но был бы признателен более общий ответ, если он не слишком сложен).

Мика Золту
источник
Прежде всего, мне интересно, как вы измеряете процент использования процессора? Какие приоритеты вы запускаете A, B и C?
KWubbufetowicz
Я полагаю, что я измерял загрузку процессора с помощью, topи я считаю, что они были запущены довольно просто из командной строки: cgexec -g cpu:foo myprogramи ./myprogram. Это было какое-то время, поэтому я не помню точно.
Мика Золту
Может ли быть так, что myprogram использует более одного потока / процесса? Кстати, вы все еще заинтересованы в решении этой проблемы?
KWubbufetowicz
Программа была тестовым приложением, написанным только для проверки этого поведения. Это было намеренно однопоточным, чтобы сузить результаты. Я все еще заинтересован в ответе на этот вопрос.
Мика Золту
Эта страница от RedHat может быть полезна здесь. cpu.sharesэто очень своеобразный вариант конфигурации; Я рекомендую делить вещи по процессорам, если возможно, используя cpuset.cpusвместо этого.
Подстановочный

Ответы:

3

Cgroups являются иерархическими, и они наследуются всеми подпроцессами. Таким образом, все процессы должны быть в некоторой группе. По умолчанию это корневая группа, и по умолчанию она имеет 1024 доли, что вдвое больше, чем A и B в вашем примере.

Время ЦП делится между группами в соответствии с назначенным им весом в cpu.shares.

Если бы А имел 1024 доли, а В 512 и С 256 и D 256, то распределение времени процессора составило бы А - 50%, В - 25%, С и D 12,5%.

Lazy404
источник
Таким образом, любой процесс, не запущенный с помощью cgexec, находится в корневой группе c 1024 долями, равномерно распределенными между всеми непосредственными дочерними элементами. Одним из таких непосредственных потомков является cgroup, сгенерированная вызовом cgexec. Таким образом, cgexecнепроцесс получит 50%, а сгруппированные процессы - все оставшиеся 50%. Внутри сгруппированных процессов они делят свои 50% равномерно, то есть оба получают 25%. Это имело бы смысл, но это не то поведение, которое я наблюдал. То, что я видел, составляет 66%, 33% и 33%. Можете ли вы обновить ответ, чтобы включить больше деталей и, возможно, пример распространения?
Мика Золту
О, я думаю, я вижу. Любой запущенный процесс без ОС cgexecполучает 1024 доли. Любой запущенный процесс cgexecполучает указанные акции. Таким образом, в этом случае один процесс получает 1024 акций, а два других - по 512, в результате чего я увидел распределение. Не могли бы вы обновить свой ответ, чтобы дать немного больше ясности, например, с примером?
Мика Золту
На самом деле, это все еще не складывается. 1024 + 512 + 512 = 2048, 512/2048 == 25%, Я не верю, что этот ответ на самом деле правильный, по крайней мере, не на поверхности.
Мика Золту
У вас есть другие группы? Это может повлиять на цифры. Вы также можете проверить RedHat документы, Ther это simmilar пример access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/...
Lazy404
Больше ничего не работало, коробка была простаивала до и после пробного запуска. Все примеры показывают, что происходит, когда все процессы запускаются с настройкой cgroups. Здесь не обсуждается, что происходит, когда некоторые процессы не используют cgroups, что я и пытаюсь выяснить.
Мика Золту