Speichern Sie den gesamten Prozess für die Fortsetzung nach dem Neustart


54

Ich habe einen Algorithmus für ein ziemlich schweres Problem in der Mathematik entwickelt, für dessen Abschluss wahrscheinlich mehrere Monate erforderlich sind. Da ich nur begrenzte Ressourcen habe, habe ich dies auf meinem Ubuntu 12.04 (x86) -Laptop gestartet. Jetzt möchte ich einige Updates installieren und den Laptop neu starten (die Meldung "Bitte neu starten" ist nur ärgerlich).

Gibt es eine Möglichkeit, einen gesamten Prozess einschließlich des zugewiesenen Speichers für die Fortsetzung nach einem Neustart zu speichern?

Hier finden Sie einige Informationen zu dem Vorgang, den Sie möglicherweise benötigen. Bitte fordern Sie bei Bedarf weitere Informationen an.

  • Ich habe den Prozess in einem Terminal mit dem Befehl " ./binary > ./somefile &" oder "time ./binary> ./somefile &" aufgerufen, kann mich aber nicht wirklich erinnern.
  • Es druckt einige Debug-Informationen nach std :: cerr (nicht sehr oft).
  • Derzeit werden ungefähr 600,0 kiB verbraucht, und obwohl dies zunehmen wird, ist es unwahrscheinlich, dass es schnell zunimmt.
  • Der Prozess läuft mit normaler Priorität ab
  • Der Kernel ist 3.2.0-26-generic-pae, die CPU ist eine AMD, das Betriebssystem ist Ubuntu 12.04 x86.
  • es läuft seit 9 tagen und 14 stunden (also zu lange um es zu stornieren ;-))

3
Was rechnen Sie aus Neugier?
Viktor Mellgren

3
@ user1261166: Ich untersuche das Zielvisitationsproblem (das eine Erweiterung des Travelling Salesman-Problems darstellt) mit Branch-and-Cut-Ansatz. Daher muss ich so viele Facetten eines speziellen hochdimensionalen Polytops wie möglich kennen. Im Grunde ist es ein großes Problem, das zu einem gigantischen Problem wird, und dann wird versucht, es ein wenig zu lösen, um es anschließend zu reduzieren.
Stefan

5
Es beantwortet Ihre Frage nicht ganz, aber haben Sie darüber nachgedacht, Ihren Code in Zukunft auf einem dedizierten Cluster auszuführen? Diese werden kaum heruntergefahren, und ich bin sicher, dass Ihnen ein Datenverarbeitungsnetz zur Verfügung steht. Sie sind nicht nur ständig aktiv, sondern auch erheblich schneller (insbesondere, wenn Sie Ihren Code parallelisieren können). Sie können sogar versuchen, selbst eine einzurichten (siehe Oracle Grid Engine).
Wojtek Rzepala

Ich hätte nie gedacht, dass dies eine so populäre Frage ist (zumindest viel populärer als jede andere Frage von mir). Da der Vorgang nun abgeschlossen ist (unerwartet, jedoch ohne Absturz), werde ich jede Methode in Kürze ausprobieren. Vielen Dank an alle!
Stefan

Antworten:


41

Die beste / einfachste Lösung besteht darin, Ihr Programm zu ändern, um den Status in einer Datei zu speichern und diese Datei erneut zu verwenden, um den Prozess wiederherzustellen.

Basierend auf der Wikipedia-Seite zu Anwendungsschnappschüssen gibt es mehrere Alternativen:

  1. Es gibt auch Kryopiden, aber es scheint nicht gepflegt zu sein.
  2. Linux Checkpoint / Restart scheint eine gute Wahl zu sein, aber Ihr Kernel muss CONFIG_CHECKPOINT_RESTOREaktiviert sein.
  3. criu ist wahrscheinlich das aktuellste Projekt und Ihre beste Einstellung, hängt aber auch von bestimmten Kernel-Optionen ab, die Ihre Distribution wahrscheinlich nicht festgelegt hat.

Dies ist bereits zu spät. Ein weiterer praktischer Ansatz besteht darin, den Prozess in einer dedizierten VM zu starten und die gesamte virtuelle Maschine anzuhalten und wiederherzustellen. Abhängig von Ihrem Hypervisor können Sie den Computer auch zwischen verschiedenen Hosts verschieben.

Überlegen Sie sich für die Zukunft, wo Sie Ihre lang laufenden Prozesse ausführen, wie Sie sie parallisieren und wie Sie mit Problemen umgehen, z.


20

Ein ziemlich "billiger" Weg, dies zu tun, wäre die Verarbeitung in einer VM (z. B. mit VirtualBox). Bevor Sie herunterfahren, halten Sie die VM an und speichern Sie den Status. Stellen Sie nach dem Booten den VM & Status wieder her.

Dies hat den Nachteil, dass der Job beendet und neu gestartet werden muss. Aber wenn es tatsächlich mehrere Monate läuft, wird ein Unterschied von neun Tagen unwesentlich (5% mehr als 6 Monate).


Edit: Mir ist gerade aufgefallen, dass Ulrich dies bereits in Punkt 4 seiner Liste erwähnt hat.

Ich möchte Sie dennoch ermutigen, dies als Option in Betracht zu ziehen, zumal keine der Alternativen als robuste Lösung erscheint. Jeder hat einen Grund, warum es möglicherweise nicht funktioniert.

Ich nehme an, das Beste, was Sie tun können, ist, einen dieser Vorgänge zu versuchen. Wenn dies nicht funktioniert, starten Sie den Job in einer VM neu.


15

Werfen Sie einen Blick auf das Tool CryoPID .

Von der Homepage aus: "Mit CryoPID können Sie den Status eines laufenden Prozesses in Linux erfassen und in einer Datei speichern. Diese Datei kann dann verwendet werden, um den Prozess später fortzusetzen, entweder nach einem Neustart oder sogar auf einem anderen Computer."


4
Wurde zuvor verwendet, um den Status eines Python-Skripts zu speichern, das auf einer Linux-Box ausgeführt wird, und um es auf eine FreeBSD-Box zu verschieben und dort fortzusetzen. Irgendeine arkane Magie geht dort vor sich;)
Tim

Ich wusste nicht, dass FreeBSD und Linux binärkompatibel sind. das ist etwas sehr interessantes, was ich gerade gelernt habe. Aber heißt das, dass sie genau identische Speichermodelle haben? Es scheint mir ungläubig zu sein, dass sie dieselben Syscall-Konventionen, dieselbe libc (ich vermute, FBSD verwendet glibc), dieselben exakten Aufrufkonventionen auf ASM-Ebene usw. haben. Die Inkompatibilitäten klingen für mich so, als hätten Sie einen MacOS-Prozess ausgeführt und ausgegeben es auf eine Windows-Box; Das ist wirklich erstaunlich.
Katze

Hat jemand das vor kurzem versucht? Die Seite ist verschwunden, ich kann keine .deb finden, die Erstellung aus dem Quellcode schlägt fehl usw. Ich würde gerne wissen, ob dies möglich ist, bevor ich mehr dafür ausgebe. Ich bin auf Debian, wenn es darauf ankommt.
John P

1
@JohnP Es ist ab sofort auf GitHub verfügbar: github.com/maaziz/cryopid
starbeamrainbowlabs

7

Wenn Sie am Ende Ihr Programm neu starten müssen, würde ich Sie ermutigen, einige Zeit damit zu verbringen, Ihrem Code einige Funktionen hinzuzufügen, die Ihnen in Zukunft Zeit sparen könnten.

Wenn der Prozess längere Zeit ausgeführt wird, ist es möglicherweise nicht sehr hilfreich, den gesamten Prozessstatus beim Neustart des Computers zu speichern, wenn der Prozess während der Ausführung abstürzt.

Ich würde Sie ermutigen, Ihr Programm in eine Datei "Checkpoint" -Daten ausgeben zu lassen. Diese Daten sollten ausreichen, damit Ihr Programm den Status zum Zeitpunkt des Speicherns der Prüfpunktdatei wiederherstellen kann. Sie müssen nicht den gesamten Prozess speichern, sondern nur eine Momentaufnahme der relevanten Variablen, die in Ihrer Berechnung verwendet werden. Dies reicht aus, damit Ihre Berechnung dort fortgesetzt werden kann, wo sie aufgehört hat. Ihr Code müsste auch eine Möglichkeit zum Einlesen der Daten aus dieser Datei enthalten, um den Startzustand zu erhalten.

Sie können Ihren Code so einrichten, dass beim Senden eines Signals eine dieser Prüfpunktdateien gespeichert wird, sodass Sie den "Status" Ihrer Berechnung jederzeit speichern können.

Darüber hinaus könnte es für sich selbst interessant sein zu sehen, wie sich die Daten im Verlauf der Berechnung ändern!

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.