2013-08-05 19 views
6

ho bisogno di scrivere un programma che esegue una ricerca in parallelo in un grande spazio di stati possibili, con nuove aree essere scoperto (e la loro esplorazione iniziata) nel processo, e l'esplorazione di alcune aree vengono terminate in anticipo poiché i risultati intermedi ottenuti altrove eliminano la possibilità di scoprire nuovi risultati utili in esse. La ricerca viene eseguita utilizzando più thread in esecuzione in una cooperazione intensa tra loro per evitare il ricalcolo dei dati intermedi.Un programma resistente a cadute di tensione/hardware/OS

Uno stato interno complesso (inclusi stack di chiamate di più thread e primitive di sincronizzazione dello stato che utilizzano) deve essere mantenuto e aggiornato durante l'intero processo e non esiste un modo apparente per dividere il calcolo in blocchi isolati che possono essere eseguiti sequenzialmente, ogni salvataggio e passaggio di un piccolo risultato intermedio al successivo. Inoltre, non è possibile suddividere il calcolo in thread paralleli indipendenti che non comunicano tra loro, senza imporre un overhead proibitivo a causa del ricalcolo di una grande quantità di dati intermedi.

A causa del dominio di ricerca di grandi dimensioni, il programma potrebbe essere eseguito per mesi prima di produrre un risultato finale. Quindi, durante l'esecuzione del programma c'è un rischio significativo di interruzione dell'alimentazione, dell'hardware o del sistema operativo che può portare a una completa perdita di tutto il lavoro che è stato fatto al momento. In tal caso, il programma dovrà riavviare tutti i suoi calcoli da zero.

Ho bisogno di una soluzione che possa impedire una perdita di dati completa in questi casi. Ho pensato a un motore/piattaforma di esecuzione che salva continuamente lo stato attuale del processo in uno storage resistente agli errori come un array di dischi o un database ridondanti. Ma capisco che questo approccio può rallentare in modo significativo il processo, anche fino a un punto in cui non ci sarebbe alcun vantaggio rispetto a un tempo di calcolo previsto, inclusi i riavvii dovuti a possibili guasti.

In effetti, non ho bisogno di una soluzione ideale che continuamente salvi lo stato del programma, e posso sopportare facilmente una perdita di ore o forse anche giorni di lavoro. Una possibile soluzione per i pesi massimi che mi viene in mente è quella di eseguire il programma all'interno di una macchina virtuale, salvando le sue istantanee di volta in volta e ripristinando la macchina dopo un possibile errore dell'host da una recente istantanea. Questo approccio può anche aiutare a ripristinare lo stato del programma dopo un errore del sistema operativo guest casuale o prevenibile.

Esiste una soluzione simile, ma più leggero limitato a preservare uno stato di un unico processo? Oppure potresti suggerire altri approcci che possano risolvere il mio problema?

+0

La soluzione VM non è proprio dei pesi massimi IMO (anche se sto pensando dal punto di vista di uno sviluppatore, e l'aggiunta di complessi stato salvato e ricaricato ad un processo multi-threaded mi sta facendo rabbrividire), e se è possibile integrare un semplice " pausa "meccanismo per il processo di esplorazione mentre la VM sta salvando un'istantanea, solo per essere extra-sicuro - questa sarebbe la mia scelta preferita. –

+0

C'è una varietà di software per salvare "checkpoint" là fuori ... ma non si parla di quale sistema operativo o di linguaggio di programmazione si intende utilizzare. – idfah

risposta

1

Si consiglia di guardare con Erlang, che consente un elevato numero di thread per eseguire a costi relativamente bassi. Poiché il costo del filo è basso, è possibile utilizzare la ridondanza per ottenere una maggiore affidabilità.

Per il problema che si presenta, uno schema di ridondanza tripla potrebbe essere la strada da percorrere, dove verifiche periodiche per la sincronizzazione tra i tre (o più) sistemi determinerebbero per voto chi ha fallito.

+0

E usando le tabelle 'mnesia' è possibile memorizzare il proprio stato in modo ridondante su> 1 macchine. – haavee