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 ( A
und B
) werden mit cgexec in separaten Gruppen mit Freigaben von 512 und 512 C
gestartet. Die dritte ( ) wird regelmäßig gestartet, nicht mit cgexec.
Sobald alle aktiv sind, erhalten Sie C
66% der CPU A
und B
teilen sich 33%. Wenn ich C
dann töte A
und jeweils B
50% bekomme (wie erwartet).
Warum bekommt C
man 66%? In diesem Szenario hätte ich jeweils 33% erwartet, oder vielleicht 50% (C), 25% (A) und 25% (B). 66% werden C
nicht klappen, egal wie ich rechne.
Im Allgemeinen möchte ich verstehen, wie Prozesse gestartet werden, ohne cgexec
mit Prozessen zu interagieren, die cgexec
beim Teilen von Ressourcen gestartet werden (insbesondere CPU, aber eine allgemeinere Antwort wäre wünschenswert, wenn sie nicht zu komplex ist).
top
und ich glaube, sie wurden ziemlich einfach über eine Eingabeaufforderung gestartet:cgexec -g cpu:foo myprogram
und./myprogram
. Es hat eine Weile gedauert, deshalb erinnere ich mich nicht mit Sicherheit.cpu.shares
ist eine sehr eigenartige Konfigurationsoption; Ich empfehle, die Dinge nach Möglichkeit nach CPUs aufzuteilen undcpuset.cpus
stattdessen zu verwenden.Antworten:
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%.
quelle
cgexec
. Der Nicht-cgexec
Prozess 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?cgexec
1024 Freigaben zu erhalten. Jeder Prozess, der mit gestartet wird,cgexec
erhä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?1024 + 512 + 512 = 2048
.512/2048 == 25%
. Ich glaube nicht, dass diese Antwort tatsächlich richtig ist, zumindest nicht an der Oberfläche.