2013-08-05 4 views
6

Ich muss ein Programm schreiben, das eine parallele Suche in einem großen Raum von möglichen Zuständen durchführt, wobei neue Bereiche entdeckt und gestartet werden einige Bereiche werden vorzeitig beendet, da die an anderer Stelle erhaltenen Zwischenergebnisse die Möglichkeit beseitigen, neue nützliche Ergebnisse zu entdecken. Die Suche wird unter Verwendung mehrerer Threads ausgeführt, die in einer starken Kooperation miteinander laufen, um eine Neuberechnung von Zwischendaten zu vermeiden.Ein Programm resistent gegen Strom/Hardware/Betriebssystemfehler

Ein komplexer interner Zustand (einschließlich Aufruf-Stacks mehrerer Threads und Zustandssynchronisations-Primitiven, die sie verwenden) muss während des gesamten Prozesses beibehalten und aktualisiert werden, und es gibt keine offensichtliche Möglichkeit, die Berechnung in isolierte Blöcke aufzuteilen, die ausgeführt werden können sequentiell, jedes Speichern und Übergeben eines kleinen Zwischenergebnisses an das nächste. Außerdem gibt es keine Möglichkeit, die Berechnung in unabhängige parallele Threads aufzuteilen, die nicht miteinander kommunizieren, ohne einen prohibitiven Overhead aufgrund der Neuberechnung einer großen Menge von Zwischendaten aufzuerlegen.

Wegen der großen Suchdomäne würde das Programm möglicherweise für Monate laufen, bevor ein Endergebnis produziert wird. Daher besteht während der Programmausführung ein erhebliches Risiko, dass Strom, Hardware oder Betriebssystem ausfällt, was zu einem vollständigen Verlust aller bis zu diesem Zeitpunkt ausgeführten Arbeiten führen kann. In diesem Fall muss das Programm alle Berechnungen von Grund auf neu starten.

Ich brauche eine Lösung, die einen vollständigen Datenverlust in solchen Fällen verhindern kann. Ich dachte an eine Ausführungs-Engine/Plattform, die den aktuellen Zustand des Prozesses kontinuierlich in einen ausfallresistenten Speicher wie ein redundantes Festplatten-Array oder eine Datenbank speichert. Aber ich verstehe, dass dieser Ansatz den Prozess erheblich verlangsamen kann, sogar in einem Grad, in dem es keinen Vorteil gegenüber einer erwarteten Rechenzeit einschließlich Neustarts aufgrund möglicher Fehler geben würde.

In der Tat, ich brauche keine ideale Lösung, die kontinuierlich speichert den Programmstatus, und ich kann leicht einen Verlust von Stunden oder sogar Tage der Arbeit ertragen. Eine mögliche schwergewichtige Lösung, die mir in den Sinn kommt, besteht darin, das Programm in einer virtuellen Maschine auszuführen, seine Snapshots von Zeit zu Zeit zu speichern und die Maschine nach einem möglichen Hostausfall eines kürzlich erstellten Snapshots wiederherzustellen. Dieser Ansatz kann auch dazu beitragen, den Programmstatus nach einem zufälligen oder vermeidbaren Ausfall des Gastbetriebssystems wiederherzustellen.

Gibt es eine ähnliche, aber leichtere Lösung, die darauf beschränkt ist, den Status eines einzelnen Prozesses zu erhalten? Oder könnten Sie irgendwelche anderen Ansätze vorschlagen, die mein Problem lösen können?

+0

Die VM-Lösung ist nicht wirklich Schwergewicht IMO (obwohl ich aus der Perspektive eines Entwicklers denke, und das Hinzufügen von komplexen State-Speichern und erneutes Laden zu einem Multithread-Prozess macht mich zusammenzucken), und wenn Sie eine einfache integrieren können "Mechanismus zum Explorationsprozess anzuhalten, während die VM einen Snapshot speichert, nur um extra sicher zu sein - das wäre meine bevorzugte Wahl. –

+0

Es gibt eine Vielzahl von Software, um "Checkpoints" draußen zu speichern ... aber Sie erwähnen nicht, welches OS oder sogar Programmiersprache Sie verwenden möchten. – idfah

Antwort

1

Sie möchten vielleicht mit Erlang sehen, die eine große Anzahl von Threads zu relativ niedrigen Kosten ermöglicht. Da die Thread-Kosten niedrig sind, kann Redundanz verwendet werden, um eine erhöhte Zuverlässigkeit zu erreichen.

Für das Problem, das Sie präsentieren, könnte eine Dreifach-Redundanz-Schema der Weg sein, wo regelmäßige Überprüfungen für die Synchronisation über die drei (oder mehr) Systeme durch Abstimmung bestimmen würde, die fehlgeschlagen ist.

+0

Und mit 'mnesia' Tabellen können Sie Ihren Zustand redundant über> 1 Maschinen speichern. – haavee