Wie interagieren Gruppen mit nicht gruppierten Prozessen?

12

Ich habe 3 Prozesse auf einer Single-Core-Maschine. Jeder Prozess ist genau der gleiche und brennt die CPU so schnell wie möglich (enge Schleife). Zwei von ihnen ( Aund B) werden mit cgexec in separaten Gruppen mit Freigaben von 512 und 512 Cgestartet. Die dritte ( ) wird regelmäßig gestartet, nicht mit cgexec.

Sobald alle aktiv sind, erhalten Sie C66% der CPU Aund Bteilen sich 33%. Wenn ich Cdann töte Aund jeweils B50% bekomme (wie erwartet).

Warum bekommt Cman 66%? In diesem Szenario hätte ich jeweils 33% erwartet, oder vielleicht 50% (C), 25% (A) und 25% (B). 66% werden Cnicht klappen, egal wie ich rechne.

Im Allgemeinen möchte ich verstehen, wie Prozesse gestartet werden, ohne cgexecmit Prozessen zu interagieren, die cgexecbeim Teilen von Ressourcen gestartet werden (insbesondere CPU, aber eine allgemeinere Antwort wäre wünschenswert, wenn sie nicht zu komplex ist).

Micah Zoltu
quelle
Zunächst frage ich mich, wie Sie den Prozentsatz der CPU-Auslastung messen. Welche Prioritäten setzen Sie bei A, B und C?
KWubbufetowicz
Ich glaube, ich habe die CPU-Auslastung mit gemessen, topund ich glaube, sie wurden ziemlich einfach über eine Eingabeaufforderung gestartet: cgexec -g cpu:foo myprogramund ./myprogram. Es hat eine Weile gedauert, deshalb erinnere ich mich nicht mit Sicherheit.
Micah Zoltu
Kann es sein, dass myprogram mehr als einen Thread / Prozess verwendet? Übrigens sind Sie immer noch daran interessiert, dieses Problem zu lösen?
KWubbufetowicz
Das Programm war eine Testanwendung, die nur zum Testen dieses Verhaltens geschrieben wurde. Es wurde absichtlich ein Thread erstellt, um die Ergebnisse einzugrenzen. Ich bin immer noch an einer Antwort auf diese Frage interessiert.
Micah Zoltu
Diese Seite von RedHat kann hier hilfreich sein. cpu.sharesist eine sehr eigenartige Konfigurationsoption; Ich empfehle, die Dinge nach Möglichkeit nach CPUs aufzuteilen und cpuset.cpusstattdessen zu verwenden.
Wildcard

Antworten:

3

Cgroups sind hierarchisch und werden von allen Unterprozessen geerbt. Alle Prozesse müssen sich also in einer cgroup befinden. Standardmäßig handelt es sich um die Stamm-C-Gruppe und hat standardmäßig 1024 Freigaben, was in Ihrem Beispiel doppelt so hoch wie A und B ist.

Die CPU-Zeit wird zwischen den Gruppen entsprechend der ihnen in cpu.shares zugewiesenen Gewichtung aufgeteilt.

Wenn A 1024 Aktien und B 512 und C 256 und D 256 hätte, wäre die CPU-Zeitverteilung A - 50%, B - 25%, C und D 12,5%.

Lazy404
quelle
Jeder Prozess, der nicht mit cgexec gestartet wird, befindet sich in der Root-C-Gruppe mit 1024 Freigaben, die gleichmäßig auf alle untergeordneten Elemente verteilt sind. Ein solches unmittelbares Kind ist die durch den Aufruf erzeugte cgroup cgexec. Der Nicht- cgexecProzess würde also 50% erhalten, und die gruppierten Prozesse würden alle die verbleibenden 50% teilen. Innerhalb der gruppierten Prozesse teilen sie ihre 50% gleichmäßig, was bedeutet, dass beide 25% erhalten. Dies würde Sinn machen, aber es ist nicht das Verhalten, das ich beobachtet habe. Was ich gesehen habe, sind 66%, 33% und 33%. Können Sie die Antwort aktualisieren, um weitere Details und möglicherweise eine Beispielverteilung aufzunehmen?
Micah Zoltu
Oh, ich glaube ich sehe. Jeder Prozess auf dem Betriebssystem, der gestartet wird, ohne cgexec1024 Freigaben zu erhalten. Jeder Prozess, der mit gestartet wird, cgexecerhält die angegebenen Freigaben. In diesem Fall erhält ein Prozess 1024 Freigaben und die anderen beiden 512, was zu der Verteilung führt, die ich gesehen habe. Würde es Ihnen etwas ausmachen, Ihre Antwort zu aktualisieren, um etwas mehr Klarheit zu schaffen, z. B. mit einem Beispiel?
Micah Zoltu
Tatsächlich summiert sich das immer noch nicht. 1024 + 512 + 512 = 2048. 512/2048 == 25%. Ich glaube nicht, dass diese Antwort tatsächlich richtig ist, zumindest nicht an der Oberfläche.
Micah Zoltu
Haben Sie noch andere Gruppen? Dies könnte sich auf die Zahlen auswirken. Sie können auch RedHat-Dokumente überprüfen. Ein ähnliches Beispiel finden Sie unter access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/…
Lazy404,
Nichts anderes von Bedeutung lief, die Box war vor und nach dem Testlauf im Leerlauf. Alle Beispiele zeigen nur, was passiert, wenn alle Prozesse mit cgroups setup gestartet werden. Es wird nicht besprochen, was passiert, wenn in einigen Prozessen keine Gruppen verwendet werden. Ich versuche das herauszufinden.
Micah Zoltu