Enregistrer le processus entier pour la suite après le redémarrage

54

J'ai développé un algorithme pour un problème assez difficile en mathématiques qui peut prendre plusieurs mois. Comme je n'ai que des ressources limitées, j'ai commencé ceci sur mon ordinateur portable Ubuntu 12.04 (x86). Maintenant, je veux installer des mises à jour et redémarrer l'ordinateur portable (le message "redémarrez s'il vous plaît" est simplement ennuyeux).

Existe-t-il un moyen de sauvegarder tout un processus, y compris la mémoire allouée, pour le poursuivre au-delà d'un redémarrage?

Voici quelques informations sur le processus dont vous pourriez avoir besoin. S'il vous plaît n'hésitez pas à demander des informations supplémentaires si nécessaire.

  • J'ai appelé le processus dans un terminal avec la commande " ./binary > ./somefile &" ou "time ./binary> ./somefile &", je ne m'en souviens pas vraiment.
  • Cela affiche des informations de débogage sur std :: cerr (pas très souvent).
  • Il utilise actuellement environ 600,0 Ko et, même si cela va augmenter, il est peu probable que cela augmente rapidement.
  • le processus s'exécute avec une priorité normale
  • le noyau est 3.2.0-26-generic-pae, le cpu est un AMD, le système d'exploitation est Ubuntu 12.04 x86.
  • il fonctionne depuis 9 jours et 14 heures (donc trop long pour l'annuler ;-))
Stefan
la source
3
Par curiosité, que calculez-vous?
Viktor Mellgren
3
@ user1261166: J'étudie le problème de visite cible (qui est une extension du problème du voyageur de commerce) avec l'approche Branch-and-Cut. J'ai donc besoin de connaître autant de facettes que possible d'un polytope spécial de grande dimension. En gros, cela fait exploser un gros problème en un problème gigantesque et en essayant de résoudre juste un peu pour le réduire ensuite.
Stefan
5
Cela ne répond pas tout à fait à votre question, mais avez-vous envisagé d’exécuter votre code sur un cluster dédié à l’avenir? Ceux-ci sont à peine fermés et je suis sûr qu'il existe une grille informatique à votre disposition. Non seulement ils sont allumés tout le temps, mais ils sont aussi un peu plus rapides (surtout si vous pouvez paralléliser votre code). Vous pouvez même en configurer vous-même (consultez Oracle Grid Engine).
Wojtek Rzepala
Je n'ai jamais pensé que cette question soit aussi populaire (du moins beaucoup plus que toutes les autres questions de ma part, donc pour). Étant donné que le processus est terminé maintenant (de manière inattendue, mais sans incident), je vais essayer chaque méthode sous peu. Merci tout le monde!
Stefan
1
stackoverflow.com/questions/2134771/…
Ciro Santilli a dévoilé le

Réponses:

41

La solution la meilleure / la plus simple consiste à modifier votre programme pour enregistrer l'état dans un fichier et à réutiliser ce fichier pour restaurer le processus.

Basé sur la page wikipedia sur les instantanés d'application, il existe plusieurs alternatives:

  1. Il y a aussi un cryopidé mais il semble ne pas être maintenu.
  2. Le point de contrôle / redémarrage Linux semble être un bon choix, mais votre noyau doit l'avoir CONFIG_CHECKPOINT_RESTOREactivé.
  3. criu est probablement le projet le plus récent et probablement votre meilleur plan mais dépend également de certaines options spécifiques du noyau que votre distribution n'a probablement pas définies.

C'est déjà trop tard, mais une autre approche plus pratique consiste à démarrer votre processus dans une machine virtuelle dédiée, puis à suspendre et restaurer l'ensemble de la machine virtuelle. En fonction de votre hyperviseur, vous pouvez également déplacer la machine entre différents hôtes.

Pour l’avenir, réfléchissez à l’endroit où vous exécutez vos processus de longue durée, à la façon de les mettre en parallèle et à la façon de traiter les problèmes, par exemple des disques entiers, un processus est tué, etc.

Ulrich Dangel
la source
20

Une façon assez "peu coûteuse" de faire cela serait de faire le traitement dans une machine virtuelle (par exemple, avec VirtualBox). Avant de fermer l'ordinateur, suspendez la machine virtuelle et enregistrez l'état. Après le démarrage, restaurez la machine virtuelle et son état.

Cela a l’inconvénient d’exiger la suppression et la reprise du travail. Mais si le système fonctionne effectivement pendant plusieurs mois, une différence de neuf jours devient triviale (augmentation de 5% sur six mois).


Edit: Je viens de me rendre compte qu'Ulrich avait déjà mentionné cela dans le point 4 non numéroté de sa liste.

Je vous encourage tout de même à envisager cette option, d'autant plus qu'aucune de ces solutions ne semble être une solution solide. Chacun a une raison pour laquelle cela peut ne pas fonctionner.

Je suppose que la meilleure chose à faire serait d’essayer l’une de ces solutions et, si cela ne fonctionne pas, redémarrez le travail dans une machine virtuelle.

bahamat
la source
15

Jetez un coup d'œil à l'outil CryoPID .

Depuis la page d'accueil: "CryoPID vous permet de capturer l'état d'un processus en cours d'exécution sous Linux et de l'enregistrer dans un fichier. Ce fichier peut ensuite être utilisé pour reprendre le processus ultérieurement, soit après un redémarrage, soit même sur un autre ordinateur."

Tim
la source
4
Utilisé auparavant pour enregistrer l'état d'un script python s'exécutant sur une machine Linux, il a été déplacé dans une boîte FreeBSD et y a été repris. Un peu de magie arcanique s'y passe;)
Tim le
Je ne savais pas que FreeBSD et Linux étaient compatibles binaires; c'est quelque chose de très intéressant que je viens d'apprendre. Mais cela signifie-t-il qu'ils ont des modèles de mémoire exactement identiques? Il me semble incrédule qu'ils aient les mêmes conventions syscall, la même libc (j'imagine que fbsd use glibc), les mêmes conventions d'appels exactes au niveau asm, etc. le sur une boîte de Windows; c'est vraiment assez étonnant.
chat
Quelqu'un at-il essayé récemment? Le site est parti, je ne trouve pas de fichier .deb, la construction à partir de la source échoue, etc. J'aimerais savoir si c'est possible avant de passer plus de temps dessus. Je suis sur Debian si cela compte.
John P
1
@JohnP Il est disponible sur GitHub maintenant: github.com/maaziz/cryopid
starbeamrainbowlabs
7

Si vous avez besoin de redémarrer votre programme, je vous encourage à passer du temps à ajouter des fonctionnalités à votre code qui pourraient vous faire gagner du temps.

Si le processus doit être exécuté pendant une longue période, le fait de pouvoir sauvegarder l’état complet du processus lorsque vous redémarrez la machine n’est peut-être pas extrêmement utile si votre processus se bloque pendant son exécution.

Je vous encourage à avoir la sortie de votre programme dans un fichier "checkpoint" de données. Ces données doivent être suffisantes pour que votre programme puisse reprendre à partir de l'état où il se trouvait lorsque le fichier de point de contrôle a été enregistré. Vous n'avez pas besoin de sauvegarder l'ensemble du processus, mais un instantané des variables pertinentes utilisées dans votre calcul, suffisant pour que votre calcul reprenne là où il s'était arrêté. Votre code devra également inclure un moyen de lire les données de ce fichier pour obtenir son état de départ.

Vous pouvez configurer votre code afin que, lorsque vous lui envoyez un signal, il enregistre l'un de ces fichiers de point de contrôle afin que vous puissiez enregistrer "l'état" de votre calcul à tout moment.

De plus, être capable de voir comment les données changent au fur et à mesure du calcul peut être intéressant en soi!

James Womack
la source