Linux Cluster

Funktionsweise


[ Seminar Linux und Apache ] [ Inhalt ] [ Programmierung ]

Übersicht

[ nach oben ]

PVM - Generelles

PVM (Parallel Virtual Machine) ist ein Software Paket, das es einer heterogenen Menge von seriellen oder parallelen Computern, die an ein Netzwerk angeschlossen sind, erlaubt, als eine große Ressource zu erscheinen.

[ nach oben ]

PVM - Key Features

PVM ist ein einfach zu besorgendes "public-domain" Paket. Dieses Paket ist einfach zu installieren und zu konfigurieren. Großer Vorteil von PVM ist, daß viele virtuelle Maschinen nebeneinander auf der selben Hardware existieren können. Die Programmentwicklung wird unter Benutzung einer weit verbreiteten "Message Passing Library" unterstützt. Programme, die in PVM arbeiten sollen, können in Fortran oder C entwickelt werden. Die Installation von PVM benötigt nur wenige MB Platz auf den Festplatten. Die Migration von PVM zu MPI ist sehr einfach.

[ nach oben ]

PVM - Heterogenität

PVM bietet Unterstützung von Heterogenität auf drei Ebenen:
Auf Anwendungsebene bietet PVM Unterstützung in der Weise, daß Tasks auf den Prozessoren im Cluster laufen, zu denen sie am besten passen. Auf Rechnerebene werden verschiedene Datenformate, Architekturen, sowohl seriell als auch parallel, und Betriebssysteme unterstützt. Auf Netzwerkebene stellt sich die Heterogenität in so fern dar, daß eine Virtuelle Maschine sich über verschiedene Typen von Netzwerken erstreclen kann, z.B. FDDI, Ethernet oder auch ATM.

[ nach oben ]

PVM - Portabilität

PVM ist portabel, d.h. PVM ist inzwischen für eine breite Masse von Unix basierenden Computern verfügbar. Seit Version 3 von PVM kann die Virtuelle Maschine auch auf nicht-Unix Maschinen portiert werden, z.B. Windows basierende PCs. Es gibt auch Versionen von PVM für Supercomputer, z.B. Cray3.

[ nach oben ]

PVM - Komponenten

PVM besteht aus sechs wichtigen Komponenten: den Task Identifiers (TID's), den Architecture classes, dem Message Model, der Asynchronous Notification, dem PVM Daemin und der Programming Library.

Task Identifiers

Die TIDs werden zur Adressierung von pvmd's, Tasks und Gruppen von Tasks benutzt. Die sind den Prozess-IDs unter Unix ähnlich. Die TIDs passen in den größten Integer-Datentyp (32 bit), der auf den meisten Maschinen zur Verfügung steht.

Die Felder S, G und H haben globale Bedeutung, d.h. jeder pvmd der virtuellen Maschine interpretiert diese Felder gleich.

Feld H enthält die relative Host-Nummer in der Virtuellen Maschine. Damit wird jedem pvmd ein eigener Adressbereich zugeordnet. Aus der Feldlänge und der relativen Adressierung ergibt sich aber auch eine Obergrenze für die Anzahl an Hosts in der Virtuellen Maschine, nämlich 2^12-1 Hosts.

Feld L ist für den privaten Gebrauch eines pvmds, wenn H mit der eigenen Host-Nummer gefüllt ist.

Feld G wird gesetzt, wenn Gruppen von Tasks angesprochen werden sollen

Feld S ist nur noch ein historisches Relikt und wird wohl dem H oder dem L Feld in der einer der nächsten Versionen zugesprochen werden.

Architektur Klassen

Jeder Maschine in der Virtuellen Maschine wird eine Architektur Klasse zugeordnet. Damit wird eine Unterscheidung zwischen Maschinen, auf denen verschiedene ausführbare Programme auf Grund von Hardware oder Betriebssystem laufen, ermöglicht. Manchmal kann es trotz inkompatibler Programme doch selbe Repräsentation binärer Daten geben, hier ist dann keine Datenkonversion nötig. Dazu werden den Architektur Klassen sogenannte "data encoding" Nummern zugeordnet. Anhand der "data encoding" Nummern wird festgestellt, wann einer Konvertierung der übertragenen Daten nötig ist.

Folgende Architektur Klassen sind zur Zeit in PVM3 vorhanden:

      AFX8          Alliant FX/8
      ALPHA         DEC Alpha/OSF-1
      ALPHAMP       DEC Alpha/OSF-1 / using shared memory
      AIX46K        IBM/RS6000 / AIX 4.x
      AIX4MP        IBM SMP / shared memory transport / AIX 4.x
      AIX4SP2       IBM SP-2 / using MPI / AIX 4.x
      APOLLO        HP 300 running Domain/OS
      ATT           AT&T/NCR 3600 running SysVR4
      BAL           Sequent Balance
      BFLY          BBN Butterfly TC2000
      BSD386        80[345]86 running BSDI or BSD386
      CM2           Thinking Machines CM-2 Sun front-end
      CM5           Thinking Machines CM-5
      CNVX          Convex using IEEE floating-point
      CNVXN         Convex using native f.p.
      CRAY          Cray
      CRAY2         Cray-2
      CRAYSMP       Cray S-MP
      CSPP          Convex Exemplar
      DGAV          Data General Aviion
      E88K          Encore 88000
      FREEBSD       80[345]86 running FreeBSD
      HP300         HP 9000 68000 cpu
      HPPA          HP 9000 PA-Risc
      HPPAMP        HP 9000 PA-Risc / shared memory transport
      KSR1          Kendall Square
      I860          Intel RX Hypercube
      IPSC2         Intel IPSC/2
      LINUX         80[3456]86 running Linux
      M88K          Motorola M88100 running Real/IX
      M88K          Motorola M88100 running Real/IX
      MASPAR        Maspar
      MIPS          Mips
      NETBSDAMIGA   Amiga running NetBSD
      NETBSDHP300   HP 300 running NetBSD
      NETBSDI386    80[345]86 running NetBSD
      NETBSDMAC68K  Macintosh running NetBSD
      NETBSDPMAX    DEC Pmax running NetBSD
      NETBSDSPARC   Sparc running NetBSD
      NETBSDSUN3    SUN 3 running NetBSD
      NEXT          NeXT
      PGON          Intel Paragon
      PMAX          DEC/Mips arch (3100, 5000, etc.)
      RS6K          IBM/RS6000 / AIX 3.x
      RS6KMP        IBM SMP / shared memory transport / AIX 3.x
      RT            IBM/RT
      SCO           80[345]86 running SCO Unix
      SGI           Silicon Graphics IRIS
      SGI5          Silicon Graphics IRIS running OS >= 5.0
      SGI64         Silicon Graphics IRIS running OS >= 6.0
      SGIMP         Silicon Graphics IRIS / OS 5.x / usm
      SGIMP64       Silicon Graphics IRIS / OS 6.x / usm
      SP2MPI        IBM SP-2 / using MPI / AIX 3.x
      SUN3          Sun 3
      SUN4          Sun 4, 4c, sparc, etc.
      SUN4SOL2      Sun 4 running Solaris 2.x
      SUNMP         Sun 4 / using shared memory / Solaris 2.x
      SX3           NEC SX-3
      SYMM          Sequent Symmetry
      TITN          Stardent Titan
      U370          IBM 3090 running AIX
      UTS2          Amdahl running UTS
      UVAX          DEC/Microvax
      UXPM          Fujitsu running UXP/M
      VCM2          Thinking Machines CM-2 Vax front-end
      X86SOL2       80[345]86 running Solaris 2.x
      WIN32         PC's running Windows95 or NT (Intel, Alpha)

Nachrichten Modell

Pvmd's un Tasks können Nachrichten erzeugen und versenden. Diese Nachrichten sind von variabler Länge und enthalten typisierte Daten. Die Virtuelle Maschine besorgt die Konvertierung zwischen Hosts mit inkompatiblem Datenformaten. Nachrichten können beim Versand frei wählbar "beschriftet" werden. Der Empfang von Nachrichten ist nach Absender oder nach "Beschriftung" möglich.

Der Sender einer Nachricht bekommt vom Empfänger keine Bestätigung, dafür kann er sich aber darauf verlassen, das die Virtuelle Maschine die Nachricht zuverlässig verschickt, vorrausgesetzt, der Empfänger existiert. Die Tasks müssen also selbst dafür sorgen, daß Nachrichten, die zu Tasks gesendet wurde, die inzwischen zusammengebrochen sind, an andere Tasks zur Bearbeitung verschickt werden.

Asynchronous Notification

Die Virtuelle Maschine stellt Benachrichtigungen zur Verfügung. Damit ist eine gewisse Programmierung von Fehler-Toleranz möglich. Ein Task kann vom System eine Benachrichtigung über folgende drei Ereignisse anfordern:

   Type             Meaning
   ----------------------------------------------
   PvmTaskExit      Task exits or crashes
   PvmHostDelete    Host is deleted or crashes
   PvmHostAdd       New hosts are added to the VM
   ----------------------------------------------

PVM Daemon (pvmd)

In der Virtuellen Maschine exisitert auf jedem Host ein pvmd. Der pvmd eines Users interagiert nicht mit denen eines anderen, dadurch sind Sicherheitsrisiken minimiert. Der pvmd dient als Nachrichtenübermittler und Nachrichtencontroller. Für die Tasks ist er Kontaktpunkt, er übernimmt die Authentifizierung, Prozesskontrolle und die Fehlerüberwachung.

Der erste pvmd, der von Hand gestartet wird, ist der Master. Alle weiteren, vom Master gestaret, werden Slaves genannt.

Programming Library

Die Bibliothek libpvm dient als Schnittstelle zwischen Tasks und pvmd oder anderen Tasks. Die enthält Funktionen für das Erzeugen und das damit verbundene "packing" und das Empfangen und das damit verbundene "unpacking" von Nachrichten. Außerdem können Tasks durch sie sogenannte Service Anfragen (syscalls) an den pvmd stellen.

Die libpvm ist klein und schmal. Die obere Ebene enthält maschinen-unabhängigen Code. Die untere Ebene ist davon getrennt, die kann bei Portierung modifiziert oder duch maschinen-spezifischen Code ersetzt werden.

[ nach oben ]

Beispiel

Der Plan

Ausgabe des Namens und der lokalen Zeit aller physikalischen Maschinen eines Clusters.

Das Modell

Als Modell wird das bekannte Master und Slave Modell gewählt. Der Master Prozeß wird als einziger vom User auf einer Maschine gestartet. Der Master Prozeß startet und kontrolliert die Slaves auf den anderen Maschinen.

Der Master <c_master.c>

Was muß der Master tun:

/* master program for the simple communication program */
/* which starts slaves just to get their names and the */
/* local time back */

#include <stdio.h>
#include <pvm3.h>
int main(void)
{

struct pvmhostinfo *hostp;
int result, check, i, nhost, narch, stid;
char buf[64];
pvm_setopt(PvmRoute, PvmRouteDirect);    /* channel for communication */

gethostname(buf, 20);        /* get name of master */
printf("The master process runs on %s \n", buf);

/* get and display configuration of the parallel machine */
pvm_config( &nhost, &narch, &hostp );    /* get configuration */
printf("I found the following hosts in your virtual machine\n");
for (i = 0; i < nhost; i++)
{
   printf("\t%s\n", hostp[i].hi_name);
}

for (i=0; i<nhost; i++)        /* spawn processes on */
{                              /* all physical machines */
   check=pvm_spawn("answer", 0,PvmTaskHost,hostp[i].hi_name, 1, &stid);
   if (!check) printf("Couldn't start process on %s\n", hostp[i].hi_name);
}
result=0;
while (result>nhost)
{
   pvm_recv(-1, 2);      /* wait for reply message */
   pvm_upkstr(buf);      /* unpack message */
   printf("%s\n", buf);  /* print contents */
   result++;             /* next message */
}

pvm_exit;                /* we are done */
}
Der Slave <c_slave.c>
/* slave program for PVM-first-try */
/* returns string consisting of machine name and local time */

#include <stdio.h>
#include <pvm3.h>
#include <time.h>

int main(void)
{
time_t now;
char name[12], buf[60];
int ptid;

ptid = pvm_parent();        /* the ID of the master process */
pvm_setopt(PvmRoute, PvmRouteDirect);

gethostname(name, 64);      /* find name of machine */
now=time(NULL);             /* get time */
strcpy(buf, name);          /* put name into string */
strcat(buf, "'s time is ");
strcat(buf, ctime(&now));   /* add time to string */

pvm_initsend(PvmDataDefault);   /* allocate message buffer */
pvm_pkstr(buf);                 /* pack string into buffer */
pvm_send(ptid, 2);              /* send buffer to master */

pvm_exit;           /* slave is done and exits */
}
Erzeugen der Programme

Ausführen der Anwendung

Auf jedem Host muß das Slave-Programm (hier answer) im entsprechenden Verzeichnis ($HOME/pvm3/bin/LINUX) vorhanden sein. Eventuelle muß es für unterschiedliche Slaves neu compiliert werden.

[markus@HHCS015 LINUX]$ pvm
pvm> conf
conf
1 host, 1 data format
                    HOST     DTID     ARCH   SPEED       DSIG
                 HHCS015    40000    LINUX    1000 0x00408841
pvm> add mbs001
add mbs001
1 successful
                    HOST     DTID
                  mbs001    80000
pvm> conf
conf
2 hosts, 1 data format
                    HOST     DTID     ARCH   SPEED       DSIG
                 HHCS015    40000    LINUX    1000 0x00408841
                  mbs001    80000    LINUX    1000 0x00408841
pvm> quit
quit

Console: exit handler called
pvmd still running.
[markus@HHCS015 LINUX]$ ./master
The master process runs on HHCS015
I found the following hosts in your virtual machine
        HHCS015
        mbs001
HHCS015's time is Sun Nov 18 14:57:19 2001

mbs001's time is Sun Nov 18 15:48:16 2001

[markus@HHCS015 LINUX]$
[ nach oben ]

[ Seminar Linux und Apache ] [ Inhalt ] [ Programmierung ]