
Ich muss eine Gesamtzahl, NUMTOT, eines Programms starten (könnte jedes sein, C, Mathematica, ns-2... mathematische Umgebungen). Das Problem besteht darin, dass der Computer, auf dem diese Prozesse laufen, nur eine maximale Anzahl von Ausführungen zulässt, z. B. MAX (MAX < NUMTOT).
Ich führe diese Programme mit der folgenden Zeile in einem Terminal aus
./run.sh -d directory num
wiederholt, wobei run.sh ein Skript ist, aus dem ich das Mathematikprogramm aufrufe; directory ist das Verzeichnis, in dem sich mein Programm befindet, und num gibt die Anzahl der neuen Ausführungen an (integer*num = NUM). Das Skript „run.sh“ erstellt „num“ Verzeichnisse mit einer Kopie von „directory“ (dem Programm) und startet „num“ Anzahl von Instanzen des Programms. In meinem Fall sind das Matlab-Instanzen.
Ich hätte gerne ein Skript, das automatisch die Anzahl der laufenden Prozesse verfolgt und, wenn die maximale Anzahl auf (MAX-num) reduziert ist, weil „num“ bereits beendet ist, die nächsten „num“-Simulationen von Matlab startet, bis die Gesamtzahl NUM an Simulationen abgeschlossen ist.
Noch besser wäre es, wenn das Skript die maximale Anzahl möglicher Prozesse verwalten könnte, indem es einfach das nächste Programm aufruft, wenn gerade erst eines beendet wurde.
Um die Anzahl der laufenden Prozesse zu ermitteln, führe ich das folgende Skript aus
ps axu |grep plopez|grep simulacion|grep MATLAB|awk '{ $2} END{print NR}'
Dies ergibt die Gesamtzahl der derzeit laufenden Matlab-Dateien.
Wie könnte ich den gesamten Simulationssatz mit nur einem einzigen Skript erstellen?
Antwort1
Normalerweise wird eine maximale Anzahl von Prozessen pro Benutzer über erzwungen pam_limits(8)
. limits.conf(5)
Weitere Einzelheiten und Beispiele zum /etc/security/limits.conf
entsprechenden Ändern finden Sie auf der Manpage.
Insbesondere möchten Sie den nproc
Parameter konfigurieren:
nproc
maximum number of processes
Ein Beispiel aus der Manpage mit diesem verwendeten Parameter:
@faculty soft nproc 20
@faculty hard nproc 50
Antwort2
Anstatt die Anzahl der laufenden Instanzen regelmäßig zu überprüfen, würde ich vorschlagen, ein Skript zu schreiben, das das Programm immer wieder ausführt, bis die Anzahl NUM
erreicht ist, und dieses Skript MAX
mehrmals parallel zu starten.
Man kann auch das Signal abfangen SIGCHLD
, das beim Beenden eines Kindprozesses gesendet wird. Dies muss man zuerst mit aktivieren set -o monitor
. Ein ausführlicheres Beispiel und Alternativen findet man inein Thread auf Stackoverflow.
Antwort3
Wenn Ihre MATLAB-Jobs nicht interaktiv sind (d. h. ein Batch-Skript ausführen), sollten Sie sich Batch-Planungssoftware wieDrehmomentoderSchlummern- diese Art der Ressourcenverwaltung ist genau ihr Zweck.
Diese werden normalerweise auf HPC-Clustern verwendet, in Ihrem Fall hätten Sie jedoch einen Cluster mit nur einem Rechenknoten.
Slurm hat den Vorteil, ein modernes, gut konzipiertes System zu sein, das jahrelange Erfahrung mit anderen Schedulern nutzt. Torque/PBS hat den Vorteil der Vertrautheit – viele Leute haben es bereits auf anderen Clustern verwendet. Slurm verfügt über eine Reihe von Kompatibilitäts-Wrappern, sodass Leute, die an PBS oder Torque gewöhnt sind, es sofort mit vertrauten Befehlen verwenden können.
Beides bietet Ihnen zahlreiche Optionen zur Steuerung der Jobplanung – nach CPU-Kernen, Speicher, verfügbaren Lizenzen und mehr. Sie bieten auch eine Abrechnung, wenn Sie die kumulierte Nutzung pro Benutzer verfolgen oder begrenzen müssen. Slurm beispielsweise verfügt über eine Option zur Gewichtung der fairen Nutzung, mit der Jobs von Personen, die in letzter Zeit nicht viele Jobs ausgeführt haben, gegenüber Personen priorisiert werden können, die das System häufig verwendet haben – was oft besser ist als eine feste Quote für die gesamte CPU-Zeit.
Eine weitere Möglichkeit, eingeschränkte Lizenzen zu umgehen, besteht darin, Ihre MATLAB-Skripte so zu schreiben, dass sie kompatibel sind mitGNU Octavesowie MATLAB. Dann können Sie so viele Test-/Entwicklungsläufe durchführen, wie Sie benötigen, und den letzten Lauf in MATLAB durchführen, wenn dies erforderlich ist, um Ihre Ergebnisse zu veröffentlichen oder mit anderen Forschern zusammenzuarbeiten. Octave ist größtenteils mit MATLAB kompatibel, aber es gibt einige Unterschiede - hier ist einZusammenfassung.
Antwort4
EinAntwort in einem anderen Thread, der sich mit der Begrenzung der Anzahl der Unterprozesse in Bash beschäftigtzeigt den folgenden Codeausschnitt, der alle zehn Sekunden wartet, bis einer von vier Jobs abgeschlossen ist.
while [ $(jobs | wc -l) -ge 4 ] ; do sleep 10 ; done
Bedenken Sie, dass eine solche aktive Schlafstrategie eher ineffizient, grob und ungenau ist.