Як взаємодіють групи з негрупованими процесами?


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коли справа стосується спільного використання ресурсів (зокрема CPU, але більш вдячна відповідь буде оцінена, якщо вона не надто складна).


Перш за все, мені цікаво, як ви вимірюєте відсоток використання процесора? Які пріоритети у вас виконуються A, B і C?
KWubbufetowicz

Я вважаю, що я вимірював використання процесора, topі я вважаю, що вони почалися досить просто з командного рядка: cgexec -g cpu:foo myprogramі ./myprogram. Минув час, тому я не пам'ятаю з певністю.
Micah Zoltu

Чи може бути так, що в моїй програмі використовується більше ніж один потік / процес? До речі, ти все ще зацікавлений у вирішенні цієї проблеми?
KWubbufetowicz

Програма була тестовою програмою, написаною саме для перевірки такої поведінки. Це було навмисно єдиною ниткою, щоб звузити результати. Мені все ще цікава відповідь на це питання.
Міхей Золту

Тут може допомогти ця сторінка від RedHat . cpu.shares- дуже своєрідний варіант конфігурації; Я рекомендую розділити речі за процесорами, якщо можливо, cpuset.cpusзамість цього.
Wildcard

Відповіді:


3

Групи є ієрархічними і успадковуються всіма підпроцесами. Тому всі процеси повинні бути в якійсь групі. За замовчуванням це коренева група, а за замовчуванням у неї 1024 спільних доступу, що вдвічі більше, ніж А і В у вашому прикладі.

Час процесора поділяється між групами між вагою відповідно до ваги, присвоєної їм у cpu.shares.

Якщо A мав 1024 частки, а B 512 і C 256 і D 256, розподіл часу процесора повинен бути A - 50%, B - 25%, C і D 12,5%.


Отже, будь-який процес, не запущений cgexec, знаходиться в кореневій групі з 1024 частками, розподіленими рівномірно між усіма безпосередніми дітьми. Однією з таких безпосередніх дітей є група, що формується при виклику cgexec. Таким чином, cgexecнепроцесовий процес отримає 50%, а групуючі процеси поділять усі 50%. У межах групованих процесів вони поділяють свої 50% рівномірно, тобто обидва отримують 25%. Це мало б сенс, але це не та поведінка, яку я спостерігав. Те, що я бачив, - це 66%, 33% та 33%. Чи можете ви оновити відповідь, щоб включити більше деталей та, можливо, приклад розподілу?
Міхе Золту

О, я думаю, що бачу. Будь-який процес в ОС, запущений без, cgexecотримує 1024 спільних доступу. Будь-який процес, запущений із, cgexecотримує вказані акції. Тож у цьому випадку один процес отримує 1024 акції, а два інші отримують 512 кожна, в результаті чого я бачив розповсюдження. Ви б не хотіли б оновити свою відповідь, щоб надати трохи більше ясності, наприклад, прикладом?
Міхей Золту

Насправді це все ще не складається. 1024 + 512 + 512 = 2048. 512/2048 == 25%. Я не вірю, що ця відповідь насправді правильна, принаймні не на поверхні.
Міхей Золту

Чи є у вас інші групи? Це може вплинути на цифри. Ви також можете перевірити redhat docs, це приклад подібного
Lazy404

Більше нічого важливого для запуску, вікно простоювало до і після тестового пробігу. Усі приклади показують лише те, що відбувається, коли всі процеси запускаються із встановленням груп. Це не обговорює, що відбувається, коли деякі процеси не використовують групи, це те, що я намагаюся з'ясувати.
Міхей Золту
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.