Come interagiscono i cgroup con processi non cgrouped?


12

Ho 3 processi su una macchina single core. Ogni processo è esattamente lo stesso e brucia la CPU il più velocemente possibile (tight loop). Due di questi ( Ae B) vengono lanciati con cgexec in gruppi separati con condivisioni impostate su 512 e 512. Il terzo ( C) viene avviato regolarmente, non con cgexec.

Una volta che tutto è attivo e funzionante, Cottiene il 66% della CPU mentre Ae Bdiviso il 33%. Se uccido Callora Ae Bottengo il 50% ciascuno (come previsto).

Perché Cottiene il 66%? Mi sarei aspettato il 33% ciascuno in questo scenario, o forse il 50% (C), il 25% (A) e il 25% (B). Il 66% Cnon funzionerà, non importa come faccio la matematica però.

In generale, voglio capire come i processi avviati senza cgexecinteragire con i processi avviati cgexecquando si tratta di condivisione delle risorse (CPU in particolare, ma una risposta più generale sarebbe apprezzata se non fosse troppo complessa).


Innanzitutto, mi chiedo come si misura la percentuale di utilizzo della CPU? Quali sono le priorità che gestisci A, B e C?
KWubbufetowicz,

Credo che stavo misurando l'utilizzo della CPU tope credo che siano stati avviati abbastanza semplicemente da un prompt dei comandi: cgexec -g cpu:foo myprograme ./myprogram. È passato un po 'di tempo, quindi non ricordo con certezza.
Micah Zoltu,

Può essere che il myprogram utilizzi più di un singolo thread / processo? A proposito, sei ancora interessato a risolvere questo problema?
KWubbufetowicz,

Il programma era un'applicazione di test scritta solo per testare questo comportamento. È stato intenzionalmente a thread singolo per restringere i risultati. Sono ancora interessato a una risposta a questa domanda.
Micah Zoltu,

Questa pagina di RedHat può essere di aiuto qui. cpu.sharesè un'opzione di configurazione molto particolare; Raccomando di dividere le cose per CPU se possibile usando cpuset.cpusinvece.
Wildcard

Risposte:


3

I cgroup sono gerarchici e sono ereditati da tutti i sottoprocessi. Quindi tutti i processi devono essere in qualche cgroup. Di default è il cgroup di root e di default ha 1024 condivisioni che sono il doppio di A e B nel tuo esempio.

Il tempo della CPU è condiviso tra i cgroup in base al peso assegnato loro in cpu.shares.

Se A avesse 1024 azioni e B 512 e C 256 e D 256, la distribuzione del tempo della CPU dovrebbe essere A - 50%, B - 25%, C e D 12,5%.


Quindi qualsiasi processo non avviato con cgexec si trova nel cgroup radice con 1024 condivisioni, suddiviso uniformemente tra tutti i figli immediati. Uno di questi figli immediati è il cgroup generato dalla chiamata cgexec. Quindi il non- cgexecprocesso otterrebbe il 50% e tutti i processi raggruppati condividerebbero il restante 50%. All'interno dei processi raggruppati condividono il loro 50% in modo uniforme, il che significa che entrambi ottengono il 25%. Ciò avrebbe senso, ma non è il comportamento che ho osservato. Quello che ho visto è il 66%, il 33% e il 33%. Puoi aggiornare la risposta per includere più dettagli e forse una distribuzione di esempio?
Micah Zoltu,

Oh, penso di vedere. Qualsiasi processo sul sistema operativo avviato senza cgexecottiene 1024 condivisioni. Qualsiasi processo avviato con cgexecottiene le condivisioni specificate. Quindi, in questo caso, un processo ottiene 1024 condivisioni e gli altri due ne ottengono 512 ciascuno, determinando la distribuzione che ho visto. Ti dispiacerebbe aggiornare la tua risposta per dare un po 'più di chiarezza, ad esempio, con un esempio?
Micah Zoltu,

In realtà, ciò non si somma ancora. 1024 + 512 + 512 = 2048. 512/2048 == 25%. Non credo che questa risposta sia effettivamente corretta, almeno non in superficie.
Micah Zoltu,

hai altri cgroups? Potrebbe influenzare i numeri. Puoi anche controllare i documenti redhat, c'è un esempio simile access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
Lazy404

Nient'altro di significato in esecuzione, la casella era inattiva prima e dopo l'esecuzione del test. Tutti gli esempi mostrano solo cosa succede quando tutti i processi vengono avviati con l'installazione di cgroups. Non discute cosa succede quando alcuni processi non usano cgroups, che è quello che sto cercando di capire.
Micah Zoltu,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.