Come "ibernare" un processo in Linux archiviando la sua memoria su disco e ripristinandolo in seguito?


99

È possibile "ibernare" un processo in Linux? Proprio come "ibernazione" nel laptop, vorrei scrivere tutta la memoria utilizzata da un processo su disco, liberando la RAM. E poi in seguito, posso 'riprendere il processo', cioè leggere tutti i dati dalla memoria e rimetterli nella RAM e posso continuare con il mio processo?


8
Domanda interessante: D
— dangerstat

Ciò che descrivi in ​​realtà viene spesso definito "checkpoint", potresti avere più fortuna a cercare con quel termine.
— Tim Post

Deve essere una buona caratteristica. Ibernazione vs vicino.
— Vitaly Fadeev

Risposte:


54

Ho usato per mantenere CryoPID , che è un programma che fa esattamente quello di cui stai parlando. Scrive il contenuto dello spazio degli indirizzi di un programma, VDSO, i riferimenti ai descrittori di file e gli stati in un file che può essere successivamente ricostruito. CryoPID è iniziato quando non c'erano hook utilizzabili in Linux stesso e ha funzionato interamente dallo spazio utente (in realtà, funziona ancora, a seconda delle impostazioni di distribuzione / kernel / sicurezza).

I problemi erano (in effetti) socket, segnali RT in sospeso, numerosi problemi X11, l'implementazione getpid () della cache glibc tra molti altri. La randomizzazione (specialmente VDSO) si è rivelata insormontabile per i pochi di noi che ci lavoravano dopo che Bernard se ne era andato. Tuttavia, è stato divertente ed è diventato l'argomento di diverse tesi di laurea.

Se stai solo contemplando un programma che possa salvare il suo stato di esecuzione e riavviarlo direttamente in quello stato, è molto ... molto ... più facile salvare le informazioni dall'interno del programma stesso, forse quando si serve un segnale.


5
A partire da luglio 2014, sfortunatamente, CryoPID non è più mantenuto e non funziona sui kernel recenti. Ma nel frattempo nascono nuovi progetti (qualche passo è stato fatto anche nella connessione TCP "ibernazione"). Ho messo una risposta di seguito con informazioni aggiornate. Controlla! ;)
— dappiu

1
@dappiu È fantastico, ma CryoPID era solo un esempio in questa risposta per illustrare quanto possa essere complicato, dove ho continuato a suggerire che gestiscono il salvataggio dello stato all'interno del programma stesso, in modo tale che possa essere facilmente ripreso. Il ristagno di CryoPID non rende la risposta meno rilevante.
— Tim Post

Cryopid2 è attivo più di recente (2013): sourceforge.net/projects/cryopid2
— Leopd

31

Vorrei inserire un aggiornamento di stato qui, a partire dal 2014.

La risposta accettata suggerisce CryoPID come strumento per eseguire Checkpoint / Restore, ma ho trovato il progetto non gestito e impossibile da compilare con i kernel recenti. Ora, ho trovato due progetti gestiti attivamente che forniscono la funzione di checkpoint dell'applicazione.

Il primo, quello che suggerisco perché ho più fortuna a eseguirlo, è CRIU che esegue il checkpoint / ripristino principalmente nello spazio utente e richiede che l'opzione del kernel CONFIG_CHECKPOINT_RESTORE sia abilitata per funzionare.

Checkpoint / Restore In Userspace, o CRIU (pronunciato kree-oo, IPA: / krɪʊ /, Russian: криу), è uno strumento software per il sistema operativo Linux. Utilizzando questo strumento, è possibile bloccare un'applicazione in esecuzione (o parte di essa) e posizionarla su un disco rigido come raccolta di file. È quindi possibile utilizzare i file per ripristinare ed eseguire l'applicazione dal punto in cui è stata bloccata. La caratteristica distintiva del progetto CRIU è che è implementato principalmente nello spazio utente.

Quest'ultimo è DMTCP ; citando dalla loro pagina principale:

DMTCP (Distributed MultiThreaded Checkpointing) è uno strumento per controllare in modo trasparente lo stato di più applicazioni simultanee, comprese le applicazioni multi-thread e distribuite. Funziona direttamente sull'eseguibile binario dell'utente, senza alcun modulo del kernel Linux o altre modifiche al kernel.

C'è anche una bella pagina di Wikipedia sull'argomento: Application_checkpointing


21

Le risposte menzionate ctrl-zparlano davvero di fermare il processo con un segnale, in questo caso SIGTSTP. Puoi emettere un segnale di stop con kill:

kill -STOP <pid>

Ciò sospenderà l'esecuzione del processo. Non libererà immediatamente la memoria da esso utilizzata, ma poiché la memoria è richiesta per altri processi, la memoria utilizzata dal processo interrotto verrà gradualmente sostituita.

Quando vuoi riattivarlo, usa

kill -CONT <pid>

Le soluzioni più complicate, come CryoPID, sono davvero necessarie solo se si desidera che il processo interrotto sia in grado di sopravvivere a un arresto / riavvio del sistema - non sembra che tu ne abbia bisogno.


14

Il problema è ripristinare i flussi - file e socket - che il programma ha aperto.

Quando l'intero sistema operativo si iberna, i file locali e simili possono ovviamente essere ripristinati. Le connessioni di rete no, ma il codice che accede a Internet è in genere più controllo degli errori e tale e sopravvive alle condizioni di errore (o dovrebbe farlo).

Se eseguissi l'ibernazione per programma (senza il supporto dell'applicazione), come gestiresti i file aperti? Cosa succede se un altro processo accede a quei file nel frattempo? eccetera?

Mantenere lo stato quando il programma non è caricato sarà difficile.

La semplice sospensione dei thread e lo scambio su disco avrebbe più o meno lo stesso effetto?

Oppure esegui il programma in una macchina virtuale e lascia che la VM gestisca la sospensione.



12

La risposta breve è "sì, ma non sempre affidabile". Controlla CryoPID:

http://cryopid.berlios.de/

I file aperti saranno infatti il ​​problema più comune. CryoPID afferma esplicitamente:

I file aperti e gli offset vengono ripristinati. I file temporanei che sono stati scollegati e non sono accessibili sul filesystem vengono sempre salvati nell'immagine. Altri file che non esistono al ripristino non sono ancora stati ripristinati. È previsto il supporto per il salvataggio dei contenuti dei file per tali situazioni.

Gli stessi problemi interesseranno anche le connessioni TCP, sebbene CryoPID supporti tcpcp per la ripresa della connessione.


3
Dopo aver premuto il pulsante di invio, ora mi rendo conto che questo è molto simile a spam / pubblicità per CryoPID. Non lo è: sono semplicemente un utente soddisfatto dell'utilità, davvero.
— Ulisses Montenegro


6

Ho esteso Cryopid producendo un pacchetto chiamato Cryopid2 disponibile da SourceForge. Questo può migrare un processo così come ibernarlo (insieme a tutti i file e socket aperti - i dati nei socket / pipe vengono risucchiati nel processo in ibernazione e rigettati in questi quando il processo viene riavviato).

Il motivo per cui non sono stato attivo con questo progetto è che non sono uno sviluppatore di kernel: sia questo (e / o il cryopid originale) hanno bisogno di qualcuno che possa farli funzionare con i kernel più recenti (ad esempio Linux 3.x) .

Il metodo Cryopid funziona ed è probabilmente la migliore soluzione per l'ibernazione / migrazione dei processi generici in Linux che ho incontrato.


3

Come altri hanno notato, è difficile per il sistema operativo fornire questa funzionalità, perché l'applicazione deve avere un controllo degli errori integrato per gestire i flussi interrotti.

Tuttavia, in una nota a margine, alcuni linguaggi di programmazione e strumenti che utilizzano macchine virtuali supportano esplicitamente questa funzionalità, come il linguaggio di programmazione Self .


0

Ctrl-Z aumenta le possibilità che le pagine del processo vengano scambiate, ma non libera completamente le risorse del processo. Il problema con la liberazione completa delle risorse di un processo è che cose come gli handle di file, i socket sono risorse del kernel che il processo può usare, ma non sa come persistere da solo. Quindi Ctrl-Z è il massimo.


0

Ci sono state alcune ricerche sul checkpoint / ripristino per Linux nei giorni 2.2 e 2.4, ma non sono mai riuscite a superare il prototipo. È possibile (con le avvertenze descritte nelle altre risposte) per alcuni valori di possibile - se puoi scrivere un modulo del kernel per farlo, è possibile. Ma per il valore comune di possibile (posso farlo dalla shell su una distribuzione Linux commerciale), non è ancora possibile.


0

Questa è una sorta di obiettivo finale del sistema operativo in cluster. Mathew Dillon si impegna molto per implementare qualcosa di simile nel suo progetto Dragonfly BSD .


Questa funzione è completamente implementata in Dragonfly BSD?
— Arjun J Rao

0

aggiungendo un'altra soluzione alternativa: puoi usare virtualbox. esegui le tue applicazioni in una normale macchina virtuale e semplicemente "salva lo stato della macchina" quando vuoi. So che questa non è una risposta, ma ho pensato che potesse essere utile quando non ci sono opzioni reali.

se per qualsiasi motivo non ti piace virtualbox, vmware e Qemu sono altrettanto buoni.


-2

C'è ctrl+zin Linux, ma non sono sicuro che offra le funzionalità che hai specificato. Sospetto che tu abbia fatto questa domanda poiché non è così

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.