Systèmes distribués : Simgrid, maître-esclave versus vol

Transcription

Systèmes distribués : Simgrid, maître-esclave versus vol
Systèmes distribués : Simgrid, maître-esclave
versus vol de travail
Grégory Mounié
Ensimag - 3A ISI
Ce tp vise trois objectifs différents:
• d’une part, l’utilisation de la simulation comme outil scientifique. L’outil
de simulation utilisé sera Simgrid.
• de coder deux schémas génériques: un maître esclave et un vol de travail
• de faire l’étude du passage à l’échelle des deux algorithmes.
La documentation de Simgrid est disponible dans le répertoire file:////
usr/share/doc/simgrid .
1
Algorithmes
Nous cherchons ici à programmer deux algorithmes différents d’équilibrage de
charge dans le but de simuler (en partie) le projet développé dans ce cours
(exécution distribuée de Makefiles). L’un des algorithmes fonctionne de manière
centralisé. L’autre fonctionne de manière décentralisé.
Le schéma maître-esclaves classique distribue une tâche sur chaque machine.
Dès qu’une machine devient inactive, elle renvoie le fichier calculé sur le maître
qui lui distribue une nouvelle tâche, en réalisant au préalable les transferts de
tous les fichiers non présents sur la machine cible à partir du maître.
L’algorithme de vol de travail est implanté en ayant un fonctionnement plus
uniforme. Chaque worker possède une file d’attente des taches lui restant à
faire. Lorsqu’un worker est libre, il va voler du travail à l’un de ses voisins.
2
2.1
Les bases de Simgrid (MSG)
Les communications
Les communications utilisent la notion de task. Une task correspond à l’envoi
d’une quantité de travail et de données d’un noeud à l’autre. Pour faciliter la
programmation, un noeud n’a pas besoin de savoir à qui envoyer précisement la
donnée. Il va simplement nommer la boîte aux lettre. A la réception il suffit de
donner le même nom pour obtenir la task.
1
2.1.1
Exemple: un envoi entre deux processus
#include "msg/msg.h"
#include "xbt/log.h"
XBT_LOG_NEW_DEFAULT_CATEGORY(msg_test, "Mini SR");
int sender(int argc, char *argv[]) {
msg_task_t task = NULL;
task = MSG_task_create("LeNomDeLaTache", 1E9, 1E6, NULL);
MSG_task_send(task, "LeNomDeLaBoite");
return 0;
}
int receiver(int argc , char **argv) {
msg_task_t task=NULL;
MSG_task_receive(& task, "LeNomDeLaBoite");
MSG_task_execute(task);
XBT_INFO("Fin de la tache %s à %g", task->name, MSG_get_clock());
return 0;
}
int main(int argc, char **argv) {
MSG_init(& argc, argv);
MSG_create_environment("cluster.xml");
MSG_function_register("sender", sender);
MSG_function_register("receiver", receiver);
MSG_launch_application("application.xml");
int res = MSG_main();
return 0;
}
2.2
La plateforme
Un système autonome (AS) peut être décrit en donnant la caractéristique de
chaque machine. Mais, une plateforme homogène peut être décrite de manière
beaucoup plus concise.
2.2.1
Description d’une grappe (cluster.xml)
<?xml version=’1.0’?>
<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
<!-_________
|
|
| router |
____________|__________|_____________ backbone
|
|
|
|
|
|
l0| l1| l2|
l97| l96 |
| l99
2
|
|
|
c-0.me
|
........
|
|
|
|
c-99.me
-->
<platform version="3">
<AS id="AS0" routing="Full">
<cluster id="my_cluster_1" prefix="c-" suffix=".me"
radical="0-99" power="1000000000"
bw="125000000"
bb_bw="2250000000" bb_lat="5E-4"/>
</AS>
</platform>
2.3
2.3.1
lat="5E-5"
Le déploiement
Exemple de déploiement pour le code précédent (application.xml)
<?xml version=’1.0’?>
<!DOCTYPE platform SYSTEM "http://simgrid.gforge.inria.fr/simgrid.dtd">
<platform version="3">
<process host="c-0.me" function="sender"/>
<process host="c-1.me" function="receiver"/>
</platform>
3
Codage des deux algorithmes en MSG
Le travail consiste à exécuter 10000 tâches de 1 milliard de flop pesant chacune
1 Mo de données.
3.1
Le maître-esclave
Le processus maître envoie les données les unes après les autres aux esclaves
qui les exécutent. Une seule boîte au lettre et les appels bloquants de l’exemple
précédent devraient suffire.
3.2
Le vol de travail
Il va falloir modéliser un échange distribué de travail. Chaque worker réalise
une boucle de la forme suivante :
int ma_quantite_de_travail;
while(pas_fini) {
if ( ma_quantite_de_travail == 0 ) {
envoie_requete_vol( victime_au_hasard() );
t = recevoir_reponse();
ma_quantite_de_travail += t;
}
else {
if ( test_requete_vol() ) {
3
recevoir_requete_vol();
vol = ma_quantite_de_travail / 2;
ma_quantite_de_travail -= vol;
t = construire_tache(vol)
envoie_reponse( t );
reposter_requete_vol_asynchrone();
continue;
}
construire_tache_unitaire();
executer_tache_unitaire();
pas_fini--;
}
}
Vous pouvez "tricher" pour implanter le simulateur de votre algorithme par
exemple en utilisant une variable globale pour détecter la terminaison, etc.
Chaque processus aura besoin d’une boîte aux lettres. Vous utiliserez sprintf
pour contruire leur noms.
4
Expériences
À vous de réaliser vos expériences. Que remarquez-vous ? Ces conclusions vous
paraissent-elles explicables ? Quels sont vos paramètres d’expérimentations ?
Quels impacts ont-ils sur vos conclusions ? Quelle confiance avez-vous dans vos
conclusions ? Pourriez-vous expliquer à quelqu’un comment refaire ces expériences et obtenir des résultats similaires ?
4

Documents pareils