Comment «hiberner» un processus sous Linux en stockant sa mémoire sur disque et en le restaurant plus tard?


99

Est-il possible d '«hiberner» un processus sous Linux? Tout comme «hibernate» dans un ordinateur portable, je voudrais écrire toute la mémoire utilisée par un processus sur le disque, libérer de la RAM. Et puis plus tard, je peux «reprendre le processus», c'est-à-dire lire toutes les données de la mémoire et les remettre en RAM et je peux continuer mon processus?


8
Question intéressante: D
dangerstat

Ce que vous décrivez est en fait souvent appelé «point de contrôle», vous aurez peut-être plus de chance de chercher avec ce terme.
Tim Post

Il doit l'être. Bonne fonctionnalité. Hibernation vs fermeture.
Vitaly Fadeev

Réponses:


54

J'avais l'habitude de maintenir CryoPID , qui est un programme qui fait exactement ce dont vous parlez. Il écrit le contenu de l'espace d'adressage d'un programme, du VDSO, des références de descripteur de fichier et des états dans un fichier qui peut être reconstruit ultérieurement. CryoPID a démarré lorsqu'il n'y avait pas de hooks utilisables sous Linux lui-même et fonctionnait entièrement à partir de l'espace utilisateur (en fait, cela fonctionne toujours, en fonction de vos paramètres de distribution / noyau / sécurité).

Les problèmes étaient (en effet) les sockets, les signaux RT en attente, de nombreux problèmes X11, l'implémentation de la mise en cache de la glibc getpid () parmi beaucoup d'autres. La randomisation (en particulier le VDSO) s'est avérée insurmontable pour le petit nombre d'entre nous qui y travaillons après que Bernard s'en soit éloigné. Cependant, c'était amusant et est devenu le sujet de plusieurs thèses de maîtrise.

Si vous envisagez simplement un programme qui peut sauvegarder son état de fonctionnement et redémarrer directement dans cet état, il est loin ... beaucoup plus facile de simplement sauvegarder ces informations depuis le programme lui-même, peut-être lors de la maintenance d'un signal.


5
Depuis juillet 2014, malheureusement, CryoPID n'est plus maintenu et ne fonctionne pas sur les noyaux récents. Mais entre-temps de nouveaux projets voient le jour (des pas ont été franchis même en connexion TCP "hibernation"). J'ai mis une réponse ci-dessous avec des informations mises à jour. Vérifiez-le! ;)
dappiu

1
@dappiu C'est génial - mais CryoPID n'était qu'un exemple dans cette réponse pour illustrer à quel point cela peut être délicat, où j'ai continué en suggérant qu'ils gèrent la sauvegarde de l'état dans le programme lui-même, de manière à pouvoir être facilement repris. La stagnation de CryoPID ne rend pas la réponse moins pertinente.
Tim Post

Cryopid2 est plus récemment actif (2013): sourceforge.net/projects/cryopid2
Leopd

31

Je voudrais mettre une mise à jour de statut ici, à partir de 2014.

La réponse acceptée suggère CryoPID en tant qu'outil pour effectuer Checkpoint / Restore, mais j'ai trouvé que le projet était inimaginable et impossible à compiler avec les noyaux récents. Maintenant, j'ai trouvé deux projets activement maintenus fournissant la fonction de point de contrôle d'application.

Le premier, celui que je suggère parce que j'ai plus de chance de l'exécuter, est CRIU qui effectue le point de contrôle / restauration principalement dans l'espace utilisateur, et nécessite l'activation de l'option de noyau CONFIG_CHECKPOINT_RESTORE pour fonctionner.

Checkpoint / Restore In Userspace, ou CRIU (prononcé kree-oo, IPA: / krɪʊ /, russe: криу), est un outil logiciel pour le système d'exploitation Linux. À l'aide de cet outil, vous pouvez geler une application en cours d'exécution (ou une partie de celle-ci) et la placer sur un disque dur en tant que collection de fichiers. Vous pouvez ensuite utiliser les fichiers pour restaurer et exécuter l'application à partir du point où elle a été gelée. La particularité du projet CRIU est qu'il est principalement implémenté dans l'espace utilisateur.

Ce dernier est le DMTCP ; citant leur page principale:

DMTCP (Distributed MultiThreaded Checkpointing) est un outil permettant de vérifier de manière transparente l'état de plusieurs applications simultanées, y compris les applications multi-threadées et distribuées. Il opère directement sur l'exécutable binaire de l'utilisateur, sans aucun module du noyau Linux ni aucune autre modification du noyau.

Il y a aussi une belle page Wikipedia sur l'argument: Application_checkpointing


21

Les réponses évoquées ctrl-zparlent vraiment d'arrêter le processus avec un signal, dans ce cas SIGTSTP. Vous pouvez émettre un signal d'arrêt avec kill:

kill -STOP <pid>

Cela suspendra l'exécution du processus. Il ne libérera pas immédiatement la mémoire utilisée par celui-ci, mais comme la mémoire est requise pour d'autres processus, la mémoire utilisée par le processus arrêté sera progressivement remplacée.

Lorsque vous souhaitez le réveiller, utilisez

kill -CONT <pid>

Les solutions les plus compliquées, comme CryoPID, ne sont vraiment nécessaires que si vous voulez que le processus arrêté puisse survivre à un arrêt / redémarrage du système - il ne semble pas que vous en ayez besoin.


14

Le problème est de restaurer les flux - fichiers et sockets - que le programme a ouverts.

Lorsque tout votre système d'exploitation hiberne, les fichiers locaux et autres peuvent évidemment être restaurés. Les connexions réseau ne le font pas, mais le code qui accède à Internet est généralement plus de vérification des erreurs et ainsi de suite et survit aux conditions d'erreur (ou devrait le faire).

Si vous avez mis en veille prolongée par programme (sans prise en charge des applications), comment géreriez-vous les fichiers ouverts? Que faire si un autre processus accède à ces fichiers entre-temps? etc?

Maintenir l'état lorsque le programme n'est pas chargé va être difficile.

Le simple fait de suspendre les threads et de les laisser échanger sur le disque aurait à peu près le même effet?

Ou exécutez le programme dans une machine virtuelle et laissez la machine virtuelle gérer la suspension.



12

La réponse courte est "oui, mais pas toujours de manière fiable". Découvrez CryoPID:

http://cryopid.berlios.de/

Les fichiers ouverts seront en effet le problème le plus courant. CryoPID déclare explicitement:

Les fichiers ouverts et les décalages sont restaurés. Les fichiers temporaires qui n'ont pas été liés et ne sont pas accessibles sur le système de fichiers sont toujours enregistrés dans l'image. Les autres fichiers qui n'existent pas à la reprise ne sont pas encore restaurés. La prise en charge de l'enregistrement du contenu des fichiers pour de telles situations est prévue.

Les mêmes problèmes affecteront également les connexions TCP, bien que CryoPID prenne en charge tcpcp pour la reprise de la connexion.


3
Après avoir cliqué sur le bouton Soumettre, je réalise maintenant que cela ressemble beaucoup à du spam / publicité pour CryoPID. Ce n'est pas - je suis simplement un utilisateur satisfait de l'utilitaire, vraiment.
Ulisses Montenegro


6

J'ai étendu Cryopid en produisant un package appelé Cryopid2 disponible auprès de SourceForge. Cela peut aussi bien migrer un processus que le mettre en veille prolongée (avec tous les fichiers et sockets ouverts - les données dans les sockets / tuyaux sont aspirées dans le processus en veille prolongée et crachées dans ces derniers lorsque le processus est redémarré).

La raison pour laquelle je n'ai pas été actif avec ce projet est que je ne suis pas un développeur de noyau - à la fois cela (et / ou le cryopid original) a besoin de quelqu'un à bord qui puisse les faire fonctionner avec les derniers noyaux (par exemple Linux 3.x) .

La méthode Cryopid fonctionne - et est probablement la meilleure solution pour l'hibernation / migration de processus à usage général sous Linux que j'ai rencontrée.


3

Comme d'autres l'ont noté, il est difficile pour le système d'exploitation de fournir cette fonctionnalité, car l'application doit avoir une vérification d'erreurs intégrée pour gérer les flux interrompus.

Cependant, en passant, certains langages de programmation et outils qui utilisent des machines virtuelles prennent explicitement en charge cette fonctionnalité, comme le langage d'auto-programmation .


0

Ctrl-Z augmente les chances que les pages du processus soient permutées, mais cela ne libère pas complètement les ressources du processus. Le problème avec la libération complète des ressources d'un processus est que des éléments tels que les descripteurs de fichiers, les sockets sont des ressources du noyau que le processus utilise, mais ne sait pas comment persister tout seul. Donc, Ctrl-Z est aussi bon que possible.


0

Il y a eu des recherches sur les points de contrôle / restauration pour Linux dans les jours 2.2 et 2.4, mais cela n'a jamais dépassé le prototype. Il est possible (avec les mises en garde décrites dans les autres réponses) pour certaines valeurs de possible - je vous pouvez écrire un module noyau pour le faire, c'est possible. Mais pour la valeur commune du possible (puis-je le faire à partir du shell sur une distribution Linux commerciale), ce n'est pas encore possible.


0

C'est en quelque sorte le but ultime du système d'exploitation en cluster. Mathew Dillon met beaucoup d'efforts pour implémenter quelque chose comme ça dans son projet Dragonfly BSD .


Cette fonctionnalité est-elle entièrement implémentée dans Dragonfly BSD?
Arjun J Rao

0

ajouter une autre solution de contournement: vous pouvez utiliser virtualbox. exécutez vos applications dans une machine virtuelle normale et "enregistrez simplement l'état de la machine" quand vous le souhaitez. Je sais que ce n'est pas une réponse, mais j'ai pensé que cela pourrait être utile lorsqu'il n'y a pas de vraies options.

si pour une raison quelconque vous n'aimez pas virtualbox, vmware et Qemu sont aussi bons.


-2

Il y a ctrl+zsous Linux, mais je ne suis pas sûr qu'il offre les fonctionnalités que vous avez spécifiées. Je soupçonne que vous avez posé cette question car ce n'est pas le cas

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.