paralleles Rechnen im Netzwerk (Verteilerskript für Prozesse)



  • Hallo, ich bin mir nicht ganz sicher, ob ich hier mit meiner Frage richtig bin.. ich werde es daher mal etwas allgemeiner halten:
    Ich habe hier ein Netzwerk aus einigen Linux-Rechnern mit jeweils mehreren Prozessoren.
    Dieses Netzwerk soll genutzt werden, um physikalische Simulationen durchzuführen.
    Das zur Verfügung stehende Simulationsprogramm wird mittels Kommandozeilenaufruf gestartet und bekommt eine Datei übergeben, die es abarbeiten soll.
    Im Laufe der Abarbeitung werden Dateien erzeugt, die die Simulationsergebnisse enthalten.

    Ich suche nun eine geschickte Vorgehensweise, um mehrere solcher Simulationen parallel zu starten.
    Die jeweiligen Simulationen sind unabhängig voneinander, müssen also nicht miteinander kommunizieren.

    Zu Beginn also eine Liste mit den Simulationsjobs, die ausgeführt werden sollen; sagen wir 100 jobs.
    Ein Programm / Verteilerskript (wie auch immer geartet; als Shellskript, C-Programm etc.) soll nun diese 100 jobs nach und nach an die Rechner im Netzwerk verteilen, nach Abarbeitung die jeweils erzeugten Ergebnisdateien wieder einsammeln und sobald wieder ein Prozessor / Rechner frei ist, den nächsten job von der Liste losschicken.

    In einer Konfigurationsdatei zu Beginn will ich angeben, welche Rechner im Netzwerk zur Simulation benutzt werden dürfen, und wie viele Prozesse jeweils erlaubt sind.
    Während der Abbarbeitung soll es möglich sein, einen Statusbericht angezeigt zu bekommen und eventuell Netzwerkrechner hinzuzufügen oder zu entfernen;
    beides könnte ja über Dateien bewerkstelligt werden, die man während der Laufzeit des Verteilerprogramms ausliest bzw. editiert.

    Am liebsten würde ich ja sowas als Shellskript umsetzen, aber eventuell gibt es bereits nützliche Tools (z.B. Bibliotheken für C) für ein solches Vorhaben.
    Was ich suche sind ein paar Ideen / Konzepte / Linktipps, die mir bei diesem Vorhaben helfen könnten.

    Gruß, Hartwig





  • Habe ich mir angeschaut.
    PVM und MPI sind wohl eher dazu geeignet, Programme von vonherein auf Parallelität zu trimmen... Wäre also eher kompliziert, sowas mit PVM als Überstruktur für ein bestehendes Programm zu verwenden.
    Was ich benötige, ist ja nur, mehrere Programme gleichzeitig an einem Stapel von Aufträgen arbeiten zu lassen und deren Rückgaben zu verwalten.
    Dabei ist ein Auftrag genau ein Prozess, der nicht mit den anderen laufenden Auträgen kommunizieren muß.
    Um es einfach zu halten: wäre doch gelacht 😉 wenn das nicht mit den üblichen Unix-Tools geht, verpackt in ein Perl-Skript.
    Nur ist mir noch unklar, wie ich den jeweiligen Programmfortschritt jedes einzelnen aufgerufenen Programms (sei es lokal ober auf einem der Rechner im Netzwerk) abfrage; ich bräuchte ja sowas wie ein Rückgabewert, der mit der Prozess-ID des Programms verknüpft ist, sowie eine "bin fertig"-Nachricht, das das Programm an das Steuerskript sendet, wenn es mit der Berechnung des ihm zugeteilten Auftrags fertig ist.
    Danke für jeden Denkanstoß.
    Gruß, Hartwig



  • jeden deiner arbeitsauftrags prozesse durch einen fork starten, für jeden deinem arbeitsprozesse einen pipe aufmachen zu hauptprozess hin und wenn alle prozesse gestartet sind die pipes mit einer nicht blockierenden leseroutine durch laufen.
    die arbeitsprozesse können ja an betimmten stellen zwischen werte an den hauptprozess senden, wovon einer der ich bin jetzt fertig wert ist, und dann beenden sich alle kindprozesse und der eltern prozess wartet einfach auf diese prozesse.

    wenn das ganze im netzwerk ablaufen soll, dann sollte das natürlich über sokets gesteuert werden.


Anmelden zum Antworten