
                                Job Partitioner
                                ===============
Version vom 27.10.95 (0.350)

Inhaltsbersicht

   1) Was ist der Job Partitioner?
   2) Anwendungsmglichkeiten

   3) Installation
   4) Benutzung

   5) Beschreibung der Programme, Verzeichnisse und Dateien
   6) Beispielanwendung
   7) Programmstatus


1) Was ist der Job Partitioner?

   Der Job Partitioner, kurz Partner, ist ein verteiltes Programm.
   Seine Bestandteile laufen gleichzeitig auf mehreren Maschinen
   verschiedener Bauart und Unixdialekte. Sie kommunizieren
   miteinander und stellen dem Anwender auf einer dieser Maschinen,
   dem Server, deren zusammengefate Rechenleistung zur Verfgung.

   Der Partitioner schafft dies, indem er batchartig gestellte Aufgaben
   unterteilt, sie auf verschiedene Computer und Zeitabschnitte verteilt
   und die Ergebnisse am Ort des Servers wieder zusammenfat.


2) Anwendungsmglichkeiten

   Mittel:
      Ein User besitzt Accounts auf einer Reihe von Unixmaschinen,
      eventuell in einem homogenen Cluster, eventuell sehr verschiedene
      Gerte in unterschiedlichen Umgebungen.
      Er startet den Serverteil auf einer und den Kliententeil auf allen
      Computern.
      Das erlaubt ihm, dem Server gestellte Aufgaben mit der zusammenge-
      faten Rechenleistung je eines Prozesses pro Gert abarbeiten
      zu lassen. Der Server sorgt fr die Unterteilung der Aufgaben
      in kleine Stcke.

      Der Sinn liegt hier nicht darin, sich durch grere Prsenz einen
      greren Teil vom Prozekuchen abschneiden zu knnen, sondern darin,
      Leerlaufzeiten von Computern zu hundert Prozent ausnutzen zu knnen.

      Ein Argument fr Downsizing in Maschinenparks:
      hundert Unix-PCs haben im allgemeinen eine wesentlich hhere
      Rechenleistung als ein Gert zum hundertfachen Peis.

   Klein:
      Ein User besitzt einen einzelnen Unixrechner, der hufig
      abgeschaltet wird, wie bei Linux-PCs blich.
      Er startet den Server und einen Klienten auf derselben Maschine.
      Das erlaubt ihm, Leerlaufzeiten des Computers fr seinen
      Rechenjob auszunutzen. 
      Auerdem hat er durch die Unterteilung der Jobs in kleine Stcke
      praktisch keine Verluste, wenn er seinen Rechner herunter-
      und spter wieder herauffhrt.

   Gro:
      Eine Vielzahl von Computern, die stndig oder nur sporadisch mit
      dem Internet verbunden sind, knnen aus Nettigkeit je einen
      Klienten laufen lassen, die alle auf einen gemeinsamen Server hren.
      Am Ort dieses Servers knnte so leicht eine Rechenleistung zusammen-
      kommen, wie sie die Welt bisher noch nicht gesehen hat.
      Es gibt zur Zeit fast zehn Millionen Linux-PCs mit sporadischer
      Netzverbindung, die im Wesentlichen nichts zu rechnen haben.
      Eine Aufnahme dieses Programmes in eine Linuxdistribution wrde
      also mit einem Schlag die Leistung von vielleicht einer Million
      CPUs zur Verfgung stellen, ohne da irgend einer der Gastgeber
      dadurch gestrt wrde oder Leistungseinbuen seiner Maschine
      verzeichnen mte.


3) Installation

   Auspacken, make, fertig.
   Diese Version des Partitioners soll von den Anwendern nur lokal
   gehalten werden. Es gibt noch keine Installation unter /usr/local/bin
   oder hnliches.

   Die Standardeinstellungen gehen vom Fall einer Kleinen Anwendung aus:
   mit "partners" startet man den Serverteil und mit "partnerd" einen
   Kliententeil, der genau auf diesen Server hrt.

   Dieses Release ist so zusammengestellt worden, da der Partitioner dann
   sofort anfngt, ein kleines Beispiel durchzurechnen.

   Etwas mehr Arbeit - aber auch mehr Wirkung - macht die Installation
   auf mehreren Computern, einer Mittleren Anwendung.
   Handelt es sich um ein homogenes Cluster oder allgemeiner um einen
   Satz von Rechnern, die sich vom Server aus durch rcp und rsh ohne
   Loginnamen und Pawort ansprechen lassen, so gengen folgende Eingaben
   auf dem Server im ausgepackten Verzeichnis, nachdem im Makefile
   eventuell der vollstndige Pfad fr die zu verwendenden Compiler
   eingetragen wurde.

      make partners
      partners
      xport <IP-Nummer des Servers>
      <Rechner 1>
      <Rechner 2> <besonderer Verzeichniswunsch>
      <Rechner 3>
      ...
      ^D

   Die Rechnernamen sind deren Internetnamen oder IP-Nummern.

   Eventuell teilen sich diese Rechner eine betroffene Festplatte.
   Weil aber nicht mehrere Klienten im selben Directory laufen knnen,
   wird fr jede Maschine ein Unterverzeichnis angelegt.

   Defaultmig versucht xport, den Klienten auf jedem Computer in ein
   Unterverzeichnis desjenigen Verzeichnisses zu stellen, in dem man sich
   gerade befindet. Macht dies keinen Sinn, so mu ein Vaterverzeichnis
   mit angeben werden.

   xport -? gibt weitere Informationen, falls erwnscht.

   Mchte man die Klienten von Hand installieren, so soll man das Paket
   auf jedem Rechner in einem eigenen Verzeichnis neu auspacken und dort
   "make SERVER=<IP-Nummer des Servers> partnerd; partnerd" eingeben.

   Fr die Vorbereitung einer Groen Anwendung bitte ich den Autor
   heranzuziehen.


4) Benutzung

   Nachdem der Server und eine Vielzahl von Klienten gestartet worden sind,
   laufen sie als Dmonen im Hintergrund. Es besteht keine Notwendigkeit,
   sich weiter um sie zu kmmern, auer bei Neustarts nach Maschinenausfllen,
   und auch dafr gibt es Untersttzung.

   Die Anwendung ist Heinzelmnnchengleich: man hinterlt ein Programm
   mit Eingabedatei im vom Server erstellten Verzeichnis input,
   trgt eine Kommandozeile in der Datei jobs ein und holt sich ein paar
   Tage spter die Ausgabedatei aus dem Verzeichnis output ab.

   Voraussetzung ist allerdings, da sich dieses Programm auch unterteilen
   lt. Es mu aktiv die Mglichkeit dazu bieten, indem es eine natrliche
   Zahl auf seiner Kommandozeile akzeptiert, die den durchzurechnenden
   Abschnitt kennzeichnet. Auerdem mu der Benutzer im Voraus eine Gesamt-
   anzahl von Abschnitten angeben, die er allerdings spter noch heraufsetzen
   kann.
   
   In das Verzeichnis input stellt er also zwei Dateien:

      <name>.c             enthlt das Programm, zur Zeit nur in C.
      <name>.in            enthlt dessen Stdin, abschnittsunabhngig.

      make break           stoppt den Server.

   An die Datei jobs fgt er eine Kommandozeile an:

      <name> <Optionen, Argumente und einmal #Anzahl>

   Das Zeichen '#' mit der direkt folgenden Gesamtanzahl der Teile
   wird bei der Partitionierung durch die jeweilige Abschnittsnummer
   ersetzt werden, von Null bis Anzahl minus Eins.
   Der regulre Ausdruck, dem die Zeile in dieser Version gengen sollte,
   lautet: [A-Z_a-z][A-Z_a-z0-9]* [A-Z_a-z 0-9+\-=]*#[A-Z_a-z 0-9+\-=]*
   Dies ndert sich noch.

      partners             startet den Server wieder.

   Sobald alle Abschnitte durchgerechnet sind - man kann dies mit einem
   gelegentlichen "cat jobs" verfolgen - findet sich der gesammelte
   Output (Stdout und Stderr) im Verzeichnis output unter <name>.out.

   Auch wenn jeder Inhaber eines Servers selbst entscheidet, was er seinen
   Klienten zu rechnen gibt, so gelten Systemaufrufe in den bertragenen
   C-Pogrammen doch als nicht erwnscht. Der Eindruck, dieses Werkzeug
   wre nur ein Spielzeug fr Hacker, schadet seiner Verbreitung als
   Rechenknecht, wie er vom Autor gemeint ist.


5) Beschreibung der Programme, Verzeichnisse und Dateien

   Programme
      Der "Job Partitioner" besteht aus zwei Teilen: auf einem
      Host luft ein Serverproze und auf mglichst vielen ver-
      schiedenen Computern arbeiten Klientenprozesse, die sich
      ihre Aufgaben per Internetprotokoll vom Server holen und
      ihre Ergebnisse dort abliefern.

      Die Klientenprozesse heien partnerd ("Partner-Dmon"):
      sie stellen sich nach ihrem Start sofort in den Hinter-
      grund, so wie der Line-Printer-Dmon, und arbeiten bis zum
      nchsten Rechnershutdown unermdlich mit Niceness 10 an
      den Aufgaben, die sie sich vom Server geholt haben. Weil
      diese Aufgaben nach Vereinbarung nicht Speicherplatz-,
      sondern nur Rechenzeitintensiv sind, wird der jeweilige
      Benutzer deren emsige Aktivitt im allgemeinen berhaupt
      nicht wahrnehmen, es sei denn, er studiert Prozestatustabellen.
      Der jeweilige Rechner wird nicht langsamer und auch die
      Swapwahrscheinlichkeit ndert sich kaum.

      Der Serverproze heit partners ("Partner-Server"). Auch
      er stellt sich in den Hintergrund. Fast seine gesamte
      Lebenszeit verbringt er wartend. Nur wenn ein Klient eine
      neue Aufgabe zugeteilt bekommen mchte, bermittelt er ihm
      die ntigen Dateien, oder auch nur die Startsequenz, wenn
      der die Dateien bereits hat.

      Als Variante kann man Klient und Server auch gut allein-
      stehend auf einem Computer laufen lassen. In dieser
      reduzierten Version wirken sie als Batchsystem mit Ver-
      lustminimierung. Das ist sinnvoll auf Rechnern, die
      hufiger mal heruntergefahren werden, wie bei Linux-PCs
      blich. Zur Bequemlichkeitssteigerung kann man ihnen ein
      gemeinsames Arbeitsverzeichnis zur Verfgung stellen, zum Beispiel
      /tmp/partner, und bei Systemstart folgende Zeile ausfhren
      lassen (Eintrag in /etc/rc.d/rc.local oder sonstwo):

         su -c "cd /tmp/partner; partners; partnerd;" username

      Dies startet den Server und ein Exemplar des Klienten, so
      da anliegende Arbeiten sofort wieder aufgenommen und
      weitergefhrt werden. Man achte auf den Usernamen. Aus
      Sicherheitsgrnden lassen sich die Programme nicht mit
      Rootpermissions starten: andernfalls knnte jemand die IP-
      Pakete im Internet manipulieren und wesentlichen Schaden
      anrichten.

   Verzeichnisse
      Der Server sollte in dem ausgepackten Verzeichnis der
      Partitioner Distribution gestartet werden. Er vertrgt sich dort
      mit einem Exemplar des Klienten. Weitere Klienten oder
      andere Server bentigen andere Verzeichnisse.

      Weder der Server noch seine Klienten interessieren sich
      fr absolute Pfade. Sie mssen auch nicht voneinander wissen,
      wo sie sich aufhalten.
      Arbeitsverzeichnis fr partners und partnerd ist immer
      das Current Working Directory beim Aufruf.

      input
         In dieses lokale Unterverzeichnis auf der Serverseite
         sind die Eingabedateien zu stellen. Zu jeder
         auszufhrenden Arbeit gehren ein C++-Programm
         <name>.c und eine Inputdatei <name>.in, die auf
         Stdin des Programmes geleitet wird.

      output
         In dieses lokale Unterverzeichnis auf der Serverseite
         gelangen die zurckerhaltenen Rechenergebnisse, in
         Form je einer numerierten Datei fr jeden
         Abschnitt. Sind alle Abschnitte komplett, werden
         die Dateien zu einer einzigen, namens <name>.out,
         zusammengefat.

      Weitere Unterverzeichnisse werden vom Script xport erzeugt,
      um Klienten auf anderen Maschinen einzurichten,
      wenn diese sich die Festplatte mit dem Server teilen.

   Dateien
      0-README
         Dieser Text. Ein README gibt es noch nicht, Manual auch nicht.

      Makefile
         Der Job Partitioner liegt im Quellcode vor. Vor dem
         make ist im String SERVER die Internetadresse des
         Servers einzutragen, es sei denn, Klient und Server
         laufen auf demselben Rechner: fr diesen Fall steht
         dort defaultmig die Loopback-Adresse 127.0.0.1.
         Um Fehlleitungen durch Manipulationen am Nameserver
         auszuschlieen, werden nur numerische Adressen
         akzeptiert.
         Fr den - auch vom Klienten benutzten - C++-Compiler
         kann der angegebene String PP angepat werden.
         Die bertragenen Rechenprogramme werden unabhngig
         davon mit einem zweiten String compiliert. Auch dieser,
         CC, kann im Voraus im Makefile individuellen Wnschen
         angepat werden.

      client.c
         Sourcecode des Kliententeiles.

      job, job.c, job.in, job.out
         Dies sind temporre Dateien eines Klienten.
         Sie enthalten das Executable, das Programm, den Input
         und den Output eines einzelnen Rechenabschnittes.

      jobs
         Steuerdatei des Servers fr die Jobverarbeitung.
         Hierin sollen die zu verteilenden Aufgaben einge-
         tragen werden: je eine Kommandozeile, in der ein
         vorgegebenes Zeichen ('#') fr die Ausfhrung durch
         fortlaufende Zahlen ersetzt wird. Das Programm fgt
         je eine Zeile mit Flags fr die einzelnen Rechenab-
         schnitte an.

      partnerd
         Executable eines Klienten.

      partnerd.c
         Temporre Kopie von client.c im Falle eines Updates

      partnerd.log
         Protokolldatei eines Klienten fr die ausgefhrten
         Arbeiten sowie die Kommunikation mit dem Server-
         proze.

      partnerd.lst
         Enthlt die Liste der Rechner, auf denen mit Hilfe
         des Scriptes xport Klienten installiert und gestartet wurden.
         Diese Datei steht im Verzeichnis des Servers.

      partnerd.old
         Temporre Kopie von partnerd im Falle eines Updates.

      partnerd.pid
         Enthlt die Proze-Id eines Klientenprozesses, so da
         kill `cat partnerd.pid` den betreffenden Klienten geordnet
         terminiert.

      partners
         Executable des Servers.

      partners.log
         Protokolldatei des Servers fr die Kommunikation
         mit den Klientenprozessen.

      partners.pid
         Enthlt die Proze-Id des Serverprozesses, so da
         kill `cat partners.pid` den Server geordnet terminiert.

      server.c
         Sourcecode des Serverteiles.

      xport
         Shellscript zur Installation mehrerer Klienten auf einem
         Rechnerpool. "xport -?" gibt nhere Auskunft.

   Aufruf partners
      partners [ -f<filename> ] [ port ]

      -f<filename> stellt den Namen der Datei mit den Jobs ein.
                   Default "jobs".

      port         Portnummer des Serverprozesses. Default 4999.

   Aufruf partnerd
      partnerd [ -d<maxdelay> -j<jobname> -n<niceness> ] [ address [port] ]

      -d<maxdelay> stellt die Anzahl Sekunden ein, die der Klient schlafen
                   soll, wenn sein Server nicht erreichbar ist oder keine
                   Aufgabe fr ihn hat, bevor er das nchste Mal nachfragt.
                   Default 1800, anfangs hufiger.

      -j<jobname>  stellt einen lokalen Namensprfix fr die aufgabenbezogenen
                   Dateien ein. Default "job".

      -n<niceness> stellt den Inkrement ein, um den sich der Dmon selbst
                   reniced, wenn er sich in den Hintergrund stellt.
                   Default 10. Fr Arbeiten auf intensiv genutzten Rechnern
                   ist das zuviel: die Dmonen wren praktisch eingefroren.
                   Das Script xport benutzt -n5.

      -t           testet die Verfgbarkeit eines C-Compilers.
                   Erzeugt der vom Makefile mitgegebene Compilerstring eine
                   Fehlermeldung bei der bersetzung eines Dummy-C-Programmes,
                   so beendet sich der Klient sofort.

      address      Numerische (!) Internetadresse des Serverhostes.
                   Default 127.0.0.1, das ist der eigene Rechner.

      port         Portnummer des Serverprozesses. Default 4999.

   Rckgabewerte
      0  Der Proze wurde mit dem Signal TERM gestoppt. Das
         ist sein normales Ende.

      1  Falscher Aufruf.

      2  Falsche Permissions.

      3  Datei-I/O fehlgeschlagen.

      4  Socketeinrichten fehlgeschlagen.

      5  Fork milungen.

      6  C++-Operator new konnte angeforderten Speicher nicht liefern.

      7  Sizeof unsigned zu klein.

      8  Test mit der Option -t eines C-Compilers fehlgeschlagen.

      9  Programm luft bereits im selben Verzeichnis.


6) Beispielanwendung
      Das Programm arrange desselben Autors, zum Lsen von Puz-
      zles, ist sehr gut fr eine solche Sequenzierung geeignet.

      0) Mit arrange -m<Stufe> -x zhlt das Programm eine
         mgliche Abschnittsunterteilung durch: je grer <Stufe>,
         desto feiner die Unterteilung.

      1) arrange.c und eine Inputdatei mit entsprechendem Namen,
         wie arrange.in, in das Serververzeichnis input kopieren.
         Fr die typischen Eingaben eines Rechteckes oder
         Quaders als Grundraum hilft das Progrmmchen field, die
         Inputdatei zu erstellen.

      2) make break oder kill `cat partners.pid`

      3) Eine Zeile arrange -m<Stufe> -x#<Count> an die
         Datei jobs anhngen.
         Man achte auf das Nummernzeichen mit der direkt
         anschlieenden Zahl: es wird durch die jeweilige
         Abschnittsnummer, von 0 bis <Count>-1, ersetzt werden.
         Eine Freistelle, eingefgt zwischen '#' und <Count>,
         wrde den Job pausieren lassen.

      4) partners startet den Server wieder.

      5) Der Server fgt eine Zeile mit Punkten - einen fr
         jeden Rechenabschnitt - an die betreffende Jobzeile an.
         Sobald alle Punkte sich in Kreuze verwandelt haben, wird
         das Ergebnis zusammengefat. Bleiben einzelne Striche
         brig, so bedeutet dies, da die betreffenden Klienten
         sich nicht wieder gemeldet haben. Um die Abschnitte neu zu
         vergeben, gengt es, den Server zu stoppen und neu zu starten,
         zum Beispiel durch "make break; partners".
         Sind die Berechnungen komplett, wird die Zeile wieder gelscht,
         und eine Freistelle wird hinter dem Zeichen '#' eingefgt.

      6) Ergebnis steht in output/arrange.out.


7) Programmstatus

   Ungeboren, noch im Zeugungsproze befindlich:
   Es ist noch nicht einmal klar, welche Eigenschaften das Programm
   spter einmal haben soll, geschweige denn, da diese Eigenschaften
   voll ausgebildet oder dokumentiert wren.

   Problem
      Ein Mibrauch der Klienten soll dadurch verhindert werden,
      da alle Aktivitt von ihnen ausgeht. Sie empfangen ihre
      Aufgaben nur von der eincompilierten Stelle. Dort mu
      sichergestellt werden, da die zu verteilenden Programme
      keine Systemaufrufe enthalten: Verteilt werden sollen
      ausschlielich reine Rechenaufgaben. Der Server ist durch
      dessen sehr eingeschrnkten Aufgabenbereich vor Mibrauch
      geschtzt. Als zustzliche Sicherheit knnen die Pro-
      gramme nur mit normalen Benutzerrechten, also nicht mit
      Superuserrechten, gestartet werden.

   ToDo
      Konzept dafr, was das Programm eigentlich tun soll
      Dokumentation
      Primzahlenbeispiel
      Noch mehr Sicherheit
      Den ganzen Mll nochmal geordnet aufschreiben

   Luft unter
      Linux 1.2.8  {g++/gcc 2.6.3}
      ULTRIX 4.3   {g++/gcc 2.4.5}
      ULTRIX 4.4   {g++/gcc 2.7.0}
      OSF1 3.0     {g++/gcc 2.7.0}
      HP-UX ...    {g++/gcc .....}, {CC/cc -Aa .....}

   Copyright
      GNU Copyleft wird angestrebt.

   Autor
      Udo Sprute (sprute@mathematik.uni-bielefeld.de) mit Untersttzung
      von Torsten Sillke (sillke@fra1.lh.lh.dbp.de).

