Einzelnen Prozess auf der Festplatte anhalten / fortsetzen

22

Gelegentlich möchten wir speicherintensive Prozesse auf unseren Ubuntu- und OS X-Servern anhalten, um vorübergehend RAM für andere Jobs freizugeben. Wenn wir uns nur Sorgen um die CPU-Auslastung machen würden, würde ein einfaches Ctrl-ZVerfahren funktionieren. Wir müssen jedoch in der Lage sein, den RAM freizugeben (indem wir ihn auf die Festplatte schreiben) und dann den Prozess neu zu starten (Festplatte -> RAM) oder mit anderen Worten einen einzelnen Prozess "in den Ruhezustand zu versetzen". Irgendwelche Hinweise, wie das geht? (Am liebsten von CLI.) Danke.

Mike Covington
quelle
7
Ich nehme an, wenn ein Prozess in einem angehaltenen Zustand ist, ist der verwendete Speicher ein Kandidat für das Auslagern auf die Festplatte, falls erforderlich, und dies sollte automatisch vom Kernel aus erfolgen.
Enzotib
1
@enzotib - Ich habe keine Ahnung, ob dies auftritt und theoretisch klingt dies gut. Ich habe jedoch nur einen groben Test gemacht und in der Praxis funktioniert es nicht. Alle neuen Prozesse, die während des Suspendierens von 'RAM-Eatern' ausgelöst werden, sind äußerst träge, und ich kann keine Festplattenaktivität feststellen, die beim Auslagern von RAM auf die Festplatte zu erwarten wäre.
Mike Covington
1
@frozenwithjoy Ich kann bestätigen, dass dies auftritt. Ich kann mir nur vorstellen, dass ein angehaltener Prozess nicht nach und nach ausgelagert wird, wenn er nicht austauschbaren Speicher benötigt (ziemlich selten und (meistens) für root reserviert) oder wenn der zuzuordnende Speicher für einen anderen aktiven Prozess freigegeben ist .
Gilles 'SO - hör auf, böse zu sein'
1
Ein Begriff, der hier hilfreich sein könnte, ist "Checkpointing" (ja, eine hässliche Verbform). Dies ist im Allgemeinen ein schwieriges Problem, da das Programm möglicherweise einige Ressourcen verwendet, die den Status ändern können, während das Programm inaktiv ist. Die Lösung dieses Problems war früher ein Unterschied zwischen Big Iron und kleinen, fummeligen Computern.
dmckee

Antworten:

8

Es gibt keine allgemeine Möglichkeit, einen einzelnen Prozess in den Ruhezustand zu versetzen, sondern nur das gesamte System.

Wenn Sie sich jedoch nicht darum kümmern, dass das Prozessabbild einen Neustart nicht übersteht, gibt es eine integrierte Funktion zum Speichern des Prozessabbilds auf der Festplatte: Auslagern. Stellen Sie sicher, dass Sie über genügend Auslagerungsspeicher verfügen. Wenn Speicherbedarf besteht und der Prozess nicht aktiv ist (z. B. weil er angehalten wurde), wird der Speicher ausgelagert.

Wenn Sie wissen, dass der Prozess wahrscheinlich für längere Zeit inaktiv ist und dass Sie irgendwann eine schnelle Reaktionszeit benötigen, können Sie die Freigabe einer großen Menge RAM erzwingen, indem Sie eine große Menge RAM in a zuweisen Prozess von kurzer Dauer, z

perl -e '$tmp = "a" x 999999999' # allocate about 1GB

Sie haben keine Kontrolle darüber, was ausgelagert wird, sodass andere Prozesse ausgelagert werden können. Unter Linux können Sie einen Prozess wieder einlagern, indem Sie zwangsweise auf die zugeordneten Seiten zugreifen. Das Skript in dieser Antwort führt Folgendes aus: Laden Sie alle Seiten, die von einem Prozess zugeordnet wurden, in den Speicher (beachten Sie, dass dies geöffnete Dateien umfasst; Sie können Bereiche basierend auf den Karteninformationen selektiv durchlaufen, um das Vertauschen von Daten zu vermeiden, von denen Sie wissen, dass sie nicht benötigt werden Weitere Informationen finden Sie in dieser Antwort .

Gilles 'SO - hör auf böse zu sein'
quelle
13

Der gesuchte Begriff ist " Application Checkpointing ".

Die Tools, die ich kenne, sind CryoPID und CryoPID2 .

Beide Tools sind nur für Linux.

Ich kenne kein ähnliches Tool für BSD oder OS X.

Ikem
quelle
2
Eine andere zu verwendende App ist DMTCP: dmtcp.sourceforge.net
Deer Hunter
5

Stellen Sie sicher, dass Sie genügend Swap-Platz haben. Stellen Sie sicher, dass Ihr System so eingestellt ist, dass inaktive Seiten bevorzugt ausgetauscht werden ( vm.swappiness = 100 ). Dann sollte es ausreichen, den Vorgang auszusetzen. Der Kernel wird es vorziehen, die inaktiven Seiten auszutauschen.

David Schwartz
quelle
-1

Unter Mac OS X können Sie versuchen, mit dem purgeBefehl (im Lieferumfang von Xcode enthalten) einen Teil des (inaktiven) Arbeitsspeichers freizugeben.

vm_stat
purge
vm_stat
jefz
quelle
2
purgewürde hier nicht helfen. Der Festplatten-Cache wird entfernt, der Arbeitsspeicher eines Prozesses wird jedoch nicht ausgelagert, und ein anderer Prozess erhält keinen schnelleren Arbeitsspeicher.
Gilles 'SO- hör auf böse zu sein'