Émulation des systèmes pair-à-pair

Transcription

Émulation des systèmes pair-à-pair
Laboratoire
Informatique et
Distribution
Émulation des systèmes pair-à-pair
Lucas Nussbaum
sous la direction de
Olivier Richard
Membres du jury :
Joëlle Coutaz
Yves Denneulin
Jérôme Euzenat
Noël De Palma
Juin 2005
2
Émulation des Systèmes pair-à-pair
Lucas Nussbaum
sous la direction de
Olivier Richard
{lucas.nussbaum,olivier.richard}@imag.fr
Laboratoire ID-IMAG
Montbonnot St Martin, Isère
Résumé
Maintenant utilisés pour des applications très diverses, les systèmes pair-à-pair sont difficiles à étudier du fait de leur complexité.
Entre la simulation à partir d’un modèle, et l’exécution sur un système réel, l’émulation (exécution de l’application réelle dans un environnement synthétique) permet souvent d’obtenir des résultats à
un moindre coût.
Nous proposons un système d’émulation léger (permettant d’émuler un grand nombre de noeuds virtuels sur un faible nombre de
noeuds physique), passant bien à l’échelle, et particulièrement adapté
à l’émulation des aspects réseaux des systèmes pair-à-pair. Après
avoir vérifié la validité des résultats obtenus par cette approche, nous
avons avons utilisé cette technique pour étudier quelques aspects du
système d’échange de fichiers BitTorrent.
Mots clés : Émulation, réseau, systèmes pair-à-pair
4
Table des matières
Remerciements
7
1
Introduction et problématique
9
2
Outils d’étude des systèmes pair à pair
11
2.1
Caractéristiques attendues d’un émulateur . . . . . . . . . . . . . . . . . . . .
11
2.2
Outils de simulation existants . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.3
Outils d’émulation existants . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.3.1
Outils d’émulation réseau . . . . . . . . . . . . . . . . . . . . . . . . . .
12
2.3.2
Outils d’émulation de système . . . . . . . . . . . . . . . . . . . . . . .
17
2.3.3
Outils d’émulation de systèmes distribués . . . . . . . . . . . . . . . .
18
Systèmes réels dédiés à l’expérimentation . . . . . . . . . . . . . . . . . . . . .
20
2.4
3
4
P2PLab : un système d’émulation léger
21
3.1
Particularités de l’émulation des systèmes pair-à-pair . . . . . . . . . . . . . .
22
3.1.1
Impact sur le système . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
3.1.2
Aspects réseaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
22
3.1.3
Applications limitées par le processeur ou par le réseau . . . . . . . . .
23
3.2
P2PLab : présentation générale . . . . . . . . . . . . . . . . . . . . . . . . . . .
23
3.3
Émulation du réseau avec P2PLab . . . . . . . . . . . . . . . . . . . . . . . . .
23
3.4
Affectation d’adresses IP aux processus . . . . . . . . . . . . . . . . . . . . . .
25
Évaluation de l’émulation avec P2PLab
29
4.1
Étude de la faisabilité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
4.1.1
Passage à l’échelle du nombre de processus . . . . . . . . . . . . . . . .
29
4.1.2
Équité entre processus . . . . . . . . . . . . . . . . . . . . . . . . . . . .
31
Émulation du réseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
4.2
5
4.3
5
6
Affectation d’adresses IP aux processus . . . . . . . . . . . . . . . . . . . . . .
33
Émulation avec P2PLab : expériences
35
5.1
Émulation d’une topologie réseau complexe . . . . . . . . . . . . . . . . . . .
35
5.2
Étude de BitTorrent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
5.2.1
Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
35
5.2.2
Validité des résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
5.2.3
Passage à l’échelle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
37
5.2.4
Super-seeding et autres techniques pour accélérer la diffusion . . . . .
38
Conclusion et perspectives
41
Remerciements
Je tiens tout d’abord à remercier Olivier Richard, qui m’a donné
la possibilité de mener cette étude au sein du laboratoire Informatique et Distribution, de son encadrement précieux et du temps qu’il
a eu l’amabilité de me consacrer.
Je remercie également l’ensemble des membres du laboratoire
pour leur accueil chaleureux, et pour les conseils et les explications
qu’ils ont su me fournir.
Enfin, je remercie les rapporteurs et membres du jury qui me font
l’honneur de juger ce travail.
7
8
Chapitre 1
Introduction et problématique
La puissance de calcul et les connexions à Internet disponibles sur les ordinateurs personnels ont atteint des niveaux qui étaient réservés il y a quelques années encore aux centres
de calcul. Afin d’exploiter ces ressources inutilisées la plupart du temps, un nouveau type
d’applications a émergé : les applications distribuées, ou systèmes pair à pair.
Les systèmes pair à pair ont d’abord été utilisés pour du calcul (Distributed.net, SETI@home,
puis BOINC et XtremWeb [1]) et du partage de fichiers (Freenet [2], Napster, Kazaa, ...), mais
ils sont maintenant utilisées dans des domaines bien plus divers, comme la voix sur IP [3]
ou la messagerie instantanée.
Le développement, la mise au point et l’étude des systèmes pair à pair est difficile. Il faut
pouvoir évaluer le comportement d’applications ou d’algorithmes sur des milliers de machines fortement hétérogènes, alors qu’on dispose en général d’un nombre bien plus réduit
de machines, le plus souvent homogènes.
Quatre méthodes sont actuellement utilisées pour étudier les systèmes pair à pair :
–
–
–
–
la modélisation mathématique ;
la simulation ;
l’émulation ;
l’exécution sur système réel.
La modélisation mathématique consiste à mettre en équation le système à étudier. Cette
approche permet d’étudier certaines propriétés du système, comme l’aptitude au passage à
l’échelle par exemple, mais elle reste assez limitée dans le cas général.
La méthode de simulation est celle qui a fait l’objet du plus de recherche. Elle est assez
fiable quant aux résultats fournis. Elle consiste à utiliser un modèle mathématique ou une
représentation du code dans un environnement synthétique. Toutes les composantes de l’environnement sont complètement contrôlées et reproduites au sein du simulateur. Le principal avantage de cette approche est d’être indépendante du matériel disponible, puisque tout
est entièrement modélisé dans le simulateur. Par contre, il faut proposer le système à étudier
sous un modèle compréhensible par le simulateur. Et plus la modélisation est précise, plus
la simulation sera coûteuse : il est donc important de vérifier que les simplifications nécessaires ne nuisent pas à la représentativité des résultats obtenus. En outre, les simulateurs
gérant leur propre évolution du temps, en général conduite par des événements, il n’est pas
9
possible de faire des simulations en temps réel.
A l’opposé de la simulation, on peut exécuter le système à étudier sur un système réel.
Dans ce cas, on dispose directement de l’environnement à modéliser, mais les conditions
d’expérience sont évidemment limitées par le matériel disponible.
L’émulation est une solution intermédiaire entre la simulation et l’exécution sur système
réel. Elle consiste à exécuter réellement l’application à étudier en lui présentant un environnement synthétique. Le réalisme de l’émulation dépend donc directement de la qualité de la
modélisation de l’environnement. Les conditions d’émulations dépendent partiellement de
la plate-forme utilisée, mais un environnement de laboratoire permet en général de reproduire une très large gamme de conditions d’expérience.
Au cours de ce stage, mon objectif sera d’étudier la faisabilité d’un système d’émulation léger de systèmes pair à pair, permettant d’émuler un grand nombre de noeuds. Nous
commencerons par présenter l’état de l’art de la simulation et surtout de l’émulation (chapitre 2), puis nous proposerons un système d’émulation, P2PLab, (chapitre 3) et vérifierai
ses propriétés (chapitre 4), avant de l’utiliser pour examiner quelques aspects du système
pair-à-pair d’échange de fichiers BitTorrent (chapitre 5).
10
Chapitre 2
Outils d’étude des systèmes pair à pair
2.1 Caractéristiques attendues d’un émulateur
On attend les caractéristiques suivantes d’un émulateur :
Bon rapport machines émulées/machines physiques : L’émulation doit être efficace : l’émulateur doit permettre d’émuler un grand nombre de machines virtuelles sur un faible
nombre de machines physiques.
Faible surcoût dû à l’émulation : L’émulation ne doit pas provoquer de distorsion des résultats par rapport à une exécution sur machine physique. Son surcoût doit être suffisamment faible pour mettre une émulation efficace.
Bonne aptitude au passage à l’échelle : L’émulateur doit permettre d’augmenter facilement
le nombre de systèmes virtuels émulés, en augmentant simplement le nombre de systèmes physiques.
Accès équitable et paramétrable aux ressources : L’émulateur doit permettre de reproduire
une grande variété de conditions d’expérience différentes. Il doit, si l’expérimentateur
le désire, garantir l’équité entre les systèmes virtuels.
Utilisation d’applications sans modification, dans un environnement virtuel : L’émulateur
doit permettre d’utiliser des applications sans les modifier, ou en se contentant de modifications triviales.
Reproductibilité des expériences : L’émulateur doit permettre de faire des expériences reproductibles, notamment afin d’affiner les mesures.
Utilisabilité : L’utilisabilité de l’émulateur doit être bonne. La mise en place de l’environnement d’émulation et son paramétrage ne doivent pas être trop fastidieux. De plus, cette
procédure de configuration doit rester simple lorsque le nombre de noeuds à configurer est important (bon passage à l’échelle).
Bien sûr, il est impossible de satisfaire toutes ces caractéristiques simultanément. Les
solutions d’émulation existantes sont donc toutes des compromis entre ces différentes caractéristiques.
11
2.2 Outils de simulation existants
Network Simulator (NS)
NS2 [4] est un simulateur Open Source à événements discrets destiné à la simulation de
protocoles réseaux. Il permet la simulation du routage et de protocoles IP comme UDP ou
TCP sur des réseaux câblés, sans-fil ou satellites. NS2 permet de choisir le niveau d’abstraction désiré en définissant la granularité de la simulation. Il inclut également une interface
d’émulation permettant d’échanger du trafic réel entre un réseau réel et le simulateur.
Le principal inconvénient de NS2 est qu’il ne permet pas de passer correctement à l’échelle.
En effet, la seule manière de réaliser une simulation à grande échelle est de diminuer la granularité.
SimGrid
SimGrid [5] est à la fois un simulateur et un outil de développement de simulateurs à
agents ou à événements discrets. Il a principalement été conçu avec l’objectif de simuler des
applications de type grille, en mettant l’accent sur les problèmes d’ordonnancement.
MaSSF
MaSSF [6] est un simulateur de réseaux à événements discrets. Pour permettre un excellent passage à l’échelle, il utilise un moteur de simulation distribué tournant sur une
grappe. A partir d’une topologie de réseau à simuler et d’un ensemble de noeuds, MaSSF
partitionne le réseau virtuel en plusieurs blocs, assigne les blocs à des noeuds de la grappe, et
simule en parallèle. Chaque noeud de la grappe utilise un simulateur à événements discrets
et échange des événements avec les autres noeuds. Pour conserver une simulation réaliste,
les noeuds se synchronisent périodiquement.
MaSSF utilise une interface de configuration similaire à celle d’un simulateur de réseaux
écrit en Java, SSFNet. MaSSF est utilisé dans Microgrid (voir 2.3.3 page 19).
p2psim
p2psim [7] est un simulateur à événements discrets multi-threadé permettant d’étudier
des protocoles pair-à-pair. Il fait partie du projet IRIS. p2psim permet d’écrire des implémentations des algorithmes d’une manière très compréhensible et sensiblement plus condensée
que les implémentations réelles. Plusieurs protocoles sont déjà supportés par p2psim.
2.3 Outils d’émulation existants
2.3.1 Outils d’émulation réseau
On attend d’un outil d’émulation réseau les fonctionnalités suivantes :
12
– ajout de délai et de gigue suivant une distribution paramétrable (fixe, loi normale, loi
gamma) ;
– limitation de la bande passante ;
– simulation de congestion (tailles de queue limitées sur les routeurs) ;
– simulation de perte de paquets, de duplication de paquets, et de déséquencement.
Bien entendu, les autres caractéristiques attendues d’un émulateur (section 2.1 page 11)
s’appliquent également aux outils d’émulation réseau.
NIST Net
NIST Net [8] est un émulateur de réseau développé par le National Institute of Standards
and Technology. Il fonctionne sous Linux 2.4 et se place dans le noyau entre le pilote réseau
et la couche IP (figure 2.1 page suivante). Il permet d’agir sur les paquets en rajoutant du
délai et de la gigue, en limitant la bande passante, en simulant de la congestion, des pertes
de paquets et de la duplication de paquets.
Il dispose donc de toutes les fonctionnalités que nous souhaitions trouver.
Toutefois, NIST Net présente plusieurs problèmes :
– Il n’est plus activement maintenu (la dernière mise-à-jour date de 2002) ;
– Il ne fonctionne qu’avec les versions 2.0, 2.2 et 2.4 de Linux ;
– Le support SMP ne fonctionne pas avec le noyau que nous avons utilisé (2.4.27). Certaines indications font penser qu’il ne fonctionne que jusqu’à Linux 2.4.23 ;
– Il ne permet d’agir que sur les paquets entrants dans le système, et non sur les paquets
sortants.
Cette dernière limitation est très gênante : dans le cadre de l’émulation de systèmes pair à
pair, nous allons souvent souhaiter émuler de nombreuses configurations différentes. Même
si des optimisations sont possibles, le fait de ne pouvoir agir que sur les paquets entrants
oblige à avoir une règle de traitement par couple de noeud virtuel (complexité en O(n 2 )).
Cela n’est bien entendu pas souhaitable dans le cas d’un émulateur dont un des objectifs
principaux est le passage à l’échelle.
Nous avons tout de même cherché à vérifier la manière dont NIST Net passait à l’échelle.
Ces expériences ont été menées sur un bi-Xeon 2.4 GHz avec 1 Go de mémoire vive. Toutefois, un seul processeur était utilisé (noyau non-SMP) comme NIST Net ne supporte plus le
SMP. Le logiciel utilisé pour le test était un petit programme C réalisant un anneau à jeton.
Nous avons cherché à caractériser le surcoût attribuable à NIST Net (figure 2.2 page 15).
Les résultats ne sont pas encourageants, d’autant plus que, lors de nos tests, nous avons
constaté qu’il n’était apparemment pas possible de configurer plus de 260000 règles (soit le
nombre de règles nécessaires à l’émulation d’un peu plus de 500 machines, si l’on décrit la
liaison entre chaque couple de noeuds).
Netem
Écrit par Stephen Hemminger (Open Source Development Labs), Netem [9] est le successeur de NIST Net dans Linux. Intégré à Netfilter, il était initialement destiné uniquement
13
Code de l’application
User level
Kernel level
NIST Net :
Couche Socket
− interception des paquets
− sélection des paquets à
partir de règles
Couche IP
− gestion d’une horloge à
fréquence élevée basée
sur la RTC
− traitement des paquets
RTC
(perte, duplication)
− réordonnancement des
paquets
Driver réseau
Réseau
F IG . 2.1 – Architecture de NIST Net : les paquets entrants sont redirigés
au niveau du driver réseau vers NIST Net avant d’être réinjectés dans
la couche IP.
à rajouter du délai, mais il a évolué vers une solution plus complète. Il permet actuellement
d’émuler un délai variable, des pertes de paquets, de la duplication de paquets, et du réordonnancement de paquets. Il ne permet pas de faire directement de la limitation de bande
passante : pour cela, il faut utiliser les autres outils disponibles dans Netfilter.
Toutefois, il ne permet d’agir que sur les paquets sortants du système, ce qui pose les
mêmes problèmes de passage à l’échelle que NIST Net. De plus, il n’a pas encore été validé
scientifiquement.
14
8
120
Linux 2.4 avec NISTNet et 250000 regles
Linux 2.4 avec NISTNet sans regles
Linux 2.4 sans NISTNet
7
Linux 2.4 avec NISTNet et 250000 regles
Linux 2.4 avec NISTNet sans regles
Linux 2.4 sans NISTNet
100
6
80
temps (s)
temps (s)
5
4
3
60
40
2
20
1
0
100
0
200
300
400
nb de noeuds
500
600
0
200
400
600
800
1000
nb de noeuds
1200
1400
F IG . 2.2 – Passage à l’échelle de NIST Net (respectivement jusqu’à 600
et 1600 machines) : nous mesurons le temps nécessaire pour qu’un jeton
parcoure un anneau.
Dummynet
Dummynet [10] est un « shaper de trafic IP » disponible sur FreeBSD. Développé à l’origine par Luigi Rizzo pour tester des connexions TCP, il fut ensuite étendu pour supporter
tous les protocoles IP. Dummynet est intégré dans le firewall de FreeBSD IPFirewall (ipfw).
Dummynet est généralement utilisé comme limiteur/régulateur de bande passante en
sortie d’un réseau local. Ainsi, certains trafics peuvent être rendus prioritaires par rapport
à d’autres. Mais il peut aussi être utilisé comme un puissant émulateur de réseau. Il permet
d’agir sur les paquets entrants ou sortants du système :
–
–
–
–
en limitant la bande passante,
en rajoutant du délai,
en simulant des pertes de paquets,
en simulant de la congestion (les queues sont de taille limitée).
Par rapport à NIST Net, il lui manque quelques fonctionnalités :
– le délai rajouté est fixe et non variable,
– il ne permet pas de simuler de la duplication de paquets, ou du réordonnancement.
Par contre, Dummynet a été bien plus utilisé, et est donc bien mieux validé scientifiquement (voir par exemple [11]).
Delayline
Delayline [12] est un outil d’émulation au niveau applicatif. Il s’agit d’une bibliothèque
permettant d’intercepter les appels systèmes comme send() ou recv() (figure 2.3 page suivante). Delayline permet ainsi d’émuler des pertes de paquets et de rajouter du délai suivant
une certaine distribution (fixe, de loi normale, ou de loi gamma).
Delayline utilise une technique intéressante pour ajouter du délai dans les transmissions
15
1600
Code de l’application
Delayline
Bibliothèques utilisées
Routines d’appels systèmes dans la libc
Noyau
F IG . 2.3 – Delayline : les appels systèmes (send(), recv()) sont interceptés par une bibliothèque
de paquets. En effet, il n’est pas possible de manière simple de rajouter du délai lors de
l’émission des messages. Delayline déporte donc le traitement du délai au récepteur : lors
de l’émission du message, l’émetteur ajoute au message une signature indiquant quand le
message devra être délivré. Le message est ensuite transmis immédiatement au récepteur,
mais celui-ci ne le délivrera à l’application que lorsque le délai souhaité aura été écoulé.
Cette approche fonctionne très bien, avec un surcoût assez faible, et permet de réaliser
une émulation très précise. Par contre, comme nous le verrons plus loin, elle ne fonctionne
pas avec toutes les applications, et elle est compliquée à mettre en oeuvre puisqu’il faut
intercepter de nombreux appels de bibliothèque.
Interceptor
Interceptor [13] est une plate-forme d’émulation développée par Stefano Cacciaguerra
pendant sa thèse à l’université de Bologne. Interceptor simule un environnement, permettant
d’intégrer des systèmes réels (et leurs applications) dans un environnement complètement
synthétique. Interceptor est composé de 4 éléments :
– une interface d’émulation, chargée de l’échange de paquets IP entre Interceptor et des
vrais systèmes ;
– un gestionnaire d’événements basé sur un modèle de simulation déterminé ;
– un gestionnaire de topologie réseau ;
– un générateur de trafic.
L’interface d’émulation utilise directement des appels à Iptables pour détourner les paquets et les réinjecter.
16
NetBed
NetBed [14] est la suite d’Emulab, un projet qui visait à faciliter la configuration et le
contrôle d’expériences sur des topologies réseau émulées. NetBed y intègre de la simulation
et de la distribution. NetBed permet ainsi de réaliser des expériences sur des topologies
réseaux complexes en intégrant :
– des noeuds simulés à l’aide de l’interface d’émulation de Network Simulator ;
– des noeuds dont le réseau est émulé à l’aide de Dummynet ;
– des noeuds réels utilisant différents types de connexions à Internet (ADSL, cable, RTC).
WAN In Lab
WAN In Lab [15] est un projet commun au Caltech et à la société Cisco. À mi-chemin
entre système réel et émulation, ce projet a pour but de créer un environnement d’expérimentation en réseau à l’échelle planétaire, contenant des équipements très divers allant de
périphériques Bluetooth aux plus gros routeurs Cisco. WAN In Lab permet de faire des expériences reproductibles dans un environnement paramétrable et évolutif. La surveillance
totale du réseau permet de détecter et résoudre des problèmes facilement.
2.3.2 Outils d’émulation de système
User Mode Linux
User Mode Linux (UML) [16] est un portage du noyau Linux vers une autre architecture : un processus Linux. Avec User Mode Linux, le noyau du système émulé est en fait
représenté sur le système hôte par un ou plusieurs processus. Une machine virtuelle UML
fonctionne d’une manière totalement transparente pour l’utilisateur, et est capable de faire
tourner exactement les mêmes processus que le système hôte. Un utilisateur n’a pas besoin
de privilèges particuliers pour faire tourner une machine virtuelle UML. D’une manière interne, UML fonctionne en interceptant tous les appels systèmes à l’aide de ptrace(). Au lieu
de laisser le système hôte exécuter l’appel système lui-même, UML l’exécute directement.
UML utilise son propre système de mémoire virtuelle, et a son propre ordonnanceur.
Malheureusement, la surcharge induite par User Mode Linux rend cette solution difficilement utilisable dans le cadre d’un émulateur léger : le nombre de machines émulées
serait trop faible. De plus, User Mode Linux est encore en plein développement, et a montré
quelques problèmes d’instabilité.
VServer
VServer [17] est un patch du noyau Linux lui ajoutant la gestion de Security Contexts,
qui permettent de diviser l’ensemble des processus en classes. On assigne à chaque système
virtuel VServer un context différent.
Les contextes permettent de cacher les processus qui ne sont pas dans le même contexte
et d’interdire les interactions entre processus de contextes différents. Concernant le réseau,
17
VServer permet de lier un contexte à une adresse IP particulière.
Benjamin Quétier a montré dans Emugrid [18] que VServer était bien adapté à la réalisation d’un émulateur de grappes ou grilles. Mais son support de l’équité entre systèmes
virtuels reste limité, et insuffisant dans le cadre de l’émulation de systèmes pair-à-pair, où
on souhaite pouvoir émuler des environnements très différents avec précision.
Xen
Xen [19] est un système de virtualisation libre développé par l’université de Cambridge,
ayant pour objectif de faire tourner jusqu’à 100 systèmes d’exploitation complets sur un seul
ordinateur. Les systèmes d’exploitation doivent être modifiés (portés) pour fonctionner audessus de Xen (figure 2.4). Cette technique, appelée para-virtualisation, permet d’obtenir
d’excellentes performances (surcoût de l’ordre de 8% dans le pire cas).
Logicels de controle Xen
Xeno−Linux
Drivers Xen
User−space
Linux
Drivers Xen
User−space
FreeBSD
Drivers Xen
Xen
Matériel
F IG . 2.4 – Architecture de Xen : les systèmes d’exploitation émulés
doivent être modifiés pour fonctionner au-dessus d’une architecture
spécifique.
Un support de la virtualisation au niveau du processeur (comme dans les systèmes LPAR
d’IBM, ou les projets Vanderpool d’Intel et Pacifica d’AMD) permet de faire tourner des
systèmes sans modification, et avec un surcoût moindre.
2.3.3 Outils d’émulation de systèmes distribués
ModelNet
ModelNet [20] est un système d’émulation permettant de déployer des applications non
modifiées dans un environnement d’émulation paramétrable reprenant les caractéristiques
d’Internet. Modelnet partitionne les machines disponibles en deux groupes (figure 2.5 page
ci-contre) :
– Les edge nodes exécutent un certain nombre d’instances de l’application cible sur un
système d’exploitation laissé au choix de l’utilisateur. Chaque instance est appelée un
virtual edge node.
– Les ModelNet core nodes coopèrent pour soumettre le trafic à des contraintes de bande
passante, de latence et de perte de paquets.
Les auteurs de ModelNet se sont intéressés à différentes techniques permettant de réaliser un compromis entre exactitude et coût. En effet, ModelNet permet d’effectuer une ému18
Edge nodes
SWITCH
Modelnet Core
SWITCH
F IG . 2.5 – Architecture de Modelnet : les noeuds disponibles sont utilisés pour exécuter l’application cible (edge nodes ) ou pour émuler une
topologie réseau complexe (Modelnet core ).
lation extrêmement précise d’Internet avec un nombre de noeuds importants dans le ModelNet core.
Mais si on dispose d’un nombre plus faible de noeuds, on peut simplifier la topologie du
réseau lors de la phase de Distillation. On crée alors un maillage entre certains noeuds du
Modelnet core pour réduire le nombre de sauts nécessaires.
MicroGrid
MicroGrid [21] est un émulateur de grilles statiques permettant d’émuler des applications Globus sans modification.
Un premier problème est de virtualiser l’identité de la machine. Les appels de bibliothèque comme gethostbyname, bind, send, receive sont donc interceptés. La simulation des
ressources processeur se fait à l’aide d’un ordonnanceur round-robin, les tranches de temps
étant calculées en fonction de la vitesse de simulation désirée.
Concernant l’émulation réseau, deux approches ont été explorées. Tout d’abord, NS2
19
(voir 2.2 page 12) a été essayé, mais il ne permettait pas de passer à l’échelle correctement.
MaSSF [6] a alors été développé (voir 2.2 page 12).
D’une manière générale, MicroGrid se distingue des autres solutions d’émulation par
son soucis de conserver un réalisme très important au détriment du coût de l’émulation. Il
s’agit d’une approche à mi-chemin entre simulation et émulation.
2.4 Systèmes réels dédiés à l’expérimentation
PlanetLab
PlanetLab [22] est une plate-forme globalement distribuée d’environ 500 noeuds permettant de développer et déployer des services à l’échelle planétaire. Les noeuds de PlanetLab sont virtualisés à l’aide de VServer et Xen. Toutefois, sa taille limitée et la nonreproductibilité des expériences liée à son architecture dynamique peut poser problème pour
certaines expériences.
Grid5000
Grid5000 [23] est un projet visant à créer une plate-forme de grille expérimentale rassemblant 10 laboratoires français, permettant de réaliser des expériences à tous les niveaux, des
protocoles réseaux aux applications en passant par les middlewares pour grilles.
L’objectif à court terme est d’assembler une plate-forme physique rassemblant 9 grappes,
chacune comprenant de 100 à un millier de PCs, connectés par le réseau Renater. Cette plateforme inclut Grid Explorer, un instrument dédié à l’expérimentation de 500 processeurs.
Toutes les grappes sont connectées entre elles par un réseau gigabit.
20
Chapitre 3
P2PLab : un système d’émulation léger
La plupart des systèmes d’émulation existants tentent de parvenir à une émulation très
précise, au détriment du nombre de machines émulées (figure 3.1). Nous allons explorer
quelques voies permettant d’obtenir une émulation un peu moins précise, mais à un coût
beaucoup plus faible, afin d’obtenir une émulation plus efficace (meilleur rapport nombre
de machines émulées / nombre de machines physiques).
log(coût)
Vrais systèmes
Vraies applications
Plateformes de laboratoire
Conditions synthétiques
Modélisation des :
Systèmes
Applications
Plateformes
Conditions
Vrais systèmes
Vraies applications
Vraies plateformes
Vraies conditions
Mécanismes clés des systèmes (Algorithmes...)
Plateformes virtuelles
Conditions synthétiques
log(réalisme)
Modélisation
mathématique
Simulation
Émulation
Systèmes réels
F IG . 3.1 – Modélisation, simulation ou émulation : un compromis entre
réalisme et coût
21
3.1 Particularités de l’émulation des systèmes pair-à-pair
Au chapitre précédent, nous avons présenté les solutions d’émulation de systèmes distribués en général, et en particulier les solutions ciblant l’émulation d’applications sur grilles
de calcul. La problématique est un peu différente lorsqu’on s’intéresse à l’émulation des systèmes pair-à-pair.
3.1.1 Impact sur le système
Les applications de type grille ont en général un déploiement compliqué et sont très
dépendantes de leur environnement (bibliothèques utilisées, version du noyau, ...). Pour
émuler ce genre d’applications, la solution la plus simple est donc souvent d’émuler l’environnement d’un système entier, noyau compris.
Les applications pair-à-pair, au contraire, sont moins intrusives, car conçues pour être
déployées à travers le monde dans des environnements très hétérogènes. Ces applications
sont en général contenues dans un seul processus, et émuler l’environnement de ce processus
est suffisant.
3.1.2 Aspects réseaux
Les grilles de calcul disposent en général d’une très bonne connectivité entre elles (latence faible et débit important). Il est donc nécessaire d’émuler précisément les connexions
entre les grappes.
Dans le cas des réseaux pair-à-pair, les noeuds sont situés sur des ordinateurs personnels,
sur les bords d’Internet [24], avec une connectivité relativement faible (latence assez importante et débit peu important, par rapport aux débits disponibles dans le coeur d’Internet)
(figure 3.2).
Internet Core
Edges
F IG . 3.2 – Les noeuds de systèmes pair-à-pair sont en général situés en
bordure d’Internet
22
On peut aussi traiter séparément deux caractéristiques des réseaux à émuler :
– le débit disponible, qui est spécifique à un noeud ;
– la latence, qui est souvent commune à un ensemble de noeuds (par exemple, tous les
noeuds du fournisseur d’accès A par rapport aux noeuds du fournisseur d’accès B, ou
tous les noeuds européens par rapport aux noeuds d’Amérique du Nord)
3.1.3 Applications limitées par le processeur ou par le réseau
Les applications pair-à-pair peuvent être séparées en deux catégories :
– les applications qui sont limitées par le temps processeur disponible (les applications
de Global Computing, par exemple) ;
– les applications qui sont limitées par les caractéristiques du réseau (débit ou latence).
Les applications limitées en même temps par ces deux critères sont très rares : dans le
cadre de l’émulation, il est envisageable de distinguer ces deux cas afin de leur appliquer un
traitement différent.
3.2 P2PLab : présentation générale
P2PLab a pour objectif de fournir une émulation légère (très bon rapport nombre de
noeuds virtuels / nombre de noeuds physiques) sans trop sacrifier le réalisme de l’émulation. P2PLab fonctionne sur FreeBSD, qui a l’avantage de disposer d’outils d’émulation
reconnus (Dummynet), et d’être assez simple à prendre en main et à modifier.
Contrairement à beaucoup d’autres systèmes d’émulation, P2PLab se place au niveau
processus :
– Comme nous l’avons montré précédemment, c’est suffisant dans le cadre des systèmes
pair-à-pair.
– Cela permet un gain d’efficacité important, puisque nous n’avons pas besoin d’exécuter un noyau par noeud virtuel : il n’y a qu’un seul noyau par noeud physique.
L’affectation d’une adresse réseau à chaque noeud virtuel se fait par l’utilisation d’interfaces réseau aliasées. Chaque noeud virtuel dispose d’une interface d’alias, et donc d’une
adresse IP sur le réseau d’expérimentation (figure 3.3 page suivante).
3.3 Émulation du réseau avec P2PLab
Comme ModelNet [20], P2PLab utilise Dummynet [10] pour réaliser l’émulation du réseau. Mais Dummynet est utilisé d’une manière différente. Nous avons vu (voir 3.1.2 page
ci-contre) que le facteur limitant, dans le cadre des systèmes pair-à-pair, était presque toujours la connexion entre le noeud et le coeur de l’Internet (représenté par son fournisseur
d’accès) (figure 3.2 page précédente). Avec P2PLab, nous déportons donc l’émulation du
réseau sur les noeuds physiques.
23
Noeud 1
eth0
192.168.38.2
10.0.0.51 (alias)
10.0.0.52 (alias)
10.0.0.53 (alias)
...
10.0.0.100 (alias)
eth0
192.168.38.1
10.0.0.1 (alias)
10.0.0.2 (alias)
10.0.0.3 (alias)
...
10.0.0.50 (alias)
Noeud 2
192.168.38.3
10.0.0.101 (alias)
10.0.0.102 (alias)
10.0.0.103 (alias)
...
10.0.0.150 (alias)
eth0
Noeud 3
SWITCH
(...)
F IG . 3.3 – Utilisation d’interfaces aliasées
D’une part, nous agissons alors sur le débit et les caractéristiques de fiabilité de la ligne
(perte de paquets). Notre approche ne permet pas de considérer les problèmes de débit et de
congestion dans le coeur d’Internet. Cette simplification permet d’obtenir un meilleur passage à l’échelle, et on peut considérer que, dans le cas des systèmes pair-à-pair, les problèmes
de congestion se manifestent la plupart du temps sur le lien liant le noeud à son fournisseur
d’accès.
D’autre part, nous agissons sur la latence. Une partie de la latence est spécifique au lien
entre le noeud et son fournisseur d’accès, et nous la traitons en même temps que le débit.
Mais une autre partie de la latence est liée à la localisation du noeud sur Internet.
Cette latence n’est pas négligeable dans le cadre des réseaux pair à pair : ainsi, certains
réseaux tentent d’en déduire une notion de localité [25]. Ils utilisent la distance par rapport à certains serveurs de référence pour déterminer la position du système sur Internet, et
évaluer la distance de ce système à d’autres systèmes. Pour émuler cette latence, nous considérons des sous-ensembles de l’ensemble des noeuds (par exemple, tous les noeuds d’un
fournisseur d’accès, ou tous les noeuds européens par rapport aux noeuds américains).
Notre approche ne permet pas de représenter les problèmes de congestion au sein du
coeur d’Internet, mais le fait que l’émulation réseau soit déportée sur chaque noeud a d’autres
avantages. Chaque noeud physique est alors chargé de l’émulation réseau de ses noeuds
virtuels, ce qui permet un passage à l’échelle très facile (nous n’avons pas besoin de dimensionner conjointement la partie de l’émulateur chargée du réseau, et celle chargée de la
virtualisation.
24
D’un point de vue pratique, nous ajoutons sur chaque noeud physique les règles Dummynet prenant en charge l’émulation réseau (paquets émis et reçus) pour les noeuds virtuels
de ce noeud physique ( 3.4).
Noeud
Virtuel 3.2
Noeud
Virtuel 3.1
Noeud Physique 3
Noeud Physique 1
Noeud Physique 2
Noeud Virtuel 1.1
Noeud Virtuel 2.1
Noeud Virtuel 1.2
Noeud Virtuel 2.2
Filtrage Dummynet en entrée
Filtrage Dummynet en sortie
F IG . 3.4 – Traitement des paquets par Dummynet dans P2PLab
3.4 Affectation d’adresses IP aux processus
Avec P2PLab, les noeuds virtuels sont des processus. Il est donc nécessaire d’avoir la
possibilité de forcer un processus à utiliser une adresse IP, et non celle par défaut du système,
pour toutes les communications. La figure 3.5 page suivante présente les différents appels
systèmes réseaux et l’ordre dans lesquels ils peuvent être appelés. Si un bind() est fait avant
un connect(), c’est l’adresse du bind() qui est utilisée comme adresse source de la connexion.
Plusieurs approches sont possibles pour forcer une application à utiliser une IP définie.
Modifier l’application
Une première approche consister à modifier l’application pour la forcer à toujours faire
un bind() avec l’adresse souhaitée. Ce n’est pas une approche intéressante, car elle nécessite
d’avoir le code de l’application, de la modifier et de la recompiler.
Lier l’application avec une bibliothèque
Une autre possibilité est de lier l’application avec une bibliothèque qui redéfinit les appels systèmes à modifier. C’est l’approche utilisée par Delayline [12] et des outils de débo25
socket()
bind()
sendto(), recvfrom(),
sendmsg(), recvmsg()
connect()
listen()
accept()
F IG . 3.5 – Enchaînement des appels systèmes réseaux
guage comme ElectricFence. La bibliothèque peut être liée à la compilation (cas de Delayline)
ou à l’exécution (cas d’ElectricFence) en utilisant la variable d’environnement LD_PRELOAD.
Cette approche est intéressante, car elle ne nécessite pas de modifier l’application, ni
d’avoir son code source. Mais elle a des limites : le chargeur (ld) charge la bibliothèque d’interception directement au-dessous de l’application, mais au-dessus des autres bibliothèques
éventuellement utilisées. Ainsi, si l’application fait appel à une librairie qui fait elle-même
les appels systèmes (figure 3.6), les appels systèmes réseaux ne peuvent pas être interceptés.
Pour que cette approche fonctionne dans un cadre plus général, il faudrait donc modifier le
chargeur ld.
Application
Bibliothèque d’interception
Application
libnet_connect()
libnet_connect()
libnet
libnet
connect()
connect()
noyau
noyau
F IG . 3.6 – Interception par une bibliothèque : l’appel à connect() n’est
pas intercepté, seul l’appel à libnet_connect() est vu par la bibliothèque
26
Modifier le noyau
Modifier le traitement des appels systèmes dans le noyau. Cette approche est la plus
difficile à mettre en oeuvre, mais elle fonctionne parfaitement avec toutes les applications.
Utiliser ptrace()
L’appel système ptrace() permet à une application d’en surveiller une autre, et notamment d’intercepter les appels systèmes. C’est l’approche utilisée par User Mode Linux. Cette
approche fonctionne avec toutes les applications sans avoir à les modifier, mais a un surcoût
relativement important à cause des changements de contexte nécessaires.
Modifier la bibliothèque C
Modifier la bibliothèque C (libc). Cette approche permet de se placer « au-dessous » des
bibliothèques éventuelles. Son seul inconvénient est qu’elle ne fonctionne pas avec les exécutables compilés statiquement.
C’est la modification de la bibliothèque C que nous avons retenu pour P2PLab. En effet, il
nous a semblé que cette approche était le meilleur compromis entre complexité et efficacité.
27
28
Chapitre 4
Évaluation de l’émulation avec P2PLab
4.1 Étude de la faisabilité
Dans un premier temps, nous avons cherché à vérifier que FreeBSD disposait de caractéristiques suffisantes pour notre émulateur en utilisant les métriques de performance proposées dans [26] : linéarité lors du passage à l’échelle, équité et surcoût de l’émulation.
4.1.1 Passage à l’échelle du nombre de processus
FreeBSD 5 dispose de deux ordonnanceurs différents :
– un ordonnanceur historique (appelé 4BSD) [27] dérivé de celui de BSD 4.3 ;
– Un ordonnanceur plus moderne, ULE [28] (il s’agit d’un jeu de mots, la directive de
compilation pour l’activer dans le noyau étant SCHED_ULE).
ULE est inspiré des avancées faites dans l’ordonnanceur de Linux 2.6, notamment en
matière d’interactivé, de passage à l’échelle (ordonnancement en O(1)) et du support de plusieurs processeurs ou de processeurs avec Symetric Multi-Threading (migrations inutiles de
processus d’un processeur à un autre évitées, par exemple). Mais il n’est pas encore considéré par l’équipe de développement de FreeBSD comme utilisable en production.
Pour vérifier l’aptitude au passage à l’échelle, nous avons exécuté simultanément un
nombre variable d’instances d’un même programme calculant la fonction de Ackermann
(calcul intensif en processeur, mais peu coûteux en mémoire) et mesuré le temps nécessaire
à la terminaison de toutes les instances. Les résultats obtenus (figure 4.1 page suivante) sur
un bi-P4 Xeon 2.4 Ghz doté de 2 Go de mémoire vive montrent que le passage à l’échelle
du nombre de processus est correct à la fois avec l’ordonnanceur 4BSD et l’ordonnanceur
ULE : le temps nécessaire à la terminaison des tâches croît linéairement, sans qu’on puisse
constater un surcoût lié au nombre de processus actifs.
Sur cette première expérience, il est important de noter que la mémoire utilisée par
chaque instance était très faible. Nous avons donc ensuite réalisé une expérience similaire,
mais avec un programme effectuant des opérations sur des matrices dont chaque instance
occupe 50 Mo en mémoire. Dans ce cas, on constate que dès que la mémoire virtuelle com29
1600
Mesure (4BSD)
Mesure (ULE)
1400
1200
temps (s)
1000
800
600
400
200
0
0
500
1000
1500
nb d’instances
2000
2500
3000
F IG . 4.1 – Passage à l’échelle du nombre de processus. Les processus
effectuent un calcul long mais peu coûteux en mémoire.
mence à être utilisée, les performances chutent énormément (figure 4.2) et les résultats deviennent très instables (intervalles de confiance plus larges pour un même nombre d’expériences). Il sera donc important par la suite de définir le nombre de noeuds virtuels sur
chaque noeud physique en fonction de l’occupation mémoire de chaque noeud virtuel, afin
d’éviter l’utilisation de mémoire virtuelle qui pourrait fausser les résultats.
60
2000
Mesure
Mesure
1800
50
1600
1400
temps (s)
temps (s)
40
30
20
1200
1000
800
600
400
10
200
0
0
0
5
10
nb d’instances
15
20
0
10
20
30
40
50
nb d’instances
F IG . 4.2 – Passage à l’échelle du nombre de processus avec forte utilisation de la mémoire
30
60
70
80
4.1.2 Équité entre processus
Dans le cadre d’un émulateur au niveau processus, il est bien sûr nécessaire d’avoir un
ordonnanceur ayant de bonnes propriétés d’équité. Par exemple, plusieurs processus démarrés en même temps et effectuant la même tâche doivent avancer presque en même temps et
terminer presque en même temps.
Il est aussi important de pouvoir spécifier des conditions d’expérience particulières, comme
par exemple une expérience avec un processeur rapide (processus à haute priorité, donc
pouvant effectuer beaucoup de traitements) et un processeur lent (processus à faible priorité,
donc ne pouvant effectuer que peu d’opérations). Ce genre de comportement doit pouvoir
être décrit précisément, par exemple en utilisant les priorités des processus Unix.
Pour vérifier que les ordonnanceurs de FreeBSD étaient équitables, nous avons réalisé
une première expérience. À intervalles fixes (1 seconde), nous démarrons un processus qui
effectue un calcul prenant une dizaine de secondes lorsque le processus est le seul à être
exécuté. Nous mesurons le temps réel mis pour effectuer le traitement par chaque processus.
Idéalement, après une période de démarrage, le calcul devrait prendre le même temps pour
tous les processus. Pour éviter que le grand nombre de processus influence le comportement
du processus chargé de créer les autres processus, nous le rendons très prioritaire par rapport
aux processus créés.
1200
Scheduler ULE
Scheduler 4BSD
Linux 2.6
1000
temps d’execution (s)
800
600
400
200
0
0
10
20
30
40
50
60
numero d’instance
70
80
90
100
F IG . 4.3 – Équité inter-processus dans l’accès au processeur. Les processus effectuent un calcul prenant une dizaine de secondes, et sont
démarrés avec une seconde d’intervalle.
Les résultats sont présentés dans la figure 4.3. Nous avons fait cette expérience sur un
bi-P4 Xeon à 2.4 GHz sous Linux 2.6 et avec les deux ordonnanceurs de FreeBSD, 4BSD et
ULE. Nous avons pu expliquer la différence de performance entre Linux et FreeBSD par
31
une régression dans le compilateur GCC (des versions différentes de GCC étaient utilisées
sur les deux systèmes). Nous constatons que 4BSD et Linux 2.6 ont des propriétés d’équité
similaires. Par contre, ULE pose de gros problèmes. Les temps d’exécution des processus
sont très différents, et certains processus (ceux dont les numéros sont multiples de 12) sont
très fortement favorisés (comme s’ils s’exécutaient seuls sur le système).
Si l’utilisation d’ULE est donc à exclure, tout n’est pas parfait avec 4BSD : le temps d’exécution varie assez fortement entre les instances. Cela pourrait s’expliquer par le paramétrage du quantum : le temps processeur alloué à un processus avant de passer au processus
suivant. Un quantum plus faible devrait donc améliorer l’équité entre processus. Mais la figure 4.4 montre que diminuer cette durée n’améliore pas sensiblement l’équité, en dégradant
assez fortement les performances.
1600
temps d’execution (s)
1400
1200
1000
800
Quantum 1ms
Quantum 10ms
Quantum 100ms
Quantum 1s
600
400
0
20
40
60
numero d’instance
80
100
Quantum
1ms
10ms
100ms
1s
Moyenne
1437s
843s
801s
781s
Variance
15.7
17.1
16.9
15.6
F IG . 4.4 – Influence du Quantum sur l’équité inter-processus avec l’ordonnanceur 4BSD
Ces résultats décevants étaient prévisibles, car les ordonnanceurs génériques comme
ceux de FreeBSD ou Linux ont d’autres objectifs que l’équité :
– un algorithme efficace pour choisir le prochain processus à exécuter (O(1) dans le cas
de Linux et FreeBSD) ;
– une réponse très rapide aux processus interactifs, même si le système est très chargé ;
– une bonne prévention des problèmes de famine ;
– un fonctionnement efficace dans le cas d’architectures SMP.
Dans le cas de FreeBSD, l’ordonnanceur gère également une partie du modèle de threads,
où les threads sont regroupés en Kernel-scheduled entities [29] pour implémenter des Scheduler Activations. Cela le rend très complexe à comprendre et à modifier.
Une solution permettant d’obtenir une meilleure équité inter-processus et un contrôle
plus fin du temps alloué à chaque processus serait de réaliser un ordonnanceur FIFO avec
priorités. Cela devrait être facilement réalisable sous Linux, l’ordonnanceur étant très bien
documenté [30], et des travaux similaires ayant déjà été menés [31]. Il faudrait également
gérer le cas de processus multi-threadés : l’équité doit être assurée entre les processus, pas
au niveau des threads.
32
4.2 Émulation du réseau
Pour émuler le réseau, nous utilisons Dummynet (voir 3.3 page 23). Cela nécessite de
recompiler le noyau de FreeBSD pour en activer le support, et de réduire la durée des timeslices de 10ms à 1ms (paramétrage du HZ) pour permettre une émulation précise. Le surcoût
se décompose donc en 3 éléments :
– le surcoût provoqué par le passage dans Dummynet. Nous avions vu avec NIST Net
qu’il n’est pas forcément nul ;
– le surcoût causé par le passage de HZ=100 Hz à HZ=1000 Hz ;
– le surcoût causé par l’examen des règles du firewall ipfw.
7
60
Sans Dummynet, HZ=100
Avec Dummynet, HZ=100
Avec Dummynet, HZ=1000
6
Sans Dummynet, HZ=100
Avec Dummynet, HZ=100
Avec Dummynet, HZ=1000
Avec Dummynet et regles, HZ=1000
50
5
temps (s)
temps (s)
40
4
3
30
20
2
10
1
0
0
0
500
1000
1500
nb de noeuds
2000
2500
0
500
1000
1500
nb de noeuds
2000
F IG . 4.5 – Surcoût provoqué par Dummynet, HZ=1000, et le parcours
des règles
Pour déterminer ces surcoûts, nous avons réutilisé le programme de test réalisant un anneau à jetons en C que nous avions déjà utilisé pour NIST Net. La figure 4.5 montre que les
surcoûts provoqués par HZ=1000 et Dummynet sont négligeables. Par contre, celui provoqué par l’examen des règles est très important. En effet, nous ajoutons une règle par noeud,
et l’ensemble des règles est toujours parcouru linéairement. IPFW n’a probablement pas été
développé dans le but d’utiliser des milliers de règles.
Il serait intéressant de modifier IPFW pour optimiser le parcours des règles, en rajoutant
la possibilité de faire des parcours arborescents ou de choisir une règle à l’aide d’une table
de hachage.
4.3 Affectation d’adresses IP aux processus
Afin de pouvoir affecter une adresse IP à un processus, nous avons choisi de modifier
la bibliothèque C (voir 3.4 page 25). Pour évaluer ce choix, nous avons modifié la libc de
FreeBSD pour modifier le comportement des appels systèmes bind(), listen() et connect().
Nous avons d’abord utilisé une approche naïve :
33
2500
– Lorsqu’une application fait un bind(), on modifie le paramètre my_addr pour limiter le
bind() à l’adresse IP spécifiée dans la variable d’environnement BINDIP.
– Lorsqu’une application fait un connect(), on fait un bind() avant pour limiter le connect()
à l’adresse IP de BINDIP. Le bind() échouera si un bind() a déjà été fait avant de manière
explicite, mais on ignore l’erreur dans ce cas.
– Lorsqu’une application fait un listen(), comme pour le connect(), on fait un bind() avant
pour s’assurer que le listen() est bien limité à l’adresse désirée. Si bind() échoue, on
ignore son erreur.
Cette première implémentation est a priori très inefficace (nombre d’appels systèmes
doublé pour les connect() et les listen().) De plus, elle ne permet de traiter que les connexions
TCP. Une modification similaire est possible pour l’UDP.
Nous avons d’abord vérifié que cette technique par modification de la libc fonctionnait
avec des programmes de test en Perl, Python, Ruby, TCL, C (compilé avec gcc sans l’option -static) et Java (avec le JDK 1.4 de Sun). Par contre, cette approche ne fonctionne pas
avec les programmes en C compilés statiquement (avec -static). C’est logique, puisque les
programmes compilés statiquement n’utilisent pas la libc du système.
Puis nous avons cherché à mesurer le surcoût de cette technique. Pour cela, nous avons
réalisé un programme de test très simple : un client TCP qui se connecte sur un serveur
tournant sur la même machine. Dès que la connexion a été acceptée par le serveur, le serveur coupe la connexion. Puis le cycle recommence : le client se reconnecte. En exécutant ce
test un nombre important de fois, nous avons pu mesurer avec un intervalle de confiance
satisfaisant que la durée d’un cycle était de 10.22µs sans la modification de la libc, et de
10.79µs avec la modification de la libc. Il faut noter que ce surcoût n’est présent que lors de
l’établissement de la connexion. Notre test montre que, même dans un cas limite (application passant tout son temps à établir des connexions), ce surcoût reste très limité comparé
comparé au temps nécessaire pour établir une connexion.
34
Chapitre 5
Émulation avec P2PLab : expériences
5.1 Émulation d’une topologie réseau complexe
Dans une première expérience, nous avons cherché à montrer que P2PLab permettait
d’émuler des topologies suffisamment complexes pour la plupart des expériences, notamment pour pouvoir étudier le fonctionnement de réseaux pair-à-pair utilisant une notion de
localité [25] sur Internet. Nous avons donc écrit une petite application permettant, à partir
d’une topologie réseau et d’un ensemble de machines physiques, de générer les règles IPFirewall et Dummynet nécessaires pour émuler ce réseau. Nous avons testé ce programme
avec la topologie présentée en figure 5.1 page suivante, en répartissant les 2750 noeuds sur
16 machines de GridExplorer. Puis nous avons réalisé l’équivalent de pings en TCP entre
différents noeuds du réseau émulé.
Les résultats de ces pings sont présentés dans la figure 5.2 page suivante, et les valeurs
constatées sont bien celles attendues. Par exemple, entre 10.1.2.100 et 10.3.1.69, nous mesurons un ping de 1.31s. Ce délai se décompose ainsi :
– 40ms entre 10.1.2.100 et son fournisseur d’accès à Internet (représenté par la classe
10.1.2.0/24) ;
– 600ms entre l’ensemble des noeuds de la classe 10.1.0.0/16 et les noeuds de la classe
10.3.0.0/16 (équivalent à une liaison entre un fournisseur d’accès européen et un fournisseur d’accès d’un autre continent, par exemple) ;
– 10ms entre le fournisseur d’accès de 10.3.1.69 et lui-même ;
– 10ms + 600ms + 40ms = 650ms pour l’envoi du paquet retour.
Soit un total de 1300ms, proche de la mesure relevée.
5.2 Étude de BitTorrent
5.2.1 Introduction
BitTorrent [32] est un système pair-à-pair de distribution de fichiers, comme Kazaa, Gnutella ou Freenet. Il est actuellement responsable d’une part non négligeable du trafic sur
Internet [33]. Mais contrairement à la plupart des autres systèmes, qui incluent un système
35
10.2.0.0/16
latence : 5ms
bande passante : 10 Mbps
400ms
1000 noeuds
10.1.0.0/16
100ms
10.1.1.0/24
latence : 100ms
bande passante :
56kbps/33.6kbps
250 noeuds
10.1.2.0/24
latence : 40ms
bande passante :
512 kbps/128kbps
250 noeuds
1s
100ms
10.1.3.0/24
latence : 20ms
bande passante :
8 Mbps/1Mbps
250 noeuds
100ms
600ms
10.3.0.0/16
latence : 10ms
bande passante : 1 Mbps
1000 noeuds
F IG . 5.1 – Topologie réseau émulée
Source
10.1.1.137
10.1.1.105
10.1.1.205
10.1.1.199
10.1.1.84
10.1.2.220
10.1.2.219
10.1.2.70
10.1.2.100
10.1.3.108
10.1.3.207
10.1.3.116
10.2.0.51
10.2.1.139
10.3.3.181
Destination
10.1.1.228
10.1.2.148
10.1.3.204
10.2.2.224
10.3.0.66
10.1.2.4
10.1.3.38
10.2.3.87
10.3.1.69
10.1.3.9
10.2.2.113
10.3.0.169
10.2.3.48
10.3.1.183
10.3.0.133
Temps (A/R)
462ms
522ms
476ms
1.05s
1.46s
173ms
329ms
899ms
1.31s
84ms
853ms
1.26s
23ms
2.03s
43ms
F IG . 5.2 – Résultat de pings entre des noeuds du réseau émulé
36
de recherche de fichiers, BitTorrent est uniquement un système de distribution de fichiers et
ne prend pas en charge la recherche parmi l’ensemble des fichiers disponibles.
Trois entités sont nécessaires lors de la distribution d’un fichier par BitTorrent [34] :
– un site web où l’utilisateur pourra récupérer un fichier .torrent. Ce fichier de petite
taille (quelques Ko) contient l’adresse du tracker et les sommes de contrôle des différentes parties du fichier (ou chunks ) ;
– un tracker, qui distribue aux clients des listes d’autres clients ;
– un ensemble de clients (peers ) voulant récupérer le fichier. Si ces clients ont déjà obtenu
une copie complète du fichier, ils sont appelés seeders.
Après avoir récupéré une liste de peers sur le tracker, un client se connecte à tous les
peers reçus et échange des informations sur les chunks déjà reçus.
Ensuite, un mécanisme de réciprocité efficace [35] se met en place entre les clients afin
d’éviter le free riding [36] (l’utilisation égoïste du système pair-à-pair, sans y contribuer).
Bittorrent a déjà fait l’objet de nombreuses études. Des traces de téléchargements ont été
analysées ([37], [38], [39]). Certains ont cherché à le modéliser mathématiquement [40] tandis
que d’autres l’ont simulé [41], et de nombreuses propositions ont été faites pour améliorer le
protocole et le rendre plus robuste ([41] par exemple).
5.2.2 Validité des résultats
Nous avons d’abord cherché à comprendre quelles étaient les limites de notre approche.
Pour cela, nous avons réalisé un téléchargement entre un seeder et 158 noeuds. Les débits
alloués sont de 2 Mbps (descendant) et 1 Mbps (montant). Le tracker et le seeder sont démarrés au début de l’expérience, puis un client est démarré toutes les 5 secondes.
Nous avons répartis ces 160 noeuds (un tracker, un seeder, 158 clients) sur des machines
de GridExplorer (bi-Opteron 2 Ghz, 2 Mo de RAM). Nous avons d’abord mis 10 noeuds
par machine, puis 20 noeuds par machine, puis 32 noeuds par machine, puis 40 noeuds par
machine. Pour chaque expérience, nous mesurons la quantité totale de données reçues par
l’ensemble des clients. Les résultats sont présentés en figure 5.3 page suivante. Par manque
de temps, nous n’avons pas calculé d’intervalles de confiance. Les résultats obtenus avec 10
et 20 noeuds par machine sont très proches. Avec 32 noeuds par machine, une légère dérive
apparaît. Avec 40 noeuds, elle est bien plus importante.
5.2.3 Passage à l’échelle
Nous avons ensuite vérifié que notre approche passait correctement à l’échelle. Nous
avons réalisé un téléchargement de fichiers dans les mêmes conditions que ci-dessus, mais
avec 512 noeuds répartis sur 16 machines à raison de 32 noeuds par machine, les clients étant
lancés avec 2 secondes d’intervalle. Le taux de complétion du transfert sur chaque client est
indiqué en figure 5.4 page 39.
37
quantite totale de donnees recues sur les clients (Mo)
8000
7000
6000
5000
4000
3000
2000
1000
10 clients par noeud
20 clients par noeud
32 clients par noeud
40 clients par noeud
0
0
200
400
600
temps (s)
800
1000
1200
F IG . 5.3 – Transfert de fichiers avec BitTorrent : différents niveaux de
virtualisation
5.2.4 Super-seeding et autres techniques pour accélérer la diffusion
Un facteur limitant très important est la bande passante du seeder, surtout lorsqu’il n’y
en a qu’un seul, et qu’il a une bande passante assez limitée. En effet, les noeuds ne peuvent
uploader que les chunks qu’ils ont entièrement reçu. Il est donc important de distribuer
rapidement des chunks entiers aux autres clients.
Initialement, les clients souhaitant télécharger demandent un bloc au hasard parmi tous
les blocs disponibles sur le seeder. Du coup, le seeder peut être contraint de diffuser le même
bloc à deux clients différents, ce qui est contre-productif.
BitTornado, un client BitTorrent, propose une solution à ce problème : le Super-seeding.
Plutôt que de s’afficher comme un seeder (possédant tous les blocs), le seeder s’affiche
comme un client classique, et ne présente aux autres clients que les blocs qu’il souhaite leur
envoyer. Ainsi, il peut s’assurer que chaque bloc va être distribué avec la même fréquence,
et en particulier, au début, distribuer une fois chaque bloc à d’autres clients avant de commencer à les renvoyer vers d’autres clients.
Nous avons comparé cette approche avec d’autres approches en réalisant le transfert
d’un fichier de 50 Mo à partir d’un seul seeder, avec 320 noeuds répartis sur 16 machines
à raison de 20 noeuds par machine. Chaque noeud dispose d’une connexion à 2 Mbps en
download, et de 1 Mbps en upload. Les résultats obtenus sont présentés en figures 5.5 page 40
et 5.6 page 40.
Notre expérience n’a pas permis de mettre en évidence un avantage apporté par le Superseeding par rapport au fonctionnement classique. Ce n’est pas étonnant : le choix des blocs
38
100
donnees recues par les clients (%)
80
60
40
20
0
0
200
400
600
800
1000
1200
temps (s)
F IG . 5.4 – Transfert de fichier avec BitTorrent et 512 noeuds
demandés par les clients est aléatoire, et les cas fortement défavorables (où de nombreux
clients demandent le même bloc au seeder ) sont donc rares. Par contre, nous avons pu proposer deux autres solutions :
– Limiter le nombre de distributions simultanées (7 par défaut) à une seule. Ainsi, les
clients réalisent une chaîne, ce qui permet un transfert bien plus rapide de chaque
bloc, puisque la bande passante n’est plus partagée entre les différents blocs. plus rapidement.
– Diminuer la taille des blocs, qui est par défaut de 2 18 octets (256 ko). Ainsi, le transfert
de chaque bloc est plus rapide, et les blocs peuvent être transférés à d’autres noeuds
bien plus tôt. Nous avons évalué cette approche avec une taille de bloc de 2 14 octets
(16 ko).
Ces deux propositions sont plus performantes que les solutions implémentées dans les
clients au début du transfert, mais elles montrent leurs limites par la suite :
– limiter le nombre de distributions simultanées est très pénalisant à la fin du transfert ;
– diminuer la taille des blocs est pénalisant tout au long du transfert, car le nombre de
messages échangés par les clients est plus important.
39
1400
16000
quantite totale de donnees recues sur les clients (Mo)
14000
12000
10000
8000
6000
4000
BitTornado sans Super-seeding
BitTornado avec Super-seeding
BitTorrent 4.0
BitTornado sans SS, avec max_uploads = 1
BitTornado avec chunks de 214 octets
BitTorrent 3.4
2000
0
0
100
200
300
400
500
600
700
800
900
temps (s)
F IG . 5.5 – Super-seeding et autres techniques pour accélérer la diffusion
16000
BitTornado sans Super-seeding
BitTornado avec Super-seeding
BitTorrent 4.0
BitTornado avec max_uploads = 1
BitTornado avec chunks de 214 octets
BitTorrent 3.4
6000
quantite totale de donnees recues sur les clients (Mo)
quantite totale de donnees recues sur les clients (Mo)
7000
5000
4000
3000
2000
1000
0
0
50
100
150
temps (s)
200
250
300
15500
15000
14500
14000
13500
13000
12500
600
BitTornado sans Super-seeding
BitTornado avec Super-seeding
BitTorrent 4.0
BitTornado avec max_uploads = 1
BitTornado avec chunks de 214 octets
BitTorrent 3.4
650
700
temps (s)
F IG . 5.6 – Super-seeding et autres techniques pour accélérer la diffusion : début et fin du transfert
40
750
800
Chapitre 6
Conclusion et perspectives
Les connexions à haut débit à Internet et les ordinateurs personnels surpuissants se multiplient, permettant à des particuliers de disposer de ressources équivalentes à celles des
centres de calcul ou des fournisseurs d’accès à Internet il y a encore quelques années. Cela
provoque une remise en question du modèle client/serveur largement utilisé sur Internet.
De plus en plus d’applications, et dans des domaines très divers, ont des principes de fonctionnement empruntant au moins quelques idées aux systèmes pair-à-pair.
Cela rend malheureusement le développement et la compréhension de ces applications
bien plus difficile, car tous les problèmes classiques des applications parallèles sont alors
rencontrés à très grande échelle. Les techniques classiques d’étude de ces systèmes montrent
alors leur limite : la simulation et l’exécution sur une plate-forme réelle permettent rarement
de dépasser le milliers de noeuds sans faire d’énormes compromis sur le réalisme de l’expérience.
L’émulation est une approche prometteuse pour aider à étudier ces systèmes. Si la plupart des approches actuelles privilégient le réalisme au détriment du nombre de machines
émulées, nous avons montré qu’il était possible, à moindre coût, d’obtenir des résultats intéressants avec une approche légère, privilégiant le nombre de machines émulées et le passage
à l’échelle sans sacrifier la précision de l’émulation. Mais de nombreuses voies restent ouvertes.
Tout d’abord, il serait intéressant de comparer d’une manière plus fine les résultats obtenus par P2PLab avec ceux de Netbed ou de Modelnet. Même si la plupart des expériences
réalisées avec Netbed mettent une oeuvre des topologies simples, on peut se demander si
P2PLab permettrait de réaliser des expériences avec des topologies vraiment complexes.
P2PLab ne permet pas non plus pour l’instant de modéliser la congestion dans le coeur du
réseau. Si cela n’est pas un facteur limitant dans la plupart des expériences sur les systèmes
pair-à-pair, c’est un prérequis nécessaire à une utilisation dans d’autres domaines (émulation
de grilles, par exemple).
D’autre part, FreeBSD n’est actuellement pas le système d’exploitation le plus utilisé sur
les plate-formes que nous ciblons. Il serait intéressant de concevoir un outil ayant les mêmes
possibilités que Dummynet, mais sous Linux, en se basant par exemple sur le travail fait sur
NIST Net puis Netem.
41
Les problèmes d’équité processeur entre processus émulés n’ont pas été approfondis
dans notre étude. Il serait utile de définir précisément quels sont les besoins pour un ordonnanceur adapté à l’émulation, permettant plus de souplesse dans les paramètres des
expériences et plus de réalisme dans les résultats.
Mais, plus généralement, l’objectif pourra être d’augmenter le rapport de virtualisation
(augmenter le nombre de machines virtualisées sur chaque noeud physique) sans sacrifier
le réalisme. Nous avons montré qu’il était possible d’émuler 20 instances d’une applications
assez lourde sur une seule machine, sans perdre en réalisme. Mais il faut chercher des solutions techniques permettant d’aller au delà.
42
Bibliographie
[1] G Fedak, C. Germain, V. Néri et F. Cappello. XtremWeb : A generic global computing
system. 2001.
[2] Ian Clarke, Theodore W. Hong, Scott G. Miller, Oskar Sandberg et Brandon Wiley. Protecting freedom of information online with Freenet.
[3] S Baset et H. Schulzrinne. An analysis of the Skype peer-to-peer internet telephony
protocol. 2004.
[4] Sandeep Bajaj, Lee Breslau, Deborah Estrin, Kevin Fall, Sally Floyd, Padma Haldar,
Mark Handley, Ahmed Helmy, John Heidemann, Polly Huang, Satish Kumar, Steven
McCanne, Reza Rejaie, Puneet Sharma, Kannan Varadhan, Ya Xu, Haobo Yu et Daniel
Zappala. Improving simulation for network research. Technical Report 99-702b, University of Southern California, March 1999.
[5] Arnaud Legrand, Loris Marchal et Henri Casanova. Scheduling distributed applications : the SimGrid simulation framework. In CCGRID ’03 : Proceedings of the 3st International Symposium on Cluster Computing and the Grid, page 138, Washington, DC, USA,
2003. IEEE Computer Society.
[6] Xin Liu et Andrew Chien. Realistic large scale online network simulation. In ACM
Conference on High Performance Computing and Networking (SC2004). ACM Press, 2004.
[7] p2psim. http ://pdos.csail.mit.edu/p2psim/.
[8] Mark Carson et Darrin Santay. NIST Net : a Linux-based network emulation tool. SIGCOMM Comput. Commun. Rev., 33(3) :111–126, 2003.
[9] Stephen Hemminger. Netem. http ://developer.osdl.org/shemminger/netem/.
[10] Luigi Rizzo. Dummynet : a simple approach to the evaluation of network protocols.
ACM Computer Communication Review, 27(1) :31–41, 1997.
[11] Emmanuel Conchon. Système d’émulation de réseau IP. Mémoire de D.E.A., ENSICA,
2003.
[12] David B. Ingham et Graham D. Parrington. Delayline : A wide-area network emulation
tool. Computing Systems, 7(3) :313–332, 1994.
[13] Stefano Cacciaguerra. Experiences with synthetic network emulation for complex IP
based networks. Technical Report UBLCS-2005-04, Department of Computer Science,
University of Bologna, 2005.
[14] Brian White, Jay Lepreau, Leigh Stoller, Robert Ricci, Shashi Guruprasad, Mac Newbold, Mike Hibler, Chad Barb et Abhijeet Joglekar. An integrated experimental environment for distributed systems and networks. SIGOPS Oper. Syst. Rev., 36(SI) :255–270,
2002.
43
[15] Networking Lab (California Institute of Technology).
lab.caltech.edu/.
Wan in Lab.
http ://net-
[16] Jeff Dike. A user-mode port of the Linux kernel. In Proceedings of the 4th Annual Linux
Showcase and Conference, Atlanta, page 63. Usenix, 2000.
[17] The Linux VServer Project. http ://www.linux-vserver.org/Linux-VServer-Paper.
[18] Benjamin Quétier. Emugrid : étude préparatoire pour un émulateur de système à
grande échelle. Mémoire de D.E.A., LRI, Université Paris Sud, 2004.
[19] Paul Barham, Boris Dragovic, Keir Fraser, Steven Hand, Tim Harris, Alex Ho, Rolf Neugebauer, Ian Pratt et Andrew Warfield. Xen and the art of virtualization. In SOSP ’03 :
Proceedings of the nineteenth ACM symposium on Operating systems principles, pages 164–
177, New York, NY, USA, 2003. ACM Press.
[20] A. Vahdat, K. Yocum, K. Walsh, P. Mahadevan, D. Kostic, J. Chase et D. Becker. Scalability and accuracy in a large-scale network emulator, 2002.
[21] H. J. Song, X. Liu, D. Jakobsen, R. Bhagwan, X. Zhang, K. Taura et A. Chien. The MicroGrid : a scientific tool for modeling computational grids. In Supercomputing ’00 :
Proceedings of the 2000 ACM/IEEE conference on Supercomputing (CDROM), page 53. IEEE
Computer Society, 2000.
[22] Brent Chun, David Culler, Timothy Roscoe, Andy Bavier, Larry Peterson, Mike Wawrzoniak et Mic Bowman. PlanetLab : An Overlay Testbed for Broad-Coverage Services.
ACM SIGCOMM Computer Communication Review, 33(3) :00–00, July 2003.
[23] Grid 5000. http ://www.grid5000.fr/.
[24] Clay
Shirky.
What
is
P2P
...
and
what
isn’t ?
http ://www.openp2p.com/pub/a/p2p/2000/11/24/shirky1-whatisp2p.html.
[25] E. Ng et H. Zhang. Predicting internet network distance with coordinates-based approaches. In IEEE Conference on Computer Communications (INFOCOM ’02), 2002.
[26] Benjamin Quétier et Vincent Néri. V-Meter : Microbenchmark pour évaluer les utilitaires de virtualisation dans la perspective de systèmes d’émulation à grande échelle.
In Rencontres Francophones en Parallélisme, Architecture, Système et Composant, 2005.
[27] Jon P. Giza. The FreeBSD process scheduler.
[28] Jeff Roberson. ULE : A modern scheduler for FreeBSD.
[29] Jason Evans. Kernel-scheduled entities for FreeBSD.
[30] Josh Aas. Understanding the linux 2.6.8.1 CPU scheduler.
[31] Lisa A. Torrey, Joyce Coleman et Barton P. Miller. Comparing interactive scheduling in
Linux.
[32] Bram Cohen. Incentives build robustness in BitTorrent. http://www.bittorrent.com, 2003.
[33] T. Karagiannis, A. Broido, N. Brownlee, kc claffy et M. Faloutsos. Is p2p dying or just
hiding ? In Globecom, Dallas, TX, USA, November 2004.
[34] BitTorrent Wiki. http://wiki.theory.org/CategoryBitTorrent.
[35] Philippe Golle, Kevin Leyton-Brown et Ilya Mironov. Incentives for sharing in peer-topeer networks. In EC ’01 : Proceedings of the 3rd ACM conference on Electronic Commerce,
pages 264–267, New York, NY, USA, 2001. ACM Press.
44
[36] Eytan Adar et Bernardo A. Huberman. Free riding on gnutella. First Monday, October
2000.
[37] Mikel Izal, Guillaume Urvoy-Keller, Ernst W Biersack, Pascal A Felber, Anwar
Al Hamra et Luis Garces-Erice. Dissecting BitTorrent : five months in a torrent’s lifetime. In PAM’2004, 5th annual Passive & Active Measurement Workshop, April 19-20, 2004,
Antibes Juan-les-Pins, France / Also Published in Lecture Notes in Computer Science (LNCS),
Volume 3015, Barakat, Chadi ; Pratt, Ian (Eds.) 2004, XI, 300p - ISBN : 3-540-21492-5, Apr
2004.
[38] J.A. Pouwelse, P. Garbacki, D.H.J. Epema et H.J. Sips. The Bittorrent P2P file-sharing
system : Measurements and analysis. In 4th International Workshop on Peer-to-Peer Systems (IPTPS), feb 2005.
[39] P.Garbacki, J.A.Pouwelse et D.H.J.Epema. Analyzing BitTorrent : Three lessons from
one peer-level view. In ASCI’2005.
[40] Dongyu Qiu et R. Srikant. Modeling and performance analysis of BitTorrent-like peerto-peer networks. In SIGCOMM ’04 : Proceedings of the 2004 conference on Applications,
technologies, architectures, and protocols for computer communications, pages 367–378, New
York, NY, USA, 2004. ACM Press.
[41] Ashwin R. Bharambe et Cormac Herley. Analyzing and improving BitTorrent performance. Technical Report MSR-TR-2005-03, Microsoft Research, 2005.
45