Académique Documents
Professionnel Documents
Culture Documents
Rapport
GRILLE & CLUSTER
Programmation parallèle
Gestion d'image système : SystemImager,
Gestion des ressources : Slurm,
Système de fichier parallèle : Lustre
Réalisé par:
xxxxxx
Samir ABDELLI.
II. Objectifs:
III.1.1 Définition :
La programmation parallèle consiste à exécuter simultanément plusieurs processus,
coopérant entre eux pour réaliser une tache donnée et cela consiste un mayeur utilisation du
processeur.
La programmation parallèle peut se faire de différentes manières :
• Sur la même machine avec un seul processeur partagé (mono processeur).
• Sur une machine ayant plusieurs processeurs (multi processeur).
• Sur des machines différentes interconnectées par un réseau de
communication, la synchronisation s’effectue par l’échange de messages.
III.1.3 OPENMP :
C’est est une interface de programmation portable, qui permet de faciliter le
développement des applications parallèles pour machines à mémoire partagée. OpenMP permet
de réaliser une parallélisassions incrémentale d'un code séquentiel en utilisant les primitives
FORK () et JOIN (). OpenMP nous permet de gérer l’ordre ainsi le regroupement des taches
(threads).
Avantage :
• Tout algorithme parallèle peut être exprimé en termes du paradigme MPI
• On peut l’appliquer en même temps sur des architectures à mémoire distribués et
partagée. La performance est généralement bonne dans les deux environnements
• Permet un contrôle explicite sur la communication, conduisant à un rendement élevé à
cause du chevauchement de communication et de calcul.
• MPI est portable.
• Les implémentations actuelles sont efficaces et optimisés.
Ici il suffit d’installer le système CentOS 5.3 avec l’image iso fournie dans trois machine
cluster0(serveur) et deux clients cluster1 et cluster2 suivant les indications du TD. Cluster2 sera installé
à partir d’une image de cluster1
Pour tester la résolution, on peut faire pinguer les autres machines avec leur nom.
ping cluster1
Ex :
Note : Dans ce qui suit, les commandes contiennent parfois les résultats de l’exécution de cette
commande et c’est dans le bit de pouvoir voir les différent paramètres et parfois encore les
options à saisir durant l’exécution de cette commande par l’utilisateur.
• Configuration ssh :
Pour ce faire, sur cluser0, se loguer en tant que « root » et créer une paire de clé via la
commande ssh-keygen -t rsa. Sera demande le dossier dans le quel créer les clés, laisser le dossier
par défaut (ce pendant on peut donner un chemin différent de celui pas défaut) puis une
passephrase ne rien mettre pour permettre la connexion ssh sans demande de mot de passe.
Une fois la paire de clé créée, il faut le synchronisé avec les autres nœuds via la
commande.
# ssh-coppy-id -i ~ /.ssh/id_rsa .pub root@cluster1 ou cluster2
Ex:
[root@cluster0 ~]# pdsh -w cluster[1-2] hostname
cluster2: cluster2
cluster1: cluster1
Exécution de la commande hostname sur les nœuds cluster1 et cluster2 en parallèle et affichage des
résultats de la commande (commande lancée à partir de cluster0)
• pdcp :
Permet d’effectuer des copies de fichiers et de répertoires en parallèle sur un ensemble de
systèmes distants.
pdcp –w cluster1, …, clusterx /etc/hosts /etc
Ex :
Permet de copier le fichier /etc/hosts à partir de server cluster0 vers un autre répertoire (/etc.) sur les
nœuds cluster1, …, clusterx et en parallèle.
Cette commande copie en parallèle dans le répertoire distant de cluster1 et cluster2 / root/Desktop le
fichier Cluster0.txt de répertoire /root/Desktop présents sur cluster0.
• dshbak :
Combiné avec pdsh pour formater et de consolider la sortie de plusieurs systèmes pour un
meilleur affichage à l’écran.
•
• [root@cluster0 distributed_shell]# rpm –i --rebuild pdsh-2.18-1.src.rpm
• [root@cluster0 RPMS]# ls
• [root@cluster0 i386]# ls
• pdsh-2.18-1.i386.rpm pdsh-mod-netgroup-2.18-1.i386.rpm
• pdsh-mod-dshgroup-2.18-1.i386.rpm pdsh-rcmd-exec-2.18-1.i386.rpm
• pdsh-mod-machines-2.18-1.i386.rpm pdsh-rcmd-ssh-2.18-1.i386.rpm
Puis on effectue le montage, sur le point de montage précédent, de la ressource /cluster/local (qui a
été exportée par cluster0
[root@cluster /]# mount -t nfs cluster0:/cluster/local /mnt/nfs
Le cluster1 pourra alors accéder au partage de cluster0
Syntaxe générale :
mount -t nfs nom-machine:arborescence point-montage
On peut tester ça on mettant un fichier (ou dossier) dans /cluster/local sur le cluster0 puis de vérifier
la présence de ce fichier(ou dossier) sur le montage local de cluster1(ou cluster2).
• Sur le serveur:
Exporter les partage NFS avec des droits de lecture (ro: read only) pour les nœuds clients
[root@cluster0 ~]# vi /etc/exports
/cluster/local cluster*(ro,no_root_squash,async)
/cluster/local 192.168.0.*/255.255.0.0(ro,no_root_squash,async)
Valider les changements
[root@cluster0 ~]# export -a
[root@cluster0 ~]# touch /cluster/local/helloWorld.txt
• Sur le client:
Ajout de montage automatique de partage NFS de cluster0 dans /mnt/nfs :
Ajouter la ligne « cluster0:/cluster/local /mnt/nfsl nfs defaults 0 0 » dans le fichier /etc/fstab
[root@cluster1 nfs]# vi /etc/fstab
/dev/VolGroup00/LogVol00 / ext3 defaults 11
LABEL=/boot /boot ext3 defaults 12
tmpfs /dev/shm tmpfs defaults 00
devpts /dev/pts devpts gid=5, mode=620 0 0
sysfs /sys sysfs defaults 00
proc /proc proc defaults 00
/dev/VolGroup00/LogVol01 swap swap defaults 00
/dev/cdrom /media/cd udf,iso9660 user,noauto 0 0
cluster0:/cluster/local /mnt/nfsl nfs defaults 0 0
Installer systemimager-common
• [root@cluster1 systemimager-4.1.6-1]# rpm -i systemimager-common-4.1.6-1.noarch.rpm
Installer systemimager-client
• [root@cluster1 systemimager-4.1.6-1]# rpm -i systemimager-client-4.1.6-1.noarch.rpm
• Installer systemimager-i386initrd_template
• [root@cluster1 systemimager-4.1.6-1]# rpm -i systemimager-i386initrd_template-4.1.6-1.noarch.rpm
•
• Prise d’une image golden :
• Préparation du client à prise d’une image :
• Sur Cluster0:
[root@cluster0 perl_module]# rpm -i perl-AppConfig-1.66-1.el5.rf.noarch.rpm
[root@cluster0 systemconfigurator-2.2.11-1]# rpm -i systemconfigurator-2.2.11-1.noarch.rpm
Installer systemconfigurator:
• Ajouter un groupe :
[root@cluster0 /]# si_clusterconfig -e
.....
<!--
Define your custom groups below (and remember to remove
or comment the previous entries if you don't want to use
them).
...
-->
<group>
<name>TP_HPC</name>
<priority>20</priority>
<image>centos_golden_client_image</image>
<override>centos_golden_client_image</override>
<node>cluster1,cluster2</node>
</group>
host cluster2{
fixed-address 192.168.0.3;
hardware ethernet 00:0C:29:22:07:0A;
option host-name "cluster2";
}
Après on lance la machine cluster2 qui va charger l'image de notre serveur (après
installation de l'image au login on saisi les mêmes informations de login que la machine à partir
du quelle on a créé l'image, c'est à dire cluster1).
On peut voir les échanges réseaux entre cluster0 (serveur) et nœud client (cluster2) avec
tcpdump à partir de serveur cluster0
• Le package rpm :
Package Manager (Red Hat Package manager ou RPM) est un système de gestion de
paquets de logiciels, permet d'installer, de désinstaller, de vérifier, d'interroger et de mettre à
jour des paquets logiciels.
La compilation et l'installation des éléments suivants a été déjà traité pour le serveur Cluster0
dans la partie ci-dessus et reste à faire la même chose pour les nœuds clients Cluster1 et Cluster2,
on procèdera de la même façon que Cluster0
•
• root@cluster1 rpm_generation]# rpm -ivh elfutils-0.137-3.el5.i386.rpm elfutils-libs-0.137-3.el5.i386.rpm rpm-build-
4.4.2.3-9.el5.i386.rpm
• Préparation... ########################################### [100%]
• 1:elfutils-libs ########################################### [ 33%]
• 2:elfutils ########################################### [ 67%]
• 3:rpm-build ########################################### [100%]
• root@cluster2 rpm_generation]# rpm -ivh elfutils-0.137-3.el5.i386.rpm elfutils-libs-0.137-3.el5.i386.rpm rpm-build-
4.4.2.3-9.el5.i386.rpm
• Préparation... ########################################### [100%]
• 1:elfutils-libs ########################################### [ 33%]
• 2:elfutils ########################################### [ 67%]
• 3:rpm-build ########################################### [100%]
• rpm-build elfutils elfutils-libs sont bien installés sur Cluster 1 et Cluster2
•
• root@cluster1 compilation]# rpm -ivh gcc-4.1.2-44.el5.i386.rpm glibc-devel-2.5-34.i386.rpm glibc-headers-2.5-
34.i386.rpm kernel-headers-2.6.18-128.el5.i386.rpm libgomp-4.3.2-7.el5.i386.rpm
• Préparation... ########################################### [100%]
• 1:kernel-headers ########################################### [ 20%]
• 2:libgomp ########################################### [ 40%]
• 3:glibc-headers ########################################### [ 60%]
• 4:glibc-devel ########################################### [ 80%]
• 5:gcc ########################################### [100%]
Les paquets gcc glibc-devel glibc-headers kernel-header libgomp sont bien installés sur Cluster1 et Cluster2
Installation des paquets OPENSSL, KRB5, ZLIB, E2FSPROGS, KEYUTILS, LIBSELINUX, et LIBSEPOL
[root@cluster0 crypto_ssl]# rpm -ivh openssl-devel-0.9.8e-7.el5.i386.rpm krb5-devel-1.6.1-31.el5.i386.rpm zlib-devel-1.2.3-
3.i386.rpm e2fsprogs-devel-1.39-20.el5.i386.rpm keyutils-libs-devel-1.2-1.el5.i386.rpm libselinux-devel-1.33.4-5.1.el5.i386.rpm
libsepol-devel-1.15.2-1.el5.i386.rpm
Préparation... ########################################### [100%]
1:libsepol-devel ########################################### [ 14%]
2:libselinux-devel ########################################### [ 29%]
3:keyutils-libs-devel ########################################### [ 43%]
4:e2fsprogs-devel ########################################### [ 57%]
5:zlib-devel ########################################### [ 71%]
:krb5-devel ########################################### [ 86%]
7:openssl-devel ########################################### [100%]
• Configuration de munge :
Génération de la clé de cryptage avec la commande dd :
A présent la clé munge.key est présentée sur Cluster0(le serveur), Cluster1 et Cluster2 (clients).
Donc munge est lancé automatiquement au boot de système avec les niveaux (runlevel)
35
Il existe 5 niveaux importants de runlevel :
- runlevel 0 : appelé lors de l'arrêt du système,
- runlevel 1 : appelé lorsque le système démarre en mono-utilisateur,
- runlevel 2 : correspond au mode de démarrage normal (sans NFS)
- runlevel 3 : appelé lorsque le système démarre en multiutilisateur (en réseau, NFS),
- runlevel 4 : non utilisé,
- runlevel 5 : appelé lorsque le système démarre en multiutilisateur, mode graphique,
- runlevel 6 : appelé lorsque le système reboote.
• Compilation de SLURM :
[root@cluster0 slurm]# ls
slurm-2.0.8.tar.bz2
Copie de slurm-2.0.8.tar.bz2 dans /usr/src/redhat/SOURCES/
[root@cluster0 slurm]# cp slurm-2.0.8.tar.bz2 /usr/src/redhat/SOURCES/
Accès au répertoire :
Les packages slurm, slurm-plugins et slurm-munge seront installés sur l'ensemble des nœuds de cluster
(Cluster0, Cluster1, et Cluster2). Et comme Cluster0 possède les rpms installables on fait:
• Configuration de SLURM :
Copier le fichier de l'exemple de configuration de slurm « slurm.conf. exemple » en « slurm.conf » :
•
• [root@cluster0 i386]# cp /etc/slurm/slurm.conf.example /etc/slurm/slurm.conf
•
Modifier le contenu de fichier slurm.conf (que dans les parties signalées):
•
• [root@cluster0 i386]# vi /etc/slurm/slurm.conf
• ControlMachine=cluster0
• #ControlAddr=
• #BackupController=
• #BackupAddr=
• SlurmUser=root
• #SlurmdUser=root
•
•
•
•
•
•
•
•
•
Synchronisation de fichier slurm.conf sur l'ensemble des nœuds (Cluster1 et Cluster2), les clusters
doivent avoir le même fichier de configuration slurm.conf
•
• [root@cluster0 i386]# pdcp –w cluster[1-2] /etc/slurm/slurm.conf /etc/slurm/
• slurm.conf 100% 1870 1.8KB/s 00:00
•
Maintenant, le démarrage de service slurm sur l'ensemble des nœuds de l'architecture de cluster :
• [root@cluster0 i386]# service slurm start
• starting slurmctld: [ OK ]
• [root@cluster0 i386]# pdsh –w cluster[1-2] service slurm start
• starting slurmctld: [ OK ]
Pour la mise à jour de l'état des nœuds on utilise la commande scontrol qui est utilisé pour voir et
modifier l'état et la configuration de Slurm :
•
• [root@cluster0 i386]# scontrol update NodeName=cluster[1-2] state=IDLE
• [root@cluster0 i386]# sinfo
• PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
• compute up infinite 2 idle* cluster[1-2]
•
Changement d'état des nœuds d’unk (UNKNOWN) à IDLE. Autres valeurs possibles de state:
"NoResp", "ALLOC", "ALLOCATED", "DOWN", "DRAIN", "FAIL", "FAILING",
"MAINT", "POWER_DOWN", "POWER_UP", ou "RESUME"
•
La commande srun de slurm permet d'exécutera un job en parallèle sur le cluster géré par
SLURM.
Etant donné que la configuration initiale est opérationnelle, on utilisera quelque service
offrent pas SLURM :
•
• Soumettre une tache avec srun:
Demander le hostname de chaque nœud :
E pour voir l’état des jobs dans la file des jobs « scheduler »
• [root@cluster0 i386]# squeue
• JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
• 37 debug hostname root R 0:11 1 cluster1
•
• [root@cluster0 i386]# squeue -v
• -----------------------------
• all = false
• format = (null)
• iterate = 0
• job_flag = 0
• jobs = (null)
• max_procs = 1
• nodes =
• partitions = (null)
• sort = (null)
• states = (null)
• step_flag = 0
• steps = (null)
• users = (null)
• verbose = 1
• -----------------------------
• Wed May 26 18:46:20 2010
• JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
• 37 debug hostname root R 0:08 1 cluster1
• Voir les informations de la partition debug :
• [root@cluster0 i386]# scontrol show hostnames cluster[1-2]
• cluster1
• cluster2
•
• [root@cluster0 i386]# scontrol
• scontrol: show part debug
• PartitionName=debug TotalNodes=2 TotalCPUs=2 RootOnly=NO
• Default=YES Shared=NO Priority=1 State=UP MaxTime=UNLIMITED Hidden=NO
• MinNodes=1 MaxNodes=UNLIMITED DisableRootJobs=NO AllowGroups=ALL
• AllocNodes=ALL
• Nodes=cluster[1-2] NodeIndices=0-1 DefaultTime=NONE
•
Le nœud serveur cluster0 gèrera les métadonnées du système de fichier. Il sera le nœud
MDS (Metadata Server) et MGS (Management Server).
Le nœud cluster1 gèrera les données du système de fichier. Il sera un nœud OSS (Object
Storage Server).
Sur les nœuds serveurs lustre (cluster0 et cluster1), les paquets suivants seront nécessaires :
• kernel-lustre-smp: noyau linux « patché » pour lustre
• lustre-module: module lustre pour un nœud « patché »
• lustre: outils de configuration
• lustre-ldiskfs: système de fichier support (ext3 optimisé pour lustre)
• e2fsprogs: outils de manipulation du système de fichier support optimisé
• Sur le cluster2 :
[root@cluster2 lustre]# ls
e2fsprogs-1.39-23.el5.i386.rpm
e2fsprogs-libs-1.39-23.el5.i386.rpm
kernel-lustre-smp-2.6.18-8.1.14.el5_lustre.1.6.3.i686.rpm
lustre-1.6.3-2.6.18_8.1.14.el5_lustre.1.6.3smp.i686.rpm
lustre-ldiskfs-3.0.2-2.6.18_8.1.14.el5_lustre.1.6.3smp.i686.rpm
lustre-modules-1.6.3-2.6.18_8.1.14.el5_lustre.1.6.3smp.i686.rpm
Le champ <fsname> : sert tout au long de la configuration à identifier globalement tous les
composants d'un même système de fichier.
mkfs.lustre : formater un disque pour un service Lustre
• Sur cluster0 :
Si on n’a pas ça donc il faut redémarrer avec le kernel-lustre ou bien modifier le contenu de
fichier de démarrage dans:
Laisser la ligne de kernel-lustre et mettre la ligne de l'ancien kernel en commentaire (précéder avec
#), il faut faire aussi attention à l'option default
Si la device était déjà formaté pour lustre on ajoute à la ligne l'option « --reformat»
Démarrer le MDT sur le nœud MDS :
mount -t lustre <block device name> <mount point>
Au sein de notre configuration, cluster1 remplit le rôle d'un serveur de donnée, OSS Object
Storage Server, hébergeant un OST, Object Storage Target.
Formater la device de donnée OST :
mkfs.lustre --fsname=<fsname> --mgsnode=<nid> --ost <block device name>
Pour le montage donc on exécutera la commande suivante (mount) sur le client (nœud cluster2) :
[root@cluster2 ~]# mkdir /mnt/lustre
[root@cluster2 ~]# mount -t lustre 192.168.0.1:/lustre /mnt/lustre/
Répartition de la taille de fichier créé par le client sur le nœud cluster2 de 50 mégaoctets sur
l'architecture :
[root@cluster2 ~]# lfs df -h
UUID bytes Used Available Use% Mounted on
lustre-MDT0000_UUID 87.5M 9.2M 78.3M 10% /mnt/lustre[MDT:0]
lustre-OST0000_UUID 93.7M 9.3M 84.4M 9% /mnt/lustre[OST:0]
lustre-OST0001_UUID 93.7M 59.3M 34.4M 63% /mnt/lustre[OST:1]
filesystem summary: 187.5M 68.6M 118.8M 36% /mnt/lustre
• Administrative quotas (pour MDT), qui contient les limites pour les utilisateurs et les
groupes de cluster.
• Opérationnel quotas (pour MDT et OST), qui contient les informations de quota dédié à
un nœud de cluster.
Configuration :
▪ Au formatage : mkfs.lustre --param mdt.quota_type=ug ug: user/group
IV. Conclusion Générale:
Ces travaux dirrigés nous ont permis de comprendre les techniques utilisés pour
l’implementation de la programmation paralléle; Threads, OPENMP, MPI en utilisant le langage
de programation C. Aussi on a pus aborder la notion de Cluster et de manipuler les outils
necessaire pour l’adminnistration des cluster (pdsh, SystemImager, rpm, munge, Slurm, Lustre).
Les Tps qu’on a fait nous ont été très utiles pour voir et comprendre la façon dont un
système informatique distribué et complexe, est installé, configuré et géré et de tirer profit de
toutes formes de ressource existante sur le matériel, logiciel, dans desi réseaux afin d’augmenter
la puissance de calcul et capacie de stockage. Notre réalisation est surtout basée sur des éléments
de cours et des ressources internet, cela ne nous a pas empêché à vouloir savoir plus sur un
domaine à la pointe, qui nécessite beaucoup de qualité de rigueur, et nous espérons que nous
avons développés certaines qualités en gestion et administration système.
La réalisation des projets nous a donnée une idée sur l’informatique de nuage (Cloud
Computing) qui est actuellement un concept de plus en plus répondu, où les données sont
distribuées, la puissance de calcul et l’espace de stockage sont offerts selon la demande. On
cherche plus où sont nos données physiquement ou quel processeurs utilise-t-on, l’essentiel c’est
de pouvoir y accéder à tout moment.
Bibliographie :
• Les brochures de TP
• Cours « Grille et Cluster » de Patrice Lucas
• Outils pdsh http://sourceforge.net/projects/pdsh/
• Site officiel de SystemImager http://wiki.systemimager.org
• Slurm https://www.scorec.rpi.edu/wiki/SLURM
• Site officiel de Lustre http://wiki.lustre.org/index.php
• Manuel Lustre http://wiki.lustre.org/manual/
• Site « Oracle-Sun » pour Lustre https://cds.sun.com
• Manuel Linux pour les commandes système