Tout utilisateur de Linux a déjà rêvé de posséder un jour une machine surpuissante capable d'égaler les supercalculateurs des universités. Le principal problème est le prix de revient d'un tel ordinateur. Peut-on contourner cet état de chose ? Et si oui, comment ? La réponse est simple et tient en un seul mot : CLUSTERING !
CONCEPT
Le principe utilisé dans le clustering consiste à diminuer le temps d'exécution d'une tâche en la fractionnant sur plusieurs machines. En clair, une tâche répartie sur N machine arrivera N fois plus vite à terme que sur une seule. Si vous possédez dans votre cave une vingtaines de PC i486DX33, il y a fort à parier qu'ensemble ils travailleraient plus vite qu'un Pentium 233 ! De cette manière, tous les réseaux peuvent être transformés en cluster. Il serait même envisageable de créer le plus puissant cluster du monde grâce au plus grand réseau interconnecté du monde : InterNet !
Ce concept est fort simple mais il faut faire le distingo entre un système complet en clustering et un logiciel en clustering. Dans le premier cas, ce sont les tâches qui seront réparties sur plusieurs PC et dans le second, c'est une tâche qui sera divisée sur plusieurs PC.
Pourquoi tout le monde n'utilise-t-il pas un cluster puisque c'est performant et peu cher ? Le problème principal provient des connexions entre les différentes machines. Pour créer un cluster performant, les machines doivent pouvoir communiquer très rapidement et le coût s'en trouve augmenté (voir plus bas).
TERMINOLOGIE
Un ensemble de machines en réseau destiné à un fonctionnement en parallèle constitue un cluster. Dans ce cluster, chaque machine sera un Node. Tous les nodes sont des stations de travail dans le sens où elles possèdent un ou plusieurs processeurs en opposition aux terminaux. Le réseau ainsi formé est un NOW, un Network Of Workstation (réseau de station de travail).
CHOIX DU MATERIEL
Le domaine du réseau était encore peu connu et rarement utiliser avant l'arrivé des jeux multi-joueur. En effet, de nos jours, il n'est plus rare de trouver chez un particulier deux, trois ou quatre ordinateurs en réseau. Malheureusement, ces réseaux destinés aux jeux sont souvent lents (ethernet 10 Mb/s) et font cruellement baisser les capacités d'un cluster.
Le matériel performant (cartes, câbles, hub, etc.) coûte excessivement cher. Voyons quelques exemples de matériels supportés par Linux :
LOGICIELS
Il existe une grande quantité de logiciels sous Linux afin de transformer un NOW en cluster. Leur tâche est principalement de transformer l'ensemble des nodes en une seule fausse machine : une machine virtuelle dont l'existence est purement imagée et qui n'existe pas physiquement. Voyons ensemble les deux principaux utilitaires et leurs fonctions.
PVM
; (Sans doute le plus courant.)
PVM
est l'acronyme de Parallèle Virtual Machine. Il permet de créer
un cluster à partir de nodes de types différents (PC/Linux,
PC/Windows, Mac, HP, CRAY, etc.). Il supporte tous les réseaux
capables d'une connexion par socket comme par exemple SLIP, PLIP, Ethernet
et ATM. PVM se présente sous la forme d'un deamon et de bibliothèques
C et FORTRAN. Les applications qui utilisent PVM doivent être compilées
avec les bibliothèques PVM. Ceci implique une modification du code
dans le cas d'une application déjà existante. L'un des plus
bel exemple d'application modifiée et recompilée pour PVM
est PovRay. C'est un logiciel de Ray Tracing dont le portage pour PVM
se nomme PvmPov, mais nous y reviendrons plus loin.
MPI
MPI
(pour Message Passing Interface) est souvent considéré comme
le concurrent principal de PVM. Pour expliquer cette " guerre de religion
" entre PVM et MPI, voyons leurs différences.
o PVM possède un environnement de contrôle. En somme, le lancement d'une application PVM est identique sur tous les environnement. Ceci permet de mettre en oeuvre un utilitaire pour contrôler les exécutions des diverses applications dans la machine virtuelle.
o MPI considère la machine virtuelle comme un processeur massivement parallèle ou encore comme un réseau de nodes identiques. PVM est d'avantage orienté vers les réseaux hétérogènes (composés de machines différentes).
o MPI permet un accès distant à la mémoire (RMA, Remote memory Access) et un système d'entrée/sortie en parallèle. Ces deux fonctionnalités sont utiles mais nécessites d'apprendre MPI de la même manière qu'un nouveau langage.
o MPI a été
crée après PVM et s'en est inspiré. MPI est donc
plus performant au niveau de la gestion de buffers, des structures de
données, etc.
Voici donc les principales caractéristiques qui existent entre
les deux standards. Notre tâche n'est pas de vous inciter à
utiliser l'un ou l'autre. Nous ne donnerons donc pas notre avis, à
vous de voir en PVM ou MPI le programme qu'il vous faut.
LES PROJETS DE CLUSTERS
Il existe beaucoup de méthodes différentes pour créer un cluster. Il est donc utile de pouvoir se référer à des clusters ou des projets de cluster déjà en place.
Beowulf : Ce projet parrainé par la N.A.S.A. concerne l'architecture classique PC et le système Linux. Débuté en 1994, il est dirigé par Thomas Sterling et Don Becker. Le système Beowulf permet à un ensemble de nodes de fonctionner tel un seul PC. Les programmes en fonctionnement sur le PC virtuel seront exécutés en fonction de la puissance et de la disponibilité de chaque node. Mais un seul programme ne sera pas réparti sur plusieurs nodes. En clair, le système va vérifier l'occupation de chaque node et y répartir tous les process en cours. Le premier cluster construit dans le cadre de ce projet était constitué de 16 DX4 connecté en ethernet.
Linux/AP+ :Ce projet ne traite pas exactement de clustering. Il s'agit du portage de Linux sur l'architecture Fujitsu AP1000+. Cet ordinateur est une machine parallèle basée sur SPARC qui utilise une topologie réseau propriétaire à 25Mo par seconde. En résumé, ce portage ressemble fort à un cluster de SPARC sous Linux.
U-NET : Basé à l'université de Cornell, ce projet a pour but de créer une interface basée sur un réseau classique afin d'optimiser les temps de réponse des machines. Le principe consiste à envoyer et recevoir des messages sans l'intervention du système. U-Net tourne sur PC sous Linux et des cartes DECchip Fast Ethernet.
distributed.net : Le plus grand cluster connu au monde. En vous connectant à www.distributed.net, vous pourrez télécharger un client (programme) pour votre ordinateur. Et ce, quelqu'il soit et quelque soit son système d'exploitation. Grâce à ce client, vous pourrez transformer votre ordinateur en node connecté à InterNet. Le but de ce cluster gigantesque est, entre autre, de démontrer que la taille des clefs de cryptage actuellement utilisée est obsolète. Pour preuve, distributed.net a cassé un code DES-II 56 bits en 40 jours. La clef du code RC5-32/12/7 56 bits fut cassée en 250 jours.
Extreme Linux : Dérivée du projet Beowulf et en collaboration avec Red Hat, la Nasa et plusieurs centres de recherche, Extreme Linux est la première distribution de Linux en cluster. Celle-ci est directement issue de la distribution Red Hat modifiée pour le cluster de 160 stations Alpha utilisées pour certains effets spéciaux du film Titanic.
EN PRATIQUE
Dans les prochains chapitres, nous considérerons que votre réseau est correctement configuré et fonctionne parfaitement. Nous nous baserons sur un cluster de test composé de seulement trois PC. Ceci est suffisant dans le sens où l'ajout de nouveaux nodes au cluster existant n'est qu'une question de configuration réseau. Le cluster sera donc constitué de trois nodes respectivement nommés case, molly et gentry. Les trois PC fonctionnent avec un kernel 2.0.30 reconnu pour sa stabilité.
PVM
Une fois l'archive
de PVM récupérée, il convient de la compiler. La
version utilisée pour cet exemple est la 3.3.11. Pour compiler
cette version, il a été nécessaire de déclarer
deux variables PVM_ROOT et PVM_DPATH. PVM_ROOT pointe vers le répertoire
où a été décompacté PVM et PVM_DPATH
pointe sur le daemon lui-même. La commande utilisée pour
déclarer ces variables est la suivante :
PVM_ROOT=/pvm3
PVM_DPATH=$PVM_ROOT/lib/pvmd
export PVM_ROOT PVM_DPATH
Cette syntaxe peut différée en fonction de votre environnement
et de votre distribution.
Attention : Il est fortement conseillé de placer ces commandes
dans l'un des fichiers exécutés au démarrage car
elles sont également nécessaires au fonctionnement de PVM.
Dans notre cas précis (avec notre distribution Kheops 3.3), nous
avons ajouté ces lignes dans le fichier /etc/profile. Les sources
de PVM sont fournies pour être compilées sous plusieurs systèmes
d'exploitation différents. Il peut arriver qu'au moment de la compilation
un message vous informe que l'architecture UNKNOWN est introuvable. Ne
paniquez pas, éditez simplement le fichier /lib/pvm3getarch du
répertoire de PVM et remplacez ARCH=UNKNOWN par ARCH=LINUX.
Dans un cluster PVM, l'un des nodes est utilisé presque exclusivement pour la gestion du cluster. Il utilise l'utilitaire rsh pour exécuter des commandes sur les autres nodes comme le lancement du daemon par exemple. Il est donc impératif que l'utilisateur qui lance PVM bénéficie des droits suffisants sur rsh. Il faut, sur chaque node, créer un fichier .rhosts dans le répertoire privé de l'utilisateur choisi. Ce fichier devra contenir le nom des autres nodes ainsi que celui des utilisateurs. La syntaxe du fichier dépendra du nom d'identification des autres nodes. Exemple :
#Fichier .rhosts
de case
molly.dixieland.fr root
case.dixieland.fr root
gentry.dixieland.fr root
Dans cet exemple, la première ligne autorise l'utilisateur root en provenance de molly à utiliser les services de rsh. Cette ligne débute avec molly.dixieland.fr et non molly car lorsque l'utilisateur root se log sur case depuis molly et qu'il exécute la commande w il obtient ceci :
USER TTY
FROM LOGIN@ IDLE JCPU PCPU WHAT
root ttyp1 molly.dixieland.fr 10:40p 0.00s 0.16s
0.05s w
Donc case voit la machine sous le nom molly.dixielande.fr.
Le plus facile est
donc d'être root. Ceci permet d'avoir accès à tout
sans restriction. Il est donc naturel que cela fonctionne du premier coup.
C'est en pensant cela que nous avons rencontré un problème.
L'utilitaire rsh est controlé par inetd. Vous trouverez dans votre
fichier /etc/inetd.conf une ligne concernant in.rshd. ATTENTION, certaines
versions ont besoin du paramètre -h sur cette ligne. En cas d'absence
de ce paramètre, rsh refusera d'exécuter directement une
commande émise par l'utilisateur root. Ceci pour des raisons évidentes
de sécurité (mais il faut le savoir).
Une fois tous les nodes configurés selon ce principe, vous pouvez
procéder au premier test en tapant par exemple (depuis molly):
rsh case ls
Ceci devrait vous retourner la liste des fichiers présents sur
case. Si vous obtenez un message du type access denied, c'est que les
fichiers de configuration .rhosts ou inetd.conf ont une erreur. Vous pourrez
en savoir plus en consultant le journal du système (/var/log/messages).
Pour lancer PVM, placez vous dans son sous répertoire lib et tapez pvm. Vous vous retrouverez dans l'utilitaire de gestion du daemon pvmd. Celui-ci vous accueille amicalement par le symbole pvm>. Vous pourrez alors taper les commandes destinées à modeler et contrôler votre cluster. Par exemple, vous pourrez taper la commande conf qui vous informera sur la configuration actuelle de PVM. Dans notre cas, immédiatement après le lancement de la commande pvm, conf nous retourne :
HOST DTID ARCH SPEED
case 40000 LINUX 1000
Après avoir tapé la commande add molly destinée, comme son nom l'indique, à ajouter le node molly dans le cluster, conf nous retourne :
HOST DTID ARCH SPEED
case 40000 LINUX 1000
molly 80000 LINUX 1000
Notre cluster est
à ce moment constitué de deux nodes. Un coup d'oeil dans
le journal confirme le bon déroulement de l'opération :
Jul 15 00:12:48 molly rshd[110]: root@case.dixieland.fr as root: cmd='/pvm3/lib/pvmd
-s -d0 -nmolly 1 ac100101:04a5 4096 2 ac100102:0000'. Le daemon pvmd a
donc été parfaitement bien lancé sur molly depuis
case.
Si en revanche, vous obtenez de PVM, un message comme 0 successful molly
Can't start pvmd, vous devrez à nouveau vérifier toute votre
configuration.
Pour quitter PVM sans arrêter le cluster, tapez la commande quit. PVM confirmera par pvmd still running et vous pourrez à tout moment reprendre le contrôle en relançant pvm. Pour arrêter le pvmd et la gestion du cluster, utilisez la commande halt.
PVMPOV
PVMPOV est une version
modifiée de Pov-Ray 3.01. Celle-ci inclut les bibliothèques
de PVM et permet une utilisation de POV en clustering via pvmd. PVMPOV
est distribué sous la forme d'un patch non officiel pour Pov-Ray.
Vous devrez donc déjà être en possession des sources
de POV pour les systèmes Unix.
Après application du patch par la commande patch -s -p1 < pvmpov-3.1.patch
et recompilation de POV, vous obtiendrez selon vos choix pvmpov pour la
version non graphique, s-pvmpov pour la version svgalib et enfin x-pvmpov
pour la version Xwindow.
Ce ou ces exécutables devront être placés dans les
sous répertoires /bin/LINUX de PVM sur chaque node. PVMPOV pourra
être utilisé de manière classique comme POV mais il
se voit gratifié de paramètres supplémentaires. Les
deux nouveaux paramètres les plus importants sont :
+N activera le fonctionnement avec PVM
+NW et +NH permettent de définir respectivement une largeur et
une hauteur pour les cases de rendering à distribuer
Pour lancer un calcul
sur le cluster, il faut tout d'abord lancer PVM et ajouter tous les nodes.
Puis lancez le rendering par :
s-pvmpov +Iscript.pov +Oimage.tga +N +H480 +W640 +L/usr/lib/povray3/include
+D
Cette ligne provoque un calcul de script.pov en 640*480 par le cluster. Les fichiers includes de POV se trouve dans /usr/lib/povray3/include. Le résultat sera stocké dans image.tga et +D nous permettra de voir le rendering en svgalib.
Nous n'avons pas pu faire de capture de ce qui se passe sur l'écran, mais le spectacle est de taille. L'écran se trouve divisé en cellules de 32*32 qui sont calculées individuellement par les nodes.
Les résultats du cluster sont satisfaisants. Case (Cyrix P200+) seul calcule l'image en 17 minutes. Molly (Intel 133) met 14 minutes. Le cluster piloté par gentry (Amd DX4/100) met avec les nodes case et molly, seulement 7 minutes. Ce rendement pourrait encore être amélioré en utilisant des cartes réseaux plus performantes et non de simples compatibles NE2000 en BNC.