Cgroup-Speichergrenzen und Prozessbeenden

Cgroup-Speichergrenzen und Prozessbeenden

Ich habe folgende Situation: (Die folgenden Funktionen stammen aus Python)

Bei mir läuft ein Prozess A, für den eine Cgroup-Speicherbeschränkung festgelegt ist.

Ich verzweige einen Kindprozess von A mit os.fork(). Nennen wir ihn B. Dann führe ich os.execvp aus, um ein Shell-Skript in B zu laden.http://www.csl.mtu.edu/cs4411.ck/www/NOTES/process/fork/exec.htmldieser Vorgang läuft im gleichen Adressraum wie der Anrufer (also B).

Das in B ausgeführte Shell-Skript erstellt ein Java-Programm, das unbegrenzt mit einer bestimmten Heap-Größe und automatischem Kill bei OOM ausgeführt wird. Dies wird erreicht durch die Übergabe-XX:BeiSpeicherfehler='kill -9 %p'zum Java-Befehl. Dadurch wird ein weiterer Prozess C als Kind von B erstellt.

Von oben betrachtet sehe ich B wie erwartet als Kind von A und C als Kind von B.

Nachfolgend sind die Zweifel aufgeführt:

  1. Gilt die Kontrollgruppenbeschränkung nur für A oder (A+B) oder (A+B+C)?

  2. Wenn das Speicherlimit erreicht ist, welche Prozesse werden dann beendet: A oder (A+B) oder (A+B+C)? Und warum? Wird es anhand der Prozess-PIDs oder des Adressraums des Prozesses identifiziert, auf den das Limit angewendet wird?

  3. Wenn im obigen Punkt nicht alle Prozesse beendet werden, gibt es eine Möglichkeit, die Cgroup-Einstellungen so zu optimieren, dass auch alle untergeordneten Prozesse beendet werden, da wir in solchen Fällen mit verwaisten Prozessen zurückbleiben würden?

Ich arbeite mit Centos7 als zugrundeliegendem Betriebssystem.

Antwort1

Ich werde auf jede Ihrer Fragen eingehen:

  1. Die Kontrollgruppe gilt für A und alle Nachkommen von A. Sie können dieses Verhalten durch Experimente überprüfen. Beachten Sie:
Create a new memory cgroup
# mkdir /sys/fs/cgroup/memory/example

Note the shell's PID:
# echo $$
679

Put the running shell into the new cgroup
# echo $$ > /sys/fs/cgroup/memory/example/cgroup.procs

Examine what processes are in the cgroup.  Here 679 was the
shell's PID; 723 is the pid of cat
# cat /sys/fs/cgroup/memory/example/cgroup.procs
679
723

Start a new shell and note its PID
# bash
# echo $$
726

Examine what processes are in the cgroup.  679 was the original
shell.  726 is the second shell.  731 is cat:
# cat /sys/fs/cgroup/memory/example/cgroup.procs
679
726
731
  1. Entsprechend derSpeicher-Cgroup-Dokumentation:

Wenn eine Kontrollgruppe ihr Limit überschreitet, versuchen wir zunächst, Speicher von der Kontrollgruppe zurückzufordern, um Platz für die neuen Seiten zu schaffen, die die Kontrollgruppe bearbeitet hat. Wenn die Rückforderung nicht erfolgreich ist, wird eine OOM-Routine aufgerufen, um die umfangreichste Aufgabe in der Kontrollgruppe auszuwählen und zu beenden.

Auf dieser Grundlage werden nicht alle Prozesse in der Kontrollgruppe beendet, sondern der Prozess ausgewählt, der den meisten Speicher verbraucht.

  1. Ich sehe keine Möglichkeit, den Prozess, der beendet wird, so einzustellen, dass er Ihrer Frage entspricht. Es gibt eine Möglichkeit, den OOM-Killer etwas zu kontrollieren; siehe zum Beispiel diesWöchentlicher Linux-News-ArtikelDas heißt, wenn einer der übergeordneten Prozesse beendet wird, werden alle untergeordneten Prozesse dem Prozess mit PID = 1 (Standard) zugeordnet.

verwandte Informationen