Dokumentation zum Masterprojekt

Werbung
Hochschule für Technik, Wirtschaft und Kultur Leipzig
Fakultät Informatik, Mathematik und Naturwissenschaften
Dokumentation zum Masterprojekt
Erweiterung einer bestehenden Sun Grid Engine um ein Cluster of Workstations
Betreuer: Prof. Dr.-Ing. Axel Schneider
B. Sc. Michael Schmidt
Matrikelnr.: 52676
15. Januar 2011
Inhaltsverzeichnis
1 Einleitung
1.1 Aufgabenstellung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2 Theorie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3 Arbeitsumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2
2
2
2
2 Umsetzung
2.1 Idee Cluster of Workstations . . . . . . . . . . . . . . . . . . . . .
2.2 Cluster of Workstations mit cron . . . . . . . . . . . . . . . . . . .
2.3 Implementierung des Sun Grid Engine Kalenders mit einer Queue
2.4 Implementierung mit zwei Queues . . . . . . . . . . . . . . . . . .
2.4.1 Mehrere Queues auf unterschiedlichen Ebenen . . . . . . . .
2.4.2 Queues als einfacher Baum . . . . . . . . . . . . . . . . . .
2.5 Anhalten und Wiedereinstellen eines Jobs . . . . . . . . . . . . . .
4
4
4
6
7
7
8
8
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Fazit
12
3.1 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
3.2 Ausblick für die Masterarbeit . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1
1.1
Einleitung
Aufgabenstellung
Dieses Dokument stellt die Dokumentation zum Masterprojekt dar. Das Masterprojekt ist
ein Pflichtprojekt im Rahmen des Studiengangs Master of Science Informatik an der HTWK
Leipzig. Im Rahmen dieses Studiengangs muss ein Projekt im Umfang von 300 Stunden
absolviert werden.
Die Aufgabe dieses Masterprojekts besteht darin, eine bestehende Sun Grid Engine um
ein Cluster of Workstations (COW) zu erweitern. Mit diesem COW sollen Computer, welche
tagsüber beispielsweise von Sekretärinnen oder anderen Mitarbeitern genutzt werden, in einer
definierten Zeit (in den Nachtstunden) Jobs von der Sun Grid Engine berechnen.
1.2
Theorie
Grid-Computing ist eine Form des verteilten Rechnens, bei der ein virtueller Supercomputer
aus einem Cluster lose gekoppelter Computer erzeugt wird. Es wurde entwickelt, um rechenintensive wissenschaftliche – insbesondere mathematische – Probleme zu lösen.
Von typischen Computerclustern unterscheidet sich Grid-Computing in der wesentlich
loseren Kopplung und der Heterogenität der Computer. Des Weiteren ist ein Grid meistens bestimmt für eine spezielle Anwendung und nutzt häufig standardisierte Programmbibliotheken.
1.3
Arbeitsumgebung
Die Sun Grid Engine des Max-Planck-Institutes für evolutionäre Anthropologie kann als
Rechengrid klassifiziert werden. Bei einem solchen Grid sieht der Anwender nur eine virtuelle
Maschine. Hinter dieser verbirgt sich ein Zusammenschluss von mehreren heterogenen Servern,
welche dediziert für die Berechnung der Jobs zur Verfügung stehen. Wegen der Heterogenität
der einzelnen Knoten wurden für jeden die Grenzwerte angepasst. Bei diesen handelt es sich
zum Beispiel um die Anzahl der verfügbaren Prozessoren oder den maximal verfügbaren
Arbeitsspeicher. Nach diesen Werten werden die Jobs vom Masterhost an die einzelnen Knoten
aufgeteilt und versandt.
Bei dem Grid des Max-Planck-Institutes für evolutionäre Anthropologie handelt es sich
um eine bereits bestehende, produktive Sun Grid Engine (SGE) mit der Softwareversion 6.2
Update 5. Zu Begin dieser Arbeit umfasst die SGE 25 Knoten. Diese Knoten sind dediziert für
diese Sun Grid Engine angeschafft worden und werden auch nur für diese benutzt. Jeder dieser
Knoten besitzt 4, 8, 16 oder 24 Kerne. Somit stehen der Sun Grid Engine insgesamt 424 Kerne
und 510 GB RAM zur Verfügung. Die Jobskripte können in jeder beliebigen Skriptsprache
geschrieben werden, solange diese auf den Systemen installiert ist. Standardmäßig wird die
Debian-Almquist-Shell (dash), die Bourne-Again Shell (bash) oder die C-Shell (csh) genutzt.
Bei diesen Skriptsprachen ist es zudem möglich, bestimmte Übergabeparameter für die SGE
im Skript zu setzen. Zudem ist es möglich, OpenMPI Programme an die SGE zu schicken. Die
2
Jobs, welche derzeit mit Hilfe der SGE bearbeitet werden sind unterschiedlich und können
somit nicht vereinheitlicht werden.
Diese Jobs werden von den Mitarbeitern an die bereits bestehende Sun Grid Engine übergeben. Anschließend werden sie an die verfügbaren Ressourcen aufgeteilt. Bei der Aufteilung
der Jobs werden verschiedene Parameter von der SGE ausgewertet. Wichtige Parameter sind
dabei die Anzahl der CPUs oder der verfügbare Arbeitsspeicher. Diese Parameter können
vom Anwender beim Hinzufügen eines Jobs in die SGE auf der Kommandozeile mit übergeben werden. Falls keine Parameter übergeben werden, werden die Standardwerte aus der
Konfigurationsdatei der SGE genommen.
Dieses Multicomputer-System stößt hin und wieder an die physikalischen Grenzen der Knoten. Das führt dazu, dass eine lange Queue entsteht, in welcher die Jobs stehen, bis genügend
Ressourcen für die Abarbeitung dieser Jobs verfügbar sind. Zum einen verlängert sich somit
die Bearbeitungszeit1 der Jobs und zum anderen stehen gerade in den Nachtstunden mehrere
Desktopsysteme unbenutzt in den Büros. Da die Desktop-Systeme aus leistungsstarken2
Computern bestehen, soll die bestehende SGE um ein Cluster of Workstations erweitert
werden.
Bei der SGE handelt es sich um eine Shared Disk Architektur. Bei dieser haben alle Knoten
des Grids zugriff auf die gleiche Speicherressource. Umgesetzt wurde diese Architektur mit
dem Network File System (NFS) der Version 3. Da auf diesen Netzlaufwerken zusätzlich die
Homelaufwerke der Anwender liegen, könnte theoretisch jeder Computer zum Grid hinzugefügt
werden. Die Gesamtkapazität des NFS beträgt über 300 TB.
Die Kernarbeitszeit der Abteilungen am Max-Planck-Institut liegt zwischen 10 und 16 Uhr.
Beobachtungen zufolge werden die Computer, welche zur Sun Grid Engine hinzugefügt werden
sollen, zwischen 8 und 18 Uhr benutzt. Zu diesen Zeiten wurde noch ein Puffer von zwei
Stunden addiert, sodass an Wochentagen in der Zeit von 22 bis 6 Uhr, sowie am Wochenende
diese Knoten zur SGE hinzugefügt werden sollen. An Wochentagen darf zwischen 6 und 22
Uhr kein Job auf diesen Computern laufen.
Dieses Grid ist bereits im produktiven Einsatz. Deshalb wurde eigens für dieses Projekt
ein dediziertes Testsystem aufgebaut. Die Konfiguration des Testsystems ist identisch mit
der des Produktivsystems. Dieses Testsystem besteht aus einem Server und einem Desktop.
Der Server stellt dabei sowohl den Master der SGE dar, als auch einen Knoten. Der Desktop
wird als weiterer Knoten eingesetzt. Der Masterhost stellt während des Projektes einen Knoten dar, welcher immer für Berechnungen genutzt werden kann (ähnlich wie die Server im
Produktivsystem). Der Desktop stellt eine Workstation dar, welcher nur zu bestimmten Zeiten
für Berechnungen herangezogen werden soll.
1
Mit Bearbeitungszeit ist in diesem Zusammenhang die Zeit gemeint, welche vom ersten Hinzufügen bis zur
erfolgreichen Beendigung des Jobs vergeht.
2
In der Regel haben diese Computer vier Kerne und 4 GB Arbeitsspeicher.
3
2
Umsetzung
2.1
Idee Cluster of Workstations
Studien zufolge bleiben 95% der Leistung eines Computers ungenutzt. Dies liegt zum einen
daran, dass die Hardwarehersteller immer schnellere und leistungsstärkere Hardware produzieren. Zum anderen liegt es aber auch daran, dass viele Computer, gerade in großen Firmen
und Instituten, auch in der Nacht und an Feiertagen laufen, obwohl an diesen nicht gearbeitet
wird. Um diese Ressourcen zu nutzen, wurde in diesem Projekt eine bestehende Sun Grid
Engine um ein Cluster of Workstations erweitert.
Das zeitliche Regime für dieses System ist folgendermaßen geplant:
• Wochentags 6 bis 22 Uhr bleiben die Workstations von der SGE unangetastet.
• Ab 22 Uhr werden diese Knoten zur SGE hinzugefügt.
• An Wochentagen ab 6 Uhr werden diese Knoten aus der Queue der SGE entfernt.
• Jobs, die zu diesem Zeitpunkt noch laufen werden abgebrochen und erneut in die
Jobqueue eingestellt.
Die Umsetzung des COWs erfolgt in drei Schritten. Im ersten Schritt werden verschiedene
Wege, wie bestimmte Knoten zu bestimmten Zeiten in die SGE gestellt und wieder entfernt
werden können, aufgezeigt und getestet. Der zweite Schritt besteht darin, Jobs, welche nach
Ablauf dieses Zeitfensters nicht beendet sind, abzubrechen. Umsetzungsmöglichkeiten für das
Wiedereinstellen dieser Jobs in die Jobqueue werden im dritten Schritt eruiert.
2.2
Cluster of Workstations mit cron
Auf allen Servern der derzeit bestehenden Sun Grid Engine läuft das Betriebssystem Ubuntu.
Ubuntu ist eine Linux-Distribution, die auf Debian basiert. Der cron-Daemon ist eine Jobsteuerung unter unixartigen Betriebssystemen, die wiederkehrende Aufgaben automatisch zu
einer bestimmten Zeit ausführen kann.
Bei der Umsetzung des Cluster of Workstations mit Hilfe des cron-Daemons wird an
jedem Wochentag 22 Uhr automatisch sge_execd ausgeführt. Dies ist ein Dienst, welcher auf
allen Client-Knoten des Grids läuft. Der Masterhost prüft in definierten Zeitabständen, ob
und welche Knoten verfügbar sind. Somit werden die Workstations 22 Uhr in die Liste der
verfügbaren Knoten aufgenommen und Jobs an diese verteilt.
Da der COW an Wochentagen nur bis 6 Uhr im Grid rechnen soll, wird um diese Zeit ein
zweites Skript zum stoppen des sge_execd ausgeführt. Das Problem bei dieser Lösung ist,
dass Jobs, die zu dieser Zeit noch nicht beendet sind, weiter laufen und nicht abgebrochen
werden. Dies hat zur Folge, dass diese Arbeitsplätze erst nach Beendigung des Jobs wieder
dediziert vom Anwender genutzt werden können.
4
Zur Lösung dieses Problems soll das Skript zum Stoppen des Daemons schon 5 Uhr ausgeführt werden. Somit werden an die entsprechenden Knoten ab 5 Uhr keine Jobs versandt. Um
sicherzustellen, dass ab 6 Uhr alle Jobs auf den entsprechenden Knoten beendet sind, wird ein
Limit für die maximale Laufzeit der Jobs von einer Stunde auf den entsprechenden Knoten
definiert. Bei solchen Limits können Soft- und Hardlimits definiert werden. Der Unterschied
zwischen diesen liegt darin, dass bei einem Hardlimit das Signal SIGKILL an den entsprechenden Job geschickt wird. Dies bewirkt den sofortigen Abbruch des Jobs. Bei einem Softlimit
wird hingegen das Signal SIGUSR1 an den entsprechenden Job gesandt. Dies hat zur Folge, dass eventuell definierte Epilog-Skripte nach dem Beenden des Jobs noch ausgeführt werden.
Durch das Starten und Beenden des sge_execd mittels des cron-Daemons wird gewährleistet, dass die Knoten des COWs lediglich zur gewünschten Zeit (wochentags zwischen
22 und 5 Uhr) Jobs vom Masterhost der Sun Grid Engine zugewiesen bekommen. Mit der
Laufzeitbeschränkung auf eine Stunde wird des Weiteren sichergestellt, dass an Wochentagen
nach 6 Uhr alle Jobs auf diesen Knoten beendet sind. Nichtsdestotrotz sind mit dieser Methode
zwei Probleme verbunden:
1. Es können keine Jobs mit einer Laufzeit von mehr als einer Stunde auf den Knoten
ausgeführt werden.
2. Die Jobs werden lediglich abgebrochen, jedoch nicht neu in die Queue gestellt.
Über jeden abgebrochenen Job, wird der Anwender durch eine Mail informiert. In dieser
Mail steht das Signal, mit welchem der Job abgebrochen wurde. Jedoch beinhaltet diese Mail
nicht das Ereignis, welche zu diesem Abbruch geführt hat. Das Problem dabei ist, dass der
Anwender unter Umständen durch diese ungenaue Beschreibung einen Fehler im Job sucht, da
er nicht weiß, dass die Bearbeitungszeit abgelaufen ist. Da die verschiedenen Knoten neben
der unterschiedlichen Anzahl von Kernen auch eine unterschiedliche Taktgeschwindigkeit der
Kerne haben, ist im Vorfeld eine Laufzeitabschätzung der Jobs unmöglich.
Da die Laufzeit eines Jobs sehr stark von der Leistungsfähigkeit des Knotens abhängt,
kann diese vor der Bearbeitung nicht genau bestimmt werden. Bei einer zu hohen Abschätzung
der Laufzeit würden weniger Jobs als möglich an die Workstations gesandt werden, bei einer
zu niedrigen Abschätzung würden die Jobs abgebrochen und müssten noch einmal berechnet
werden. In beiden Fällen würden die Ressourcen des COW nicht voll ausgeschöpft werden.
Eine weitere Möglichkeit, einen solchen Job automatisch nach Ablauf einer bestimmten
Zeit abzubrechen stellt das Softlimit dar. Da der Job bei diesem Limit nicht durch das Signal
SIGKILL, sondern durch das Signal SIGUSR1 abgebrochen wird, ist es möglich, im Anschluss
ein Epilog-Skript auszuführen. Mit Hilfe dieses Skriptes kann geprüft werden, ob der Abbruch
des Jobs durch das Ablaufen der Bearbeitungszeit ausgelöst wurde oder nicht. Falls dies der
Fall ist, könnte durch dieses Skript eine zusätzliche Mail an den Anwender versandt werden,
in der diese Informationen stehen.
Mit Hilfe eines solchen Skriptes ist es zudem möglich, dass der Anwender im Fall des
Abbruches seines Jobs nicht nur darüber Informiert wird, dass der Job wegen eines Zeitlimits
abgebrochen wurde, sondern dieser automatisch wieder zur Queue hinzugefügt wird. In dem
Fall würde dem Job, durch das Wiedereinfügen in die Queue eine neue JobID zugeteilt. Diese
5
würde als zusätzliche Information in der Mail enthalten sein. Dadurch müsste sich der Anwender nicht um das Wiedereinstellen des Jobs kümmern. Der Nachteil dabei ist, dass dem
Job eine neue ID zugewiesen wird. Im Zuge dessen wird dieser Job hinten an die bestehende
Queue angefügt. Dies könnte zur Folge haben, dass Prioritäten, welche diesem Job zugewiesen
wurden, nicht mehr beachtet werden. Zudem würden dabei auch weitere Parameter, welche
der Anwender mit dem Job übergeben hat, nicht beachtet werden.
2.3
Implementierung des Sun Grid Engine Kalenders mit einer Queue
In der Standardinstallation ist bereits eine Schnittstelle für einen Kalender implementiert.
Um diese Funktionalität zu aktivieren muss ein Kalender angelegt werden. Außerdem ist es
notwendig, diesen Kalender einer Queue hinzuzufügen.
Die Definition des Kalenders untergliedert sich in drei Teile:
1. Jahrestag (Datum)
2. Wochentag
3. Uhrzeit.
In diesen Teilbereichen kann die Queue jeweils aktiviert (on), deaktiviert (off ), suspendiert
(suspended) oder fortgesetzt (resume) werden. Dabei ist zu beachten, dass nur eine aktivierte
Queue deaktiviert oder suspendiert werden kann. Bei einer deaktivierten Queue werden vom
Masterhost an die betroffenen Knoten keine weiteren Jobs verteilt. Eine Suspendierung hat
zur Folge, dass laufenden Jobs die CPU-Zeit entzogen wird und zusätzlich während dieser
Zeit keine weiteren Jobs an diese Knoten verteilt werden. Eine Fortsetzung kann lediglich bei
suspendierten Jobs stattfinden. Falls kein Job suspendiert wurde, verhält sich ein Fortsetzen
einer Queue genau wie eine Aktivierung. Bei dieser werden die betroffenen Knoten zur Queue
der SGE hinzugefügt.
In Listing 1 wird die Syntax für einen einfachen Kalender gezeigt. Der Kalendername ist
night. Der 01.01.2011, 06.01.2011 und der 22.04.2011 werden als Feiertage deklariert. An diesen
werden die Knoten den ganzen Tag für die Queue der SGE aktiviert. Zudem wird definiert,
dass an Wochentagen (Montag bis Freitag) zwischen 6 und 20 Uhr von der Sun Grid Engine
kein Job an diese Knoten gesandt werden darf. An Wochenenden (Samstag und Sonntag) ist
das Verhalten wie an Feiertagen, die SGE hat vollen Zugriff auf die Knoten.
Listing 1: Einfacher Kalender der Sun Grid Engine
calendar_name
year
week
night
01.01.2011 ,06.01.2011 ,22.04.2011= on
06:00 -20:00= suspended
Die Zuweisung eines Kalenders zu einer bestimmten Queue oder zu ausgewählten Knoten
wird in der Konfigurationsdatei vorgenommen. Hierzu gibt es drei Wege. Zum einen kann einer
kompletten Queue ein Kalender zugewiesen werden. Dazu wird in der Konfigurationsdatei
<queuename>.q folgende Zeile hinzugefügt:
6
calendar
< calendername >
Des Weiteren gibt es die Möglichkeit, bestimmte Knoten von diesem Kalender auszuschließen. Dazu wird diese Zeile folgendermaßen angepasst:
calendar
< calendername > ,[ host1 = NONE ]
Die dritte Möglichkeit besteht darin, keinen Kalender zu definieren. Hierzu wird als
Kalendername NONE eingegeben. Standardmäßig ist kein Kalender aktiviert. Auch bei dieser
Variante ist es möglich, bestimmte Knoten auszuschließen. Dafür werden diese, wie im zweiten
Fall, hinter der Standarddefinition mit den entsprechenden Kalendern angegeben:
calendar
NONE ,[ host1 = < calendername >]
Zusammenfassend ergibt sich folgende Syntax für die Definition eines Kalenders in der Sun
Grid Engine:
’ calendar ’= < calendarname >( < hostlist >)
Die Definitionen dazu lauten:
< calendarname >= < Name des Kalenders >| ’ NONE ’
< hostlist >= ’ ,[ ’ < Name des Knotens > ’= ’ < calendarname > ’] ’( < hostlist >)
2.4
Implementierung mit zwei Queues
Wie in Abschnitt 2.3 bereits beschrieben, gibt es verschiedene Möglichkeiten den Kalender
der Sun Grid Engine zu implementieren. Einen Standardkalender zu implementieren, ist für
dieses Projekt nicht geeignet. Dies ist darin begründet, dass somit alle Knoten der Sun Grid
Engine nur zu diesen definierten Zeiten arbeiten würden. Eine Möglichkeit, dieses zu umgehen,
besteht darin, dass eine zweite Queue definiert wird. In der ersten Queue befinden sich alle
Knoten, die dediziert für die Sun Grid Engine benutzt werden. Die zweite Queue ist für die
Knoten gedacht, welche lediglich zu bestimmten Zeiten der SGE angehören. Dies bringt zwei
Vorteile mit sich. Zum einen kann der Anwender explizit angeben, ob er nur auf dem COW
rechnen möchte, nur auf dem Hauptsystem, oder auf beiden. Um auf beiden Systemen zu
rechnen, werden beim Hinzufügen des Jobs in die SGE keine weiteren Parameter benötigt. In
diesem Fall werden automatisch alle vorhandenen Queues genommen. Für die anderen beiden
Fälle wird die gewünschte Queue als Parameter an die Sun Grid Engine mit übergeben.
2.4.1
Mehrere Queues auf unterschiedlichen Ebenen
Um die Benutzerfreundlichkeit der SGE zu erhöhen, besteht die Möglichkeit, mehrere Queues
in unterschiedlichen Ebenen zu definieren. Die einfachste Variante hierfür besteht aus einer
Hauptqueue (A.q) und einer Subqueue (B.q). Die B.q ist der A.q direkt untergeordnet. Für
diese Hierarchie muss die B.q lediglich in der Konfigurationsdatei der A.q mit der Zeile
subordinate_list slots=2(B.q) definiert werden. In Listing 2 wird die Struktur dieser
Hierarchie dargestellt.
7
Listing 2: Mehrere Queues auf unterschiedlichen Ebenen
A.q
|
B.q
Dies ist ein einfaches Beispiel für Knoten, auf welchen zwei Jobs gleichzeitig ausgeführt
werden können, zum Beispiel auf Computern mit zwei Prozessoren. Bei diesem Beispiel würden
Jobs nur dann über die B.q auf einem Knoten ausgeführt werden, wenn zu dieser Zeit weniger
als zwei Jobs auf dem Knoten laufen. Für den Fall, dass zwei Jobs von der B.q auf dem Knoten
ausgeführt werden, und ein weiterer Job über die A.q kommt, wird der Job mit der kürzesten
Laufzeit aus der B.q angehalten. Somit läuft nur noch ein Job auf dem Knoten und der Job
aus der A.q kann auf diesem Knoten hinzugefügt werden.
2.4.2
Queues als einfacher Baum
Mehrere Queues in eine einfache Baumstruktur zu definieren, stellt die dritte Variante dar.
Die beiden Subqueues (B.q und C.q) werden dabei in der Hauptqueue (A.q) durch die Zeile
subordinate_list slots=2(B.q:1, C.q:2) definiert. Eine Definition der Hauptqueue in
den Konfigurationsdateien der beiden Subqueues ist auch in diesem Fall nicht nötig. Durch
diese Konfiguration wird ein Baum mit einer Wurzel und zwei Blättern erstellt. Die A.q stellt
die Wurzel dar, die beiden Queues B.q und C.q sind direkte Kinder der A.q. Falls keine anderen
Prioritäten definiert wurden, werden diese anhand der Reihenfolge, in der die Queues definiert
wurden, erstellt. Die erste definierte Subqueue hat somit eine höhere Priorität als die folgenden.
Listing 3: Mehrere Queues als einfacher Baum organisiert
A.q
/ \
B.q C.q
Diese Struktur kann beliebig fortgeführt werden. Bei Bäumen mit einer Tiefe von mehr als
eins ist darauf zu achten, dass in jeder Queue nur die direkten Nachfolger definiert werden.
Im Zuge dieses Projektes wurde die Implementierung über eine Queue gewählt. Die Begründung dafür liegt im geringen administrativen Aufwand und der Flexibilität. Bei diesem
Weg müssen lediglich die Knoten, welche nur zu bestimmten Zeiten der SGE hinzugefügt
werden sollen, definiert werden. Für jeden einzelnen Knoten kann dabei ein anderer Kalender
definiert werden. Für den Fall, dass ein Mitarbeiter in den Erholungsurlaub geht, kann durch
einfaches Bearbeiten der Queue (Löschen des Kalenders für diesen Knoten) der spezielle
Knoten für den kontinuierlichen Einsatz in dieser Zeit definiert werden.
2.5
Anhalten und Wiedereinstellen eines Jobs
Wie in Abschnitt 2.3 beschrieben, gibt es mehrere Möglichkeiten einen Job mit Hilfe eines Kalenders abzubrechen. Zum einen kann durch den Kalender der betreffende Knoten deaktiviert
werden. Dabei laufen alle Jobs auf diesem Knoten weiter. Die Laufzeitabschätzung der Jobs
ist sehr fehleranfällig. Die Suspendierung wird auf der Sun Grid Engine standardmäßig durch
8
das Signal SIGSTOP vorgenommen. Dabei wird dem laufenden Job lediglich die CPU-Zeit
des Knotens entzogen. Das Problem bei diesem Weg ist, dass der allozierte Speicher nicht
freigegeben wird. Bei Jobs, welche viel Speicher alloziert haben, könnte dies für die weitere
Benutzung des Knotens zu einem Performanceverlust führen, da bei Bedarf der allozierte Bereich des Arbeitsspeichers auf eine swap-Partition3 ausgelagert werden muss. Zudem
verlängert dies die Laufzeit eines Jobs um die Zeit, in der der Knoten nicht im Grid integriert ist.
Ein Weg, dieses Problem zu beheben, besteht darin, statt des Signales SIGSTOP das
Signal SIGKILL zu definieren. Dabei würden genau zu der Zeit, in der ein Knoten nicht
mehr für den Grid zur Verfügung steht, alle laufenden Jobs beendet. Der Anwender würde
in diesem Fall eine Benachrichtigung per Mail bekommen und könnte den entsprechenden
Job später neu starten. Bei diesem Lösungsansatz ist allerdings zu beachten, dass die Jobs
lediglich abgebrochen und somit nicht erneut in die Queue hinzugefügt werden. Bei diesem
Lösungsansatz muss der Anwender selbstständig alle abgebrochenen Jobs suchen und neu
starten. Dies bedeutet, neben dem erhöhten Aufwand für den Anwender, unter Umständen
auch eine ungleichmäßige Auslastung der SGE, weil alle Jobs vom Anwender zur gleichen Zeit
gestartet werden.
Zur Lösung dieses Problems müssten die Jobs automatisch, nach dem Beenden, erneut in
die Queue hinzugefügt werden. Das “Rescheduling”4 von einem Job kann auf mehreren Wegen
geschehen. Wie bereits beschrieben, könnte zum Beispiel anstelle des SIGKILL-Signals das
Signal SIGUSR1 versandt werden. Der Vorteil dabei besteht darin, dass ein Epilog-Skript,
welches in der Queue definiert ist, noch ausgeführt wird. In diesem Skript stehen verschiedene
Variablen zur Verfügung. Dabei handelt es sich unter anderem um die aktuelle JobID und den
Namen der Queue, in die der Job hinzugefügt wurde. Anhand dieser Variablen ist es möglich,
den Job mit Hilfe des Epilog-Skriptes erneut in die Queue hinzuzufügen. Anschließend müsste
aus dem Skript heraus eine Mail mit der neuen JobID an den Anwender gesandt werden,
da sich diese in dem Fall ändert. Der Nachteil dabei ist, dass der Job am Ende der Queue
eingestellt wird. Dies könnte zu einer erhöhten Wartezeit, und somit zu einer sehr großen
Bearbeitungszeit führen. Durch den sogenannten “Array-Parameter” ist es möglich, einen
Job in die Queue hinzuzufügen, der mehrfach ausgeführt wird. Dies führt zu einem weiteren
Nachteil dieser Methode, da in diesem Fall nicht nur die abgebrochene Instanz wiederholt
wird, sondern auch alle anderen.
Um dieses Problem zu umgehen, müssen die Jobs so beendet werden, dass sie von der Sun
Grid Engine automatisch erneut zur Queue hinzugefügt werden. Der Vorteil dabei ist, dass
dabei nur diese Instanz des Jobs erneut ausgeführt wird. In der SGE besteht standardmäßig
eine Routine, durch welche Jobs “rescheduled” werden können. Mit Hilfe dieser Routine
werden automatisch alle Jobs, die mit dem Exitstatus 99 beendet werden, erneut in die Queue
eingefügt. Bei dem “Reschedulen” durch die SGE behält der Job die ursprüngliche JobID bei.
Zudem wird der Job am Anfang und nicht an das Ende der Queue eingefügt. Alle Parameter,
die beim Hinzufügen des Jobs übergeben wurden, bleiben erhalten.
3
Unter swap-Partition wird eine Partition verstanden, auf welche die geladenen Pages des Arbeitsspeichers
ausgelagert werden, falls dieser voll ist.
4
Mit “Rescheduling” wird in diesem Fall das automatische Hinzufügen eines abgebrochenen Jobs in die
Ursprungsqueue benannt.
9
Ein Job der Sun Grid Engine besteht grundsätzlich aus einem Skript. Bei diesem Skript
handelt es sich um ein herkömmliches Unix-Shell-Skript. Der Vorteil dabei besteht darin, dass
mit Hilfe einer Signalbehandlung die Unix-Signale abgefangen werden könnten. Sinnvoll ist
dies zum Beispiel bei dem Signal SIGUSR1. Wie bereits erwähnt, muss der Job mit dem
Exitstatus 99 beendet werden, um durch die Sun Grid Engine am Anfang der Queue eingefügt
zu werden. Um das immer dann zu erreichen, wenn das Signal SIGUSR1 an den Job gesandt
wird, muss die folgende Zeile im Skript hinzugefügt werden:
trap " exit 99" SIGUSR1
Auf diesem Wege ist es zwar möglich, den Abbruch eines Jobs zu erzwingen, und falls der
Anwender diese eine Zeile in sein Jobskript hinzugefügt hat sogar einen Job zu “reschedulen”,
allerdings würde es einen hohen administrativen Aufwand bedeuten, diese Zeile in jedem
Skript hinzuzufügen. Eine globale Signalbehandlung würde dieses Problem beheben, ist aber
an dieser Stelle nicht möglich.
Es ist möglich, in der Konfigurationsdatei der SGE Skripte zu definieren, die vor und nach
einem Job ausgeführt werden können. Ein vorgelagertes Skript wird Prolog-Skript genannt.
Falls ein solches definiert ist, wird dies vor dem eigentlichen Job ausgeführt. Die Bearbeitungszeit des Jobs startet erst nachdem dieses Skript beendet wurde. Das sogenannte Epilog-Skript
ist ein Skript, welches nach dem eigentlichen Job ausgeführt wird. Ein Epilog-Skript wird
direkt nach einem Job ausgeführt, der Exitstatus von diesem ist dabei irrelevant. Die einzige
Ausnahme besteht dann, wenn der Job mit dem Signal SIGKILL beendet wurde.
Die Idee, eine Signalbehandlung durchzuführen bestand darin, diese in ein Epilog-Skript
auszulagern. Dazu muss das Jobskript nicht verändert werden. Die einzige Anpassung wird in
der Konfigurationsdatei der Queue vorgenommen. In dieser muss in der Zeile epiloge das
Epilog-Skript mit einem Pfadnamen angegeben werden. Zusätzlich ist darauf zu achten, dass
es sich um einen absoluten Pfad handelt, der von allen Anwendern und Knoten aus erreichbar
ist. Andernfalls ist es nicht möglich, dieses Skript fehlerfrei auszuführen.
Der Lösungsansatz mit Hilfe dieses Skriptes besteht darin, dass nach Beendigung der
Arbeitszeit des Cluster of Workstations alle laufenden Jobs auf den entsprechenden Maschinen durch dieses SIGUSR1-Signal abgebrochen werden. Anschließend wird mit Hilfe des
Epilog-Skriptes überprüft, ob der Job regulär beendet, oder abgebrochen wurde. Falls dieser
abgebrochen wurde, wird in diesem Skript der Exitstatus des Jobs auf den Wert 99 gesetzt
und somit der Job automatisch von der SGE “rescheduled”. Bei einem Test, den Exitstatus
eines Jobs auf diese Art und Weise zu manipulieren ist aufgefallen, dass dieser zwar in die
entsprechenden Variablen geschrieben wird, und in der späteren Auswertung der Jobs als
solches aufgeführt wird, jedoch bekommt dieses Skript nie den SGE-Status “Rescheduled”.
Weitere Tests dieses Phänomens haben ergeben, dass dieser Status direkt nach Beendigung
des eigentlichen Jobs gesetzt wird und anschließend nicht verändert werden kann.
Zusammengefasst lautet das Ergebnis dieser Tests: Um den Exitstatus eines Jobs zu
kontrollieren und mit Hilfe eines Skriptes zu manipulieren, muss dieses Skript zur Laufzeit
des Jobs ausgeführt werden. Das heißt, dass falls die Bearbeitungszeit eines Knotens abläuft,
muss ein Skript parallel zum Job gestartet werden. Auf dieses Skript müssen alle Anwender
der SGE Zugriff haben und dieses ausführen können. In diesem Skript muss bekannt sein,
10
auf welchem Knoten die Rechenzeit abgelaufen ist, die JobID und der Pfad, in welchem die
Variablen des beendeten Jobs gespeichert sind.
Die Aufgabe des Skriptes ist es dann, den Job mit dem Befehl exit 99 zu beenden oder die
entsprechende Variable der SGE auf diesen Wert zu setzen. Da die Jobs auf unterschiedlichen
Knoten ausgeführt werden, und somit die Ordner, in denen diese Variablen gesetzt werden,
variieren, gibt es in der SGE eine Variable, welche den aktuellen voll qualifizierten Pfadnamen
beinhaltet. Der Name dieser Variable lautet bei allen Jobs der SGE SGE_JOB_SPOOL_DIR. Diese
Variable kann im Job oder in einem Skript aus der gleichen Umgebung5 abgefragt werden.
Aus diesen Informationen entsteht folgendes Skript:
Listing 4: Skript zum “Reschedulen” eines Jobs
#!/ bin / sh
echo 25 > $S GE_ JO B_ SP OO L_ DI R / exit_status
pid_job = ‘ cat $S GE _J OB _S PO OL_DI R / job_pid ‘
kill $pid_job
Dieses Skript wird anstelle des Suspend-Signals in der Konfigurationsdatei der SGE angegeben. Somit wird nicht, wie standardmäßig festgelegt, das Signal SIGSTOP ausgeführt,
sondern dieses Skript. Die erste Zeile des Skriptes gibt die Shell an, in welcher dieses ausgeführt
wird. In vorliegenden Fall wurde die Standardshell dash gewählt. Die zweite Zeile setzt den
Exitstatus des Skriptes auf den Wert 25, welcher vom System wie der Befehl exit 99 im
Jobskript interpretiert wird. In der dritten Zeile wird die JobID des laufenden Jobs ermittelt
und in der lokalen Variable pid_job gespeichert. In der letzten Zeile wird dann das Signal
SIGKILL an den Job gesandt, um diesen zu beenden. An dieser Stelle könnte auch ein anderes
Signal, wie beispielsweise SIGUSR1 versandt werden, dafür müsste aber als Umgebung eine
andere Shell, wie zum Beispiel die Bash, für dieses Skript gewählt werden, da dieses Signal in
der dash nicht versandt werden kann. Der einzige Unterschied zwischen diesen beiden Signalen
besteht an dieser Stelle darin, wie der eigentliche Job beendet wird. Dies hat keinen weiteren
Einfluss auf das erneute Ausführen des Jobs.
5
Alle Signale, die an die entsprechenden Jobs gesandt werden und alle Skripte, welche im direkten Zusammenhang zu einem Job ausgeführt werden, haben Zugriff auf die gleichen globalen Variablen.
11
3
Fazit
3.1
Zusammenfassung
Inhalt dieser Arbeit ist es, ausgewählte Desktop PCs zu bestimmten Zeiten zu einer bereits bestehende Sun Grid Engine hinzuzufügen. Bei diesen Computern handelt es sich um
Arbeitsplätze von Mitarbeitern, welche diese in der Zeit zwischen 8 und 18 Uhr benutzen. Die
Umsetzung mit Hilfe des cron-Daemons brachte keinen Erfolg, da mit diesem laufende Jobs
nicht beendet werden können.
Mit Hilfe des Kalenders der Sun Grid Engine konnten diese Jobs für eine definierte Zeit
angehalten werden. Dabei wird den Jobs lediglich die Rechenzeit entzogen, der Arbeitsspeicher
bleibt alloziert. Da dieser virtuelle Speicher anderen Programmen nicht zur Verfügung steht,
stellt auch dies keine Alternative dar. Somit wurde dieser Kalender so weit angepasst, dass
laufende Jobs mit Hilfe eines Skriptes abgebrochen werden und anschließend von der SGE
automatisch am Anfang der Queue erneut hinzugefügt werden. Somit muss sich der Anwender
nicht um ein erneutes Einstellen des Jobs kümmern, falls dieser durch das Ablaufen des Timers
abgebrochen wurde.
3.2
Ausblick für die Masterarbeit
Zusätzlich zu den Computern der Mitarbeiter sollen die Desktop PCs der Forscher zum COW
hinzugefügt werden. Da einige Forscher am Max-Planck-Institut auch außerhalb der Kernarbeitszeit, in den Nachtstunden oder am Wochenende arbeiten, stellen die festen Zeiten eines
Kalenders keine vollständige Lösung des Problems dar. So ist es zum Beispiel möglich, dass ein
Mitarbeiter nach der festgelegten Zeit Programme auf einem Desktop PC ausführt. Zusätzlich
gestartete Jobs der SGE könnten dabei mit diesen Programmen um die CPU-Zeit konkurrieren.
Aus diesem Grund sollen im weiteren Vorgehen zusätzlich einige Bedingungen geprüft werden,
bevor die SGE die Rechenzeit dieser Desktops bekommt. Bei diesen Bedingungen handelt es
sich zum Beispiel um:
• Die Zeit, die seit dem letzten Tastendruck auf dieser Maschine vergangen ist.
• Die Anmeldung am System.
Falls ein Benutzer am System angemeldet ist, stellen sich folgende Fragen:
• Ist der Bildschirmschoner aktiv?
• Wie ist die aktuelle CPU- und Arbeistsspeicherauslastung?
Diese Bedingungen sollen dazu beitragen, dass es ausgeschlossen ist, einen Job mit Hilfe
der SGE an einen Desktop PC zu senden, an dem ein Anwender zu dieser Zeit arbeitet.
Zudem sollen Jobs abgebrochen werden, falls zu deren Bearbeitungszeit ein Anwender diesen
Computer benutzt.
Ein weiterer Einsatz dieses Systems besteht darin, Minijobs (Jobs mit einer Bearbeitungszeit
von weniger als 30 Minuten) zum Beispiel zur Mittagszeit auf Desktop-PCs auszuführen.
12
Herunterladen