Bedeutet das Senden des SIGKILL an einen ausgelagerten Prozess, dass dieser vor dem Beenden wieder ausgelagert wird?

Bedeutet das Senden des SIGKILL an einen ausgelagerten Prozess, dass dieser vor dem Beenden wieder ausgelagert wird?

Angenommen, ich möchte einen Prozess auf einem Linux-Rechner mit Swap beenden (der eigentlich ein ZRAM ist). Der Swap ist halb so groß wie der RAM. Im RAM sind nur 10 % freier Speicherplatz vorhanden und der Swap ist auch fast voll.

Der Prozess nutzt nur 2 % des RAM, aber etwa 90 % des Swap-Speichers.

Wenn Sie einen Soft Close (SIGTERM) durchführen und dem Prozess erlauben, das Signal abzufangen und sich selbst zu schließen, würden alle ausgelagerten Zuordnungen aufgehoben, es ist jedoch nicht genügend freier RAM für den gesamten Prozess vorhanden.

Aus diesem Grund ist es möglicherweise besser, den Prozess mit SIGKILL zu beenden, aber ich befürchte immer noch, dass OOM-Killer andere Prozesse oder sogar die gesamte X-Sitzung oder Init beenden würde, weil nicht genügend Speicher vorhanden ist.

Veranlasst das Senden eines Kill-Signals den Kernel also dazu, ausgelagerte Teile des Prozesses in den physischen Speicher zu verschieben?(Was erwartet mich? Hängt es von der Kernel-Version ab?)

Wenn ja, was ist in einem solchen Fall zu tun? Das Ziel besteht darin, den Prozess zu beenden, ohne den Rest zu beeinträchtigen (es laufen noch andere wichtige Prozesse).

Und wie kann ich es ordnungsgemäß beenden, wenn es sich nicht um einen einzelnen Prozess, sondern um einen Prozessbaum handelt und ich die Anwendung nicht von selbst beenden lassen kann?

Antwort1

Generell werden Seiten nicht zurück in den RAM geladen, es sei denn, sie werden benötigt. Das heißt, die Seite wird nur dann zurück in den RAM geladen, wenn tatsächlich auf die Seite zugegriffen wird (was eine Seitenfehlerausnahme in der MMU verursacht, die das Betriebssystem behandeln würde, indem es die Seite zurück in den RAM lädt, bevor der zugreifende Thread fortgesetzt werden kann). Durch das Hard-Killing des Prozesses (mit SIGKILL) werden keine Threads des Prozesses ausgeführt, sodass der beendete Prozess nicht versuchen kann, auf eine seiner Seiten zuzugreifen, und diese Seiten sollten nicht in den RAM geladen werden.

Selbst wenn Sie den Prozess nicht beenden und er weiterläuft, wird er tatsächlich nur die Seiten auslagern (in den RAM), auf die er tatsächlich zugreift. Wenn der gesamte RAM voll ist und auf eine andere Seite zugegriffen werden muss, die sich nicht im RAM befindet, wählt das Betriebssystem außerdem eine andere RAM-Seite aus, die ausgelagert (auf die Festplatte) wird, um im RAM Platz für die Seite zu schaffen, auf die Ihr Programm zugreifen muss. Solange in der Swap-Partition auf der Festplatte noch Platz ist, kann dieses Auslagern der Seiten unbegrenzt fortgesetzt werden, sodass alles am Leben bleibt, ohne dass der OOM-Killer ausgelöst wird. Wenn dies häufig vorkommt, kann es Ihren Computer natürlich erheblich verlangsamen, da er die meiste Zeit damit verbringt, Speicher zwischen RAM und Festplatte zu verschieben, anstatt Programmbefehle auszuführen. Dies wird als „Thrashing“ bezeichnet.

Antwort2

Um den gesamten Prozessbaum zu beenden, können Sie Folgendes versuchen:

# in pid is saved pid of the parent process
CPIDS=`pgrep -P $pid` # gets pids of child processes
for cpid in $CPIDS ; do kill -9 $cpid ; done # first kill children
kill -9 $pid # then the parent (yeah, that sound kinda bad)

verwandte Informationen