Salvare l'intero processo per la continuazione dopo il riavvio


54

Ho sviluppato un algoritmo per un problema abbastanza difficile in matematica che probabilmente richiederà alcuni mesi per finire. Dato che ho solo risorse limitate, ho iniziato questo sul mio laptop Ubuntu 12.04 (x86). Ora voglio installare alcuni aggiornamenti e riavviare effettivamente il laptop (il messaggio "per favore riavvia" è solo fastidioso).

C'è un modo per salvare un intero processo inclusa la sua memoria allocata per la continuazione oltre un riavvio?

Ecco alcune informazioni sul processo di cui potresti aver bisogno. Non esitate a chiedere ulteriori informazioni se necessario.

  • Ho chiamato il processo in un terminale con il comando " ./binary > ./somefile &" o "time ./binary> ./somefile &", non ricordo davvero.
  • Sta stampando alcune informazioni di debug su std :: cerr (non molto spesso).
  • Attualmente utilizza circa 600,0 KiB e anche se questo aumenterà, è improbabile che aumenti rapidamente.
  • il processo viene eseguito con priorità normale
  • il kernel è 3.2.0-26-generic-pae, la cpu è un AMD, il sistema operativo è Ubuntu 12.04 x86.
  • dura da 9 giorni e 14 ore (troppo tempo per annullarlo ;-))

3
Per curiosità, cosa stai calcolando?
Viktor Mellgren il

3
@ user1261166: studio il problema della visita target (che è un'estensione del problema del commesso viaggiatore) con l'approccio Branch-and-Cut. Pertanto, ho bisogno di conoscere quante più sfaccettature di alcuni polytope speciali ad alta dimensione possibili. Fondamentalmente, sta facendo esplodere un grosso problema a uno gigantesco e quindi cercando di risolvere solo un po 'per ridurlo in seguito.
stefan,

5
Non risponde alla tua domanda, ma hai mai pensato di eseguire il tuo codice su un cluster dedicato in futuro? Quelli non si chiudono quasi mai e sono sicuro che ci sia qualche griglia di calcolo a tua disposizione. Non solo sono sempre attivi ma anche un po 'più veloci (soprattutto se puoi parallelizzare il tuo codice). Potresti anche provare a crearne uno tu stesso (cerca Oracle Grid Engine).
Wojtek Rzepala,

Non ho mai pensato che si trattasse di una domanda così popolare (almeno molto più popolare di ogni altra domanda da parte mia). Poiché il processo è terminato ora (inaspettatamente, anche se senza un arresto anomalo), proverò presto ogni metodo. Grazie a tutti!
stefan,

Risposte:


41

La soluzione migliore / più semplice è cambiare il programma per salvare lo stato in un file e riutilizzarlo per ripristinare il processo.

Sulla base della pagina di Wikipedia sulle istantanee delle applicazioni ci sono più alternative:

  1. C'è anche il cryopid, ma sembra non essere mantenuto.
  2. Il checkpoint / il riavvio di Linux sembra essere una buona scelta ma il kernel deve essere CONFIG_CHECKPOINT_RESTOREabilitato.
  3. criu è probabilmente il progetto più aggiornato e probabilmente il tuo scatto migliore, ma dipende anche da alcune opzioni specifiche del kernel che la tua distribuzione probabilmente non ha impostato.

Questo è già troppo tardi, ma un altro approccio più pratico è quello di avviare il processo in una macchina virtuale dedicata e sospendere e ripristinare l'intera macchina virtuale. A seconda dell'hypervisor è anche possibile spostare la macchina tra host diversi.

Per il futuro, pensa a dove esegui i tuoi processi di lunga durata, come metterli in parallelo e come gestire i problemi, ad es. Dischi completi, processo viene ucciso, ecc.


20

Un modo abbastanza "economico" per farlo sarebbe quello di eseguire l'elaborazione in una macchina virtuale (ad esempio, con VirtualBox). Prima di arrestare sospendere la VM e salvare lo stato. Dopo l'avvio ripristinare la VM e lo stato.

Questo ha lo svantaggio di richiedere l'uccisione e il riavvio del lavoro. Ma se in realtà funzionerà per diversi mesi, allora una differenza di nove giorni diventa banale (aumento del 5% su 6 mesi).


Modifica: ho appena realizzato che Ulrich lo aveva già menzionato nell'articolo 4 non numerato nella sua lista.

Ti incoraggio comunque a considerare questa opzione come opzione, soprattutto perché nessuna delle alternative sembra una soluzione solida. Ognuno ha una ragione per cui potrebbe non funzionare.

Suppongo che la cosa migliore da fare sarebbe provare una di quelle e se non funziona riavviare il lavoro in una macchina virtuale.


15

Dai un'occhiata allo strumento CryoPID .

Dalla home page: "CryoPID consente di acquisire lo stato di un processo in esecuzione in Linux e salvarlo in un file. Questo file può quindi essere utilizzato per riprendere il processo in un secondo momento, dopo un riavvio o anche su un altro computer".


4
Utilizzato prima questo per salvare lo stato di uno script Python in esecuzione su un box Linux e spostato in un box FreeBSD e ripreso lì. Un po 'di magia arcana in corso lì;)
Tim

Non sapevo che FreeBSD e Linux fossero compatibili con i binari; è qualcosa di molto interessante che ho appena imparato. Ciò significa che hanno esattamente identici modelli di memoria? Mi sembra incredulo che abbiano le stesse convenzioni di syscall, la stessa libc (immagino fbsd usa glibc), le stesse convenzioni di chiamata esatte a livello di asm, ecc. Le incompatibilità mi sembrano come se avessi preso un processo MacOS e scaricato su una scatola di Windows; è davvero sorprendente.
cat

Qualcuno l'ha provato di recente? Il sito è sparito, non riesco a trovare un .deb, la costruzione dal sorgente fallisce, ecc. Vorrei sapere se è possibile prima di spenderne ancora. Sono su Debian se è importante.
John P,

1
@JohnP È disponibile su GitHub ora: github.com/maaziz/cryopid
starbeamrainbowlabs il

7

Se finisci per riavviare il programma, ti incoraggio a dedicare un po 'di tempo ad aggiungere alcune funzionalità al tuo codice che potrebbero farti risparmiare tempo in futuro.

Se il processo verrà eseguito per un lungo periodo, essere in grado di salvare l'intero stato del processo al riavvio della macchina potrebbe non essere estremamente utile se il processo si arresta in modo anomalo mentre è in esecuzione.

Vorrei incoraggiarvi ad avere il vostro programma in uscita su un file "checkpoint" di dati. Questi dati dovrebbero essere sufficienti per consentire al programma di riprendere dallo stato in cui si trovava al momento del salvataggio del file del checkpoint. Non è necessario salvare l'intero processo, ma solo un'istantanea delle variabili rilevanti utilizzate nel calcolo, sufficiente affinché il calcolo riprenda da dove era stato interrotto. Il tuo codice dovrebbe anche includere un modo di leggere i dati da questo file per ottenere il suo stato iniziale.

È possibile impostare il codice in modo che quando si invia un segnale, si salva uno di questi file di checkpoint, in modo da poter salvare lo "stato" del calcolo in qualsiasi punto.

Inoltre, essere in grado di vedere come cambiano i dati man mano che il calcolo avanza potrebbe essere interessante in sé!

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.