![]()
Zentrale Rechnerresourcen werden von vielen Benutzern gemeinsam genutzt. Anforderungen an diese Ressourcen müssen daher reguliert werden, um Zugriffskonflikte zu vermeiden. Zu diesem Zweck gibt es Software-Systeme, die man als Resource Manager oder auch als Batch System bezeichnet.
Für die RRZN-Computeserver setzen wir als Batch System/Scheduler Maui ein, das auf PBS (Portable Batch System)/Torque basiert.
Jobskripte sind Textdateien, die mit einem Kommando an das Batch System übergeben werden. Für Maui/Torque lautet das Kommando:
qsub <Optionen> <Name des Jobskripts>
Ein Jobskript besteht aus zwei Teilen: Im ersten Teil stehen Direktiven für das Batch System, im zweiten Teil die Kommandos, die man zur Ausführung bringen will (Also Kommandos, die man bei einer interaktiven Sitzung eingeben würde).
Die meisten Optionen des qsub-Kommandos kann man alternativ als Direktiven im Jobskript angeben. Wird eine Option beim Aufruf des qsub-Kommandos angegeben, so übersteuert sie die ihr entsprechende Direktive im Jobskript.
#!/bin/bash -login
#PBS -N pingpong
#PBS -M ich@meine.email.adresse.de
#PBS -j oe
#PBS -l nodes=1:ppn=2
#PBS -l walltime=00:10:00
#PBS -l mem=2gb
module load icc impi
# change to work dir:
cd $PBS_O_WORKDIR
mpirun -machinefile $PBS_NODEFILE -np 2 ./ping_pong_advanced_send
Erläuterung:
-N name | gibt als Job Namen name an |
-j oe | verbinde (join) Standard Output und Standard Error |
-l nodes=n:ppn=p | fordere n Knoten und p Prozessorkerne pro Knoten an |
-l walltime=time | maximale Wallclock Zeit im Format hh:mm:ss |
-l mem=wert | maximale Hauptspeicheranforderung je Job, Werte können mit kb, mb oder gb angegeben werden. |
-M mailadresse | schicke Job-relevante Mails an mailadresse |
-m abe | schicke Mail bei (eine oder mehrere Angaben): a Job Abbruch, b Job Beginn, e Job Ende |
-V | exportiere momentan gültige Umgebungsvariablen in den Job |
-q queue | spezifiziere explizit eine Jobklasse |
-I | s.u.: Interaktive Batch Nutzung |
-W x=PARTITION:name | spezifiziere explizit eine Partition. Mögliche Partitonen sind: "paris", "tane" , "taurus" und "smp". |
PBS_O_WORKDIR | absoluter Pfadname des Verzeichnisses, aus dem qsub aufgerufen wird |
PBS_NODEFILE | Name der Datei, die die Liste der Knoten enthält auf denen der Job läuft |
PBS_QUEUE | Name der Jobklasse, in der der Job läuft |
PBS_JOBNAME | Name des Jobs (von der -N Option im Batchskript) |
PBS_JOBID | Einzigartige Identifikationsnummer eines Jobs |
qsub script | schickt das Jobskript script an Torque |
qstat -a | listet die Job Queue |
qstat -f jobid | listet die Eigenschaften des Jobs mit der ID jobid |
qdel jobid | beendet laufenden Job mit der ID jobid bzw. löscht ihn aus der Warteschlange |
Es gibt mehrere Jobqueues:
test zum Testen. Hier steht nur ein Knoten mit bis zu 12 Prozessoren und 47Gb zur Verfügung. Maximale Walltime ist 6 Stunden.
helena für Programme, die sehr große Hauptspeicheranforderungen haben (z.B. hunderte von Gigabyte) oder hochgradig parallelisiert sind (z.B. bis zu 160 parallele Prozesse), oder beides.
all für alles andere. Normalerweise ist es nicht nötig, weiteres explizit anzugeben. Torque schickt einen Job je nach den angegebenen Ressourcen auf passende Knoten.
all besteht aus mehreren Partitionen, die über die Option -W x=PARTITION:name auch direkt angewählt werden können:
Name | Knoten | Proz/Knoten | Speicher/Knoten |
|---|---|---|---|
smp | 11 | 1*16, 11*24, 1*32 | 1*93Gb, 6*252Gb, 1*504Gb |
paris | 11 | 8 | 9*62, 2*124Gb |
tane | 96 | 12 | 47Gb |
taurus | 54 | 12 | 47Gb |
Möchte man mit einem parallelen Programm auf den Rechenknoten eines RRZN-Computeservers interaktiv arbeiten, so muss man das unter der Kontrolle des Batch Systems tun. Das qsub-Kommando stellt dafür die Option -I bereit. Wenn das Programm eine X-Anwendung ist, muss man zusätzlich mit der Option -X die X-Ausgabe auf sein Display lenken.
Beispiel:
orac:~$ qsub -I -X -l nodes=2:ppn=2 -q all
qsub: waiting for job 3584.tclog.rrzn.uni-hannover.de to start
qsub: job 3584.tclog.rrzn.uni-hannover.de ready
knoten01:~$ echo $PBS_NODEFILE
knoten01
knoten01
knoten02
knoten02
knoten01:~$ exit
qsub: job 3584.tclog.rrzn.uni-hannover.de completed
orac:~$
Man kann auf die beschriebene Art natürlich nur arbeiten, wenn genügend Ressourcen frei sind und diese vom Batch System zugeteilt werden. Sonst bleibt das "qsub -I" Kommando hängen (und kann mit <ctrl>-c abgebrochen werden).
Mit dem Batchsystem am RRZN wird versucht, sehr verschiedene Anforderungen so angemessen wie möglich zu bedienen. Die Benutzer sollen möglichst fair bedient werden und die Jobs eines Benutzers sollen möglichst geringen Einfluss auf Jobs anderer Nutzer haben.
Die betriebswichtigen Werte für all sind unten tabellarisch dargestellt.
Einstellung | Wert |
|---|---|
Maximale Anzahl an laufenden Jobs pro Benutzer | 72 |
Maximale Anzahl an Prozessoren pro Benutzer | 512 |
Maximale Walltime | 200 Stunden |
Default Walltime | 24 Stunden |
Es kommt manchmal vor, dass man sehr große Datensätze hat, die man nicht unbedingt auf BIGWORK langfristig halten möchte. Oder die Datensätze sollen dauerhaft gesichert werden, aber BIGWORK ist nur ein "Scratch"-Dateisystem.
Eine Lösung für dieses Problem ist, die Daten auf dem RRZN-Archivsystem zu sichern und während der Ausführung eines Jobs die Daten zu holen und am Ende die Ergebnisdaten auch wieder ins Archivsystem zu speichern. Die Leitung zum Archivsystem ist in Schreibrichtung sehr schnell, so dass große Datensätze schnell gesichert werden können. Daten vom Archiv zurückzuholen kann länger dauern, da die Daten unter Umständen zuerst vom Band zurückgespielt werden müssen. Diese zusätzliche Zeit sollte dann in der Walltime-Einstellung im Batchskript berücksichtigt werden.
Um das Archivsystem benutzen zu können, muss Ihr Account freigegeben werden. Dies wird auf BIAS eingestellt. Sie loggen sich auf die BIAS-Seite mit Ihrem eigenen Benutzernamen ein und Sie klicken auf den "Ihren Benutzernamen für die Nutzung des Archivsystems zulassen"-Link. Innerhalb weniger Stunden ist der Zugriff freigeschaltet.
Zugriff erfolgt mittels des "lftp" Kommandos. Um den Zugriff automatisiert zu ermöglichen, muss eine Datei mit dem Namen ".netrc" in Ihrem Homeverzeichnis angelegt werden (der Punkt vorne weg ist wichtig!). Sonst würde lftp nach Benuternamen und Passwort fragen.
Diese Datei enthält Ihre Zugangsdaten im Klartext und sollte deshalb unter sehr strikten Sicherheitsbedingungen gehalten werden, d.h. nur für Sie lesbar sein.
Die ".netrc" Datei bekommt folgenden Inhalt:
machine uqfs.rrzn.uni-hannover.de
login <benutzername>
password <passwort>
Wie gesagt darf sie nur für Sie alleine lesbar sein:
$ chmod 400 $HOME/.netrc
Die Authentifizierung zum Archivsystem erfolgt über eine verschlüsselte Verbindung und Ihre Zugangsdaten werden deshalb nicht weiter sichtbar sein.
Es sollte jetzt möglich sein, sich auf dem Archivsystem ohne Passwort einzuloggen. Dies kann man so testen:
$ lftp -c "open $USER@uqfs.rrzn.uni-hannover.de; ls"
Sie sollten jetzt eine Auflistung Ihres Verzeichnisses auf dem Archivsystem erhalten, ohne dass Sie nach dem Passwort gefragt werden. Jetzt sind Sie bereit "lftp" innerhalb eines Batchskriptes zu benutzen.
Im folgenden Beispiel-Batchskript wird ein Verzeichnis unter BIGWORK für die Simulation angelegt, Daten (als gezippte Tar-Archiv-Datei) werden vom Archivsystem geholt, die Dateien werden angeschaut (dies kann man in einem produktiven Skript weglassen), die Tar-Datei wird entpackt und die entpakten Dateien werden angeschaut (auch dies kann weggelassen werden). Dann erfolgt die Simulation an der entpackten Dateien, die Ergebnisse werden in ein Tar-Archiv komprimiert und diese Daten ins Archivsystem kopiert auch mittels "lftp".
#!/bin/bash -login
#PBS -M ich@meine.mail.adresse
#PBS -j oe
#PBS -m ae
#PBS -l mem=4gb
#PBS -l nodes=1:ppn=1
#PBS -l walltime=05:00:00
# show which computer the job ran on
echo "Job ran on:" $(hostname)
# load the relevant modules
# module load ....
# make and change to work dir:
simulation_dir="$BIGWORK/my_simulation_dir.$$"
mkdir $simulation_dir
cd $simulation_dir
# get the data from the archive
echo "Retrieving input data from archive"
data_filename="simulation_input_data.tar.bz2"
time lftp -c "open $USER@uqfs.rrzn.uni-hannover.de; get $data_filename"
# see the files
ls -l
# unpack the archive
time tar -xvjf $data_filename
# see the unpacked files
ls -l *
# one can now run a simulation on the unpacked files....
# compress the results before sending back to the archive
echo "Compressing results directory"
results_filename="simulation_results.tar.bz2"
time tar -cvjf $results_filename results_directory/
# transfer the results back to the archive
echo "Copying results to archive"
time lftp -c "open $USER@uqfs.rrzn.uni-hannover.de; put $results_filename"
Es ist natürlich möglich nur einen Teil dieses Vorgangs zu benutzen, zum Beispiel, man kopiert nur die Eingabedateien aus dem Archivsystem oder man kopiert nur die Ergebnisse in das Archivsystem.
Es ist möglich, neue Jobs von laufenden Rechenjobs starten zu lassen. Im Grunde muss man nur qsub innerhalb des Batchskriptes ausführen mit dem neuen Batchskript-Namen. Dieses Konzept wird konkreter durch ein Beispiel:
Man stelle sich vor, dass die Eingabe eines Programmes abhängig ist von der Ausgabe eines früheren Laufs. Man möchte nicht bis zum nächsten Morgen warten, bis man den nächsten Job starten kann (wenn der Erste vielleicht schon mitten in der Nacht fertig geworden ist). Daher erstellt man eine "Kette" von Batchjobs. Das erste Jobskript (mit dem Beispielnamen myprog_kette_01.sh) sieht etwa so aus:
#!/bin/bash -login
#PBS -M ich@meine.mail.adresse
#PBS -j oe
#PBS -m ae
#PBS -l mem=4gb
#PBS -l nodes=1:ppn=1
#PBS -l walltime=05:00:00
# show which computer the job ran on
echo "Job ran on:" $(hostname)
# load the relevant modules
# module load ....
# run the simulation
myprog -input InputFile_01.dat -output OutputFile_01.dat
# start the next simulation
qsub myprog_kette_02.sh
Das zweite Jobskript (mit dem Namen myprog_kette_02.sh) sieht dann so aus:
#!/bin/bash -login
#PBS -M ich@meine.mail.adresse
#PBS -j oe
#PBS -m ae
#PBS -l mem=4gb
#PBS -l nodes=1:ppn=1
#PBS -l walltime=05:00:00
# show which computer the job ran on
echo "Job ran on:" $(hostname)
# load the relevant modules
# module load ....
# run the simulation
myprog -input OutputFile_01.dat -output OutputFile_02.dat
Und das war's eigentlich. Man kann dieses Konzept erweitern zu komplexeren Beispielen, aber das Grundkonzept bleibt dasselbe.
Die neue Jobskripte könne auch dynamisch im alten Skript erzeugt werden, was für Parameterstudien nützlich ist, wenn man den nächsten Parameter noch nicht kennt zur Ausführungszeit des ersten Skripts. Man sollte aber auf jeden Fall sicherstellen, dass das neue Skript an seinem Ort liegt, wenn man es aufrufen will, und man sollte sich auch im gleichen Verzeichnis befinden (oder den vollen Pfad angeben). Der Phantasie sind keine Grenzen gesetzt.
Manchmal ist es gewünscht, dass Umgebungsvariablen, die in der Shell in der man auf dem Login-Knoten arbeitet, auch im Job zur Verfügung stehen. Es ist möglich diese Variablen entweder einzeln, oder alle, die in der Umgebung sind, zum Batchjob zu kopieren und damit die Variablen für den Job zur Verfügung stellen. Dies würde erlauben, zum Beispiel, dass man Parameter zum eigentlichen Programm beim Submittieren übergeben kann. Damit man Umgebungsvariablen an Batchskripte weitergeben kann, benutzt man die -v PBS-Option:
#PBS -v PARAM1,PARAM2,PARAM3,...
Dies ist eine Komma-getrennte Liste von Umgebungsvariablennamen, die bereits in der aktuellen Shell existieren. Man kann mit der -V Option (also großgeschrieben) alle Umgebungsvariablen dem Batchskript übergeben, aber dies ist meist zu viel und ist nicht empfohlen.
Hier ist ein Beispiel: Man möchte eine Parameterstudie machen und dem Programm die x, y und z Breite eines Volums übergeben. Diese Werte müssen aber in verschiedenen Batchjobs submittiert werden, damit Job 1 verschiedene Werte als Job 2 bekommt und entsprechend das Programm übergibt. Zuerst das Batchskript (Dateiname: env_var_in_job.sh):
#!/bin/bash -login
#PBS -M ich@meine.mail.adresse
#PBS -j oe
#PBS -m ae
#PBS -l mem=1gb
#PBS -l nodes=1:ppn=1
#PBS -l walltime=01:00:00
#PBS -v XWIDTH,YWIDTH,ZWIDTH
# show which computer the job ran on
echo "Job ran on:" $(hostname)
# change to working directory
cd $PBS_O_WORKDIR
# load the relevant modules
# module load ....
echo "XWIDTH = $XWIDTH"
echo "YWIDTH = $YWIDTH"
echo "ZWIDTH = $ZWIDTH"
# run the simulation
./myprog $XWIDTH $YWIDTH $ZWIDTH
Das Programm myprog ist in unserem Beispiel ein simples (ausführbares) Shellskript, aber hoffentlich kann man sehen wie man die Ideen in konkreten Beispielen einsetzen kann.
#!/bin/bash
# myprog: Example program to show the usage of the -v PBS option
xwidth=$1
ywidth=$2
zwidth=$3
echo "My box has the following dimensions: $xwidth x $ywidth x $zwidth"
Wir stellen jetzt die Umgebungsvariablen ein und setze den Job in die Warteschlange ab:
$ XWIDTH=1 YWIDTH=2 ZWIDTH=3 qsub env_var_in_job.sh
und sollten die folgende Ausgabe erhalten:
$ cat env_var_in_job.o456103
Job ran on: estragon.rrzn.uni-hannover.de
XWIDTH = 1
YWIDTH = 2
ZWIDTH = 3
My box has the following dimensions: 1 x 2 x 3
Man könnte also mehrere Simulationen mit unterschiedlichen x-Breiten so absetzen:
for i in $(seq 1 5)
do
XWIDTH=$i YWIDTH=2 ZWIDTH=3 qsub env_var_in_job.sh
done
Leibniz Universität IT Services - URL: www.rrzn.uni-hannover.de/batchsystem.html
Dr. Gerd Brand, Letzte Änderung: 08.10.2012
Copyright Gottfried Wilhelm Leibniz Universität Hannover