Observations d`exécutions d`algorithmes de consensus sur

Transcription

Observations d`exécutions d`algorithmes de consensus sur
Observations d’exécutions d’algorithmes de consensus sur réseaux
sans fil en mode ad-hoc
Corine Marchand, Jean-Marc Vincent∗
{Corine.Marchand, Jean-Marc.Vincent}@imag.fr
Laboratoire ID-IMAG, Projet APACHE, (CNRS-INRIA-INPG-UJF)
ZIRST 51, avenue Jean Kuntzmann
38330 MONTBONNOT SAINT MARTIN
Résumé
La mise au point de middleware sur des architectures distribuées dynamiques nécessite des méthodes
de mesure et d’analyse adéquates. A partir de l’exemple d’un module de consensus basé sur des détecteurs de défaillances, l’article présente la visualisation d’exécutions de l’algorithme en fonction de l’évolution de l’architecture (défaillance réseau, crash de processus, reprise, etc...). La méthode présentée se
base sur la modélisation du comportement de l’algorithme (états et événements) couplée avec un modèle
hiérarchique de visualisation. L’analyse permet d’une part la vérification du schéma de l’algorithme
réparti et d’autre part de mesurer les latences afin de déterminer l’impact des temporisations sur la
qualité de service de l’algorithme.
Mots-clés : Traces d’exécution, Algorithme de consensus réparti, Réseaux sans fil ad-hoc
1. Introduction
Dans le cadre du développement d’intergiciels distribués, l’étape de mise au point reste une tâche
complexe. En effet, cette étape, directement corrélée à la mise en œuvre de l’environnement réparti,
correspond à la fois à une phase de debogage et à une phase d’évaluation de performances. Pour ce
faire, la validation passe d’une part par la vérification du bon enchaı̂nement des événements répartis, et
d’autre part par l’analyse de la qualité de service, à savoir la prise en considération des problèmes liés
aux durées d’exécution. Aussi, l’objectif des travaux présentés dans cet article est d’illustrer l’approche
méthodologique que nous avons utilisée [13] afin de permettre la validation d’algorithmes répartis et
l’analyse de leurs performances.
La validation du fonctionnement correct d’un protocole vis à vis de ses spécifications peut être notamment réalisée grâce à une observation précise de son exécution lors d’expérimentations spécifiques. Cependant, quelque soit l’environnement considéré (centralisé ou réparti), la complexité liée au problème
de l’observation provient essentiellement de l’intrusion nécessaire à la prise d’informations impliquant
immanquablement une modification même minime de l’exécution en elle-même. Aussi, l’obtention
d’observations significatives impose une analyse préalable des informations à collecter, effectuée lors
du prototypage de l’algorithme distribué à valider expérimentalement.
Dans un contexte distribué, l’obtention de la visualisation de traces d’exécution post-mortem soulève
donc deux problématiques :
• D’une part, la résolution de difficultés liées à l’observation d’événements distribués. En effet, outre
les problèmes de modélisation (Que veut-on mesurer ?), la prise d’informations nécessite une instrumentation adaptée (Comment mesurer ?), suivie de la réalisation de mesures pertinentes.
• D’autre part, l’analyse des données collectées peut s’avérer relativement complexe dans le cadre d’un
système réparti. En effet, l’étape d’interprétation des données enregistrées nécessite préalablement
une mise en relation temporelle des informations récupérées localement sur différents sites.
∗
Ce travail est partiellement financé par France Télécom R&D (Contrat INRIA CRE MIRRA).
À ces difficultés, dans notre système distribué basé sur un réseau sans fil de machines hétérogènes,
s’ajoutent de nouvelles problématiques liées aux spécificités d’un tel environnement. Tout d’abord, la
dynamicité de l’environnement doit être considérée. En effet, aux défaillances possibles des entités composant notre système distribué viennent se greffer les déconnexions de ces même entités dues principalement à leur mobilité mais aussi à diverses perturbations extérieures (interférences pouvant générer
une isolation momentanée). La difficulté soulevée ici réside essentiellement dans le choix des informations à enregistrer lors de l’exécution de l’algorithme de façon a être capable d’identifier par la
suite de tels phénomènes et pouvoir ensuite interpréter et visualiser le comportement de l’algorithme
étudié. De plus, dans ce type d’environnements, la non fiabilité des communications soulève également
de nouvelles difficultés. En effet, comment parvenir à la mise en relation d’événements de type envois/réceptions de messages lorsque des pertes se sont produites ? Une trace d’envoi de message qui
n’ayant aucune correspondance au niveau des réceptions signifie-t-elle que l’entité émettrice n’a jamais
émis le message sur le réseau ou que l’entité devant réceptionner n’a pas pu faire remonter ce message à un niveau supérieur (niveau middleware dans notre cas) ? Aussi, il paraı̂t nécessaire de définir
précisément les données devant être enregistrées à différents niveaux hiérarchiques de façon à pouvoir
interpréter les informations récoltées sur les différents sites.
Dans cet article, l’objectif principal visé concerne donc l’observation du déroulement d’un algorithme
distribué, plus explicitement un algorithme de consensus réparti, et la prise de mesures de performances
en terme de latences. Concrètement, on mémorise, lors de l’exécution de l’algorithme de consensus, les
informations relatant des différentes étapes de son évolution, de façon à pouvoir ”post-mortem” rejouer
cette exécution et ainsi permettre une analyse fine des événements et de leurs interactions. Pour ce faire,
une méthode analytique a été mise en place afin de faciliter la construction de diagrammes temporels
représentant le déroulement des consensus.
Nous présentons tout d’abord la problématique générale dans laquelle s’inscrit cette approche d’observation de l’exécution d’un algorithme de consensus dans un système distribué soumis à une forte dynamicité ambiante, et décrivons les solutions algorithmiques proposées de façon à prendre en compte les
particularités de l’environnement considéré. Après avoir expliciter l’étape d’instrumentation, nous nous
attacherons ensuite à décrire la manière dont l’exécution de cet algorithme réparti testé expérimentalement, peut être représenté graphiquement par un diagramme temporel réalisé post mortem. Enfin, la
dernière section est consacrée à la présentation des expérimentations réalisées et des résultats obtenus
en terme de traces d’exécutions permettant l’observation post mortem du déroulement de l’algorithme
de consensus.
2. Un algorithme de consensus en environnement instable
2.1. Contexte général
S’inscrivant au sein du projet Sidrah [4] -projet visant à la mise en œuvre d’une infrastructure permettant
entre autres la collaboration spontanée entre différents appareils connectés entre eux par un ou plusieurs
réseaux sans fil-, nos travaux se sont essentiellement attachés aux aspects liés à la ”résilience” d’une telle
infrastructure. A savoir, comment assurer la cohérence d’un groupe d’entités évoluant en coopération
dans un environnement totalement distribué et présentant une forte instabilité due essentiellement à
l’utilisation d’un protocole de communication sans fil mais aussi au fait que les entités mises en jeux ne
sont pas statiques.
Aussi, afin de fournir aux différentes entités composant le système le moyen de coordonner leurs actions ou de s’accorder sur une ou plusieurs valeurs partagées, l’algorithmique répartie tolérante aux
pannes fait référence à différents problèmes d’accords (consensus, élections, exclusions mutuelles, etc...)
concourant à résoudre les problèmes de maintien de la cohérence dans le groupe. De ce fait, nous avons
focalisé notre approche algorithmique sur le problème fondamental de résolution du consensus [19, 11]
en environnement fortement variable.
En effet, l’environnement considéré présente un certain nombre de caractéristiques particulières. Par
exemple, la principale spécificité de l’environnement dans lequel nous nous plaçons concerne l’utilisation d’un réseau sous-jacent basé sur un protocole de communication sans fil. Or, ce réseau sous-jacent
peut être qualifié de ”réseau local ad-hoc” et est donc caractérisé principalement par sa topologie dynamique. Aussi, les infrastructures logicielles reposant sur de tels environnements - réseaux sans fil
2
en mode ad-hoc composés d’entités hétérogènes - doivent pouvoir s’adapter et gérer cette dynamicité (connexion / déconnexion) ainsi que la forte variabilité des communications (latence, débit, pertes)
spécifiques à ces réseaux ambiants [15]. Il est cependant important de noter que, dans un soucis de
simplification, les entités de notre système appartiennent à la même ”bulle”. On entend par là que les
communications entre les différents membres de la communauté considérée ne nécessitent aucun intermédiaire, à savoir chaque entité peut atteindre directement et être atteignable directement par toutes
les autres entités de la communauté. De plus, une des propriétés remarquables de notre environnement
concerne le respect d’un ordre FIFO au niveau des communications.
Ainsi, dans cet environnement particulier, l’objectif général était donc de concevoir et d’implanter un
algorithme de consensus permettant de disposer d’une prise de décision répartie, et ce afin de maintenir la cohérence d’une communauté formée d’entités hétérogènes et partageant des services sur ces
architectures fortement dynamiques (instables).
Or, dans un tel contexte, - système asynchrone dans lequel les entités mises en jeu sont susceptibles
de subir de simples déconnexions voire des défaillances définitives -, la réalisation d’un consensus se
trouve directement confronté au résultat d’impossibilité énoncé par Fischer, Lynch & Paterson [5]. Bien
que diverses alternatives permettent de contourner cette impossibilité (approches probabilistes [2], approches auto-stabilisantes [20], etc...), la stratégie retenue concerne l’enrichissement de l’environnement
par un mécanisme de détection de défaillances non fiable tel que proposé initialement par Chandra
& Toueg [3]. En effet, étant donné l’instabilité de l’environnement considéré, le principal avantage de
cette approche concerne la flexibilité offerte lors de son implantation, et notamment la possibilité de
concentrer toute l’analyse de la variabilité de l’environnement au niveau du module de détection de
défaillances.
Cependant, reposant sur une hypothèse de fiabilité des communications, les algorithmes de consensus
basés sur l’utilisation de mécanismes de détections de défaillances [3, 8, 18] ne sont pas directement
utilisables dans notre contexte. De plus, les algorithmes proposant une résolution du consensus lorsque
le modèle de pannes peut être de type arrêt/rétablissement [7, 16, 1], ne semblent pas très adaptés à un
environnement soumis à une forte instabilité et considérant à la fois des défaillances définitives et des
déconnexions momentannées.
Aussi, inspiré de l’algorithme présenté par Chandra & Toueg [3], un algorithme de consensus spécifiquement adapté à la forte variabilité de l’environnement considéré a été proposé et développé [14]. Cet algorithme permet de contourner les obstacles que sont la variabilité des latences de communications, la
non fiabilité du protocole de communication, ainsi que les déconnexions intempestives des entités du
système. La principale particularité de cet algorithme repose sur l’utilisation d’un module de retransmission de certains messages couplé à une utilisation plus systématique du mécanisme de détection des
défaillances afin d’éviter les attentes trop longues et d’empêcher les interblocages [13].
2.2. Description de l’algorithme de consensus
Concept théorique :
De manière générale, l’algorithme de consensus repose sur le paradigme du coordinateur tournant. A
savoir, le déroulement de cet algorithme peut être décomposé en ”rounds” asynchrones, chacun étant
géré par une entité particulière appelée coordinateur. L’entité coordinatrice a un rôle majeur car elle est
chargée de la gestion du protocole d’accord, et donc d’une certaine façon de centraliser les informations
échangée pendant le ”round” dont elle est coordinatrice. Aussi, comme l’illustre la figure ??, le protocole
consiste en la réalisation de deux phases principales :
(i) la collecte des estimations des participants suivie de la communication de la proposition concernant la valeur de décision,
(ii) la collecte des acquittements des participants et la transmission de la décision.
Dans l’algorithme de Chandra & Toueg, collecter signifie que le coordinateur doit réceptionner une
majorité des messages envoyés par les participants (d (N+1)
e). Aussi, après l’étape de collecte, le coordi2
nateur diffuse soit, lors de la première phase, une proposition réalisée via une fonction sur l’ensemble
des estimations collectées, soit, lors de la seconde phase, la valeur de décision.
3
Le principe de fonctionnement de cet algorithme est qu’à chaque ”round” plusieurs
cas sont envisageables : la défaillance d’une
entité ou de plusieurs entités, des temps
VALEUR
de communication entre les entités plus ou
PROPOSITION
ACK
DECISION
moins longs, etc..., peuvent avoir diverses
influences sur le déroulement de l’algorithme.
PHASE 1
PHASE 3
Aussi, si les circonstances ne sont pas faROUND
vorables à la prise de décision lors d’un
F IG . 1 – Principe d’exécution de l’algorithme de consensus ”round” R, la résolution du consensus est
remise à un ”round” ultérieur. Les conditions environnementales pouvant évoluer rapidement, le passage au ”round” suivant R + 1 peut permettre la résolution du consensus. Ainsi, lorsqu’une entité pi est en attente d’un message de proposition
en provenance du coordinateur du ”round” R, elle interroge son détecteur de défaillances et, s’il s’avère
que celui-ci suspecte le coordinateur, cette entité pi passe au ”round” suivant (R + 1).
Ce principe théorique de fonctionnement de l’algorithme de consensus peut être décrit et/ou illustré de
diverses façons (la figure ci-dessus en est un exemple). Cependant, l’observation de ce même principe
lors d’expérimentations, c’est à dire sur une exécution réelle de l’algorithme, n’est pas triviale. En effet,
comme nous le verrons dans la suite de ce document, la reconstruction de la manière dont une exécution
a eu lieu nécessite différentes étapes de traitement préalables (détermination de la représentation visuelle des différents événements, élaboration d’un référentiel de temps commun entre les différents
sites, etc...).
Coordinateur
PHASE 2
PHASE 4
Présentation de l’algorithme adapté à l’instabilité de l’environnement :
Reposant sur l’existence de deux primitives de communication, une primitive de communication point
à point et une primitive de diffusion de messages, l’algorithme de consensus proposé s’appuie sur l’hypothèse d’intégrité des messages : on suppose en effet qu’il n’y a d’altération possible des messages.
De plus, l’introduction d’une couche de fiabilisation (retransmission) des messages permet de garantir
que tout message émis finira par être reçu. Par ailleurs, cet algorithme n’impose pas nécessairement la
présence d’une majorité d’entités correctes, mais suppose que les isolations réseau (déconnexions momentannées) des différentes entités sont indépendantes entre elles. La figure 2 présente l’automate per-
! stable
rcv(Estimate)
C−Wait−Estimate
C−Wait−Ack
Coord and
bc(Estimate)
INIT
not(Coord) and
send(Estimate)
! stable
majority(Ack)
and bc(Decision)
rcv(Nack)
suspect(Coord)
and send(Nack)
CHANGE
ROUND
rcv(Ack)
majority(Estimate)
and bc(Proposition)
END
CHECK
COORD
not(suspect(Coord))
and send(Ack)
rcv(Proposition)
P−Wait−Proposition
rcv(Decision)
P−Wait−Decision
F IG . 2 – Automate spécifiant le comportement de l’algorithme de consensus
mettant de décrire l’algorithme de consensus proposé. Pour détailler rapidement cet automate, les états
C-states (partie haute de l’automate) correspondent aux rôles attribués au coordinateur et se décomposent
4
en deux états : un état attribué à l’étape d’attente de réception d’une majorité de valeurs d’Estimation
(état CWaitEstimate) et l’état correspondant d’attente de réception d’une majorité d’acquittement (état
CWaitAck). La transition entre ces deux états est déclenchée par l’obtention d’une majorité d’Estimation
et se traduit par le diffusion de la valeur de Proposition.
A l’opposé, les états P-states correspondent aux rôles attribués aux participants (autres que le coordinateur) et se décomposent ainsi : un état représentant l’attente de la réception d’une valeur de Proposition
(état PWaitProposition) et un état associé à l’attente de réception de la valeur de Decision (état
PWaitDecision).
En relation avec la figure 1 présentée précédemment, l’état CWaitEstimate se situe dans la ”phase
2”, laquelle se termine par la diffusion de la valeur de Proposition du coordinateur (lien entre l’état
CWaitEstimate et l’état CWaitAck). L’état PWaitProposition se positionne dans ce qu’on nomme
”phase 3” dans la figure 1. Globalement, alors que les états et actions attribués au coordinateur dans la
figure 2 sont principalement associés aux phases 2 et 4 dans la figure 1, ceux attribués aux participants
correspondent quant à eux, aux phases 1 et 3 de la figure 1.
Par ailleurs, deux opérations importantes sont illustrées dans cette figure 2 : l’action C HECK D ETECTOR
qui est systématiquement déclenchée après réception d’une Proposition et l’action C HANGE R OUND
qui sera déclenchée après détection d’un problème (non stabilité du système) suite à une attente trop
longue.
2.3. Validation de l’algorithme de consensus
Afin de compléter l’étude théorique réalisée préalablement, l’étape d’implantation de l’algorithme de
consensus a été suivie d’une étape expérimentale de validation du fonctionnement de cet algorithme.
En effet, une vérification expérimentale de la conformité du comportement de l’algorithme par rapport
à ses spécifications est indispensable. Par ailleurs, une évaluation des performances de l’algorithme est
nécessaire à la mise au point et à l’optimisation de l’algorithme, ou plus précisément au dimensionnement des différents paramètres introduits (paramètres directement liés à l’algorithme de consensus,
mais aussi les paramètres attribués aux détecteurs de défaillances et ceux définis au niveau du module
de fiabilisation des communications).
Aussi, de façon à réaliser cette validation expérimentale, nous avons mis en place une méthode permettant d’observer le comportement (enchaı̂nement des événements successifs) de cet algorithme implémenté et exécuté sur une plateforme expérimentale. Or, l’observation d’une telle exécution peut être décomposée en deux étapes principales : d’une part, la prise d’informations au cours de l’exécution, et d’autre
part, l’interprétation des données ainsi collectées.
La première étape nécessite tout d’abord une définition précise des informations devant être enregistrées, suivie d’une instrumentation adaptée (voir section 3). La principale difficulté rencontrée lors de
l’instrumentation de l’algorithme de consensus, concerne la détermination des informations nécessaires
et leur correspondance en terme d’événements à tracer. En effet, il s’est avéré que les informations
intéressantes dépendaient directement d’événements provenant de divers niveaux hiérarchiques (module de consensus, module de détection de défaillances, couche de fiabilisation).
La seconde phase quant à elle, impose une mise en relation des événements collectés et enregistrés
sur différents sites distants, ceux-ci étant estampillés par une date locale. Bien que diverses techniques
peuvent être envisagées pour l’obtention d’une datation globale en cours d’expérience, devant l’instabilité de notre environnement et par soucis de simplification, nous avons opté pour la réalisation d’un
post-traitement des datations locales. Aussi, comme nous le verrons par la suite, la transformation des
différentes dates locales associées aux événements survenus sur différents sites, en une datation commune doit être réalisée (approximation d’horloge globale). Or, dans le cadre de cette validation d’algorithme, une datation globale approchée est suffisante. En effet, seul l’ordre d’exécution des événements
sur les différents sites est nécessaire à la réalisation de traces d’exécution post-mortem. Cependant, pour
pallier à un manque d’interaction entre certains sites distants pouvant complexifier la mise en œuvre
d’une datation globale, une entité extérieure peut être ajoutée dans les expérimentations afin de capter
les messages en transit et d’enregistrer l’ordre de passage de ces messages sur le réseau.
Aussi, afin de permettre un ordonnancement des événements distants, seuls les événements de type
envois et réceptions de messages estampillés de leur date locale sont utilisés. Or, un des problèmes
majeurs à l’extrapolation d’une datation commune réside dans la complexité à estimer le délai d’ache5
minement d’un message. En effet, comme l’illustre la figure 3, chaque événement correspondant à un
envoi de message estampillé (par une date D1) et enregistré au niveau du module de consensus, ne sera
réellement émis sur le réseau sans fil qu’à une date ultérieure (D2). Il en est de même pour l’événement
de réception du message qui sera estampillé par la date locale D4, mais aura été reçu sur le site concerné
à la date D3. Aussi, face à l’instabilité de l’environnement considéré et à l’hétérogénéité des machines
utilisées, le délai d’acheminement des messages peut être fortement variable.
Date Emission
Locale (D1)
Module Consensus
Délai inter−émissions DD
Détecteur
Site
Emetteur
D2
Réseau
Délai inter−émissions réseau
Délai entre deux réceptions réseau sur le site récepteur
Réseau
D3
Site
Récepteur
Détecteur
Délai inter−réceptions DD
Module Consensus
Date Réception
Locale (D4)
F IG . 3 – Décomposition des communications
3. Prises de mesures - Instrumentation
La collecte d’informations est une étape délicate car la prise de mesure est réalisée en cours d’exécution
et a donc une influence directe sur l’exécution en elle-même.
Cette phase d’instrumentation passe impérativement par la définition préalable de ce que l’on souhaite
observer, puis par la détermination des informations permettant de mettre en valeur l’évolution de l’état
du système. Aussi, une étape importante concerne la définition du modèle relationnel existant entre un
état à observer et les événements exécutés permettant d’identifier cet état et de le retracer ultérieurement.
Autrement dit, la principale difficulté réside donc dans l’identification des événements permettant de
déduire l’état du système à un instant donné (événements représentatifs de l’état du système).
Dans notre contexte, nous souhaitons pouvoir analyser le comportement de l’algorithme de consensus et à terme être capable de visualiser son exécution post-mortem. Pour ce faire, il est impératif de
conserver les informations concernant entre autres les divers échanges de messages effectués ainsi que
les états successifs des entités participantes, c’est à dire leur état d’évolution entre l’initiation du consensus et la prise de décision. Aussi, chaque événement (réception d’un message, émission d’un message,
changement d’état, etc...) doit être enregistré localement par chacune des entités composant le système
et estampillé notamment par sa date locale.
Concrètement, pour comprendre le déroulement de l’algorithme de consensus, les principaux événements devant
Enregistrements des
Module de Consensus
changements d’état relatifs
être récoltés correspondent aux émisà l’algorithme de consensus
sions et réceptions des différents types
Enregistrements
Module de
de messages (Estimation, ProposiDétecteur
Enregistrements des
des suspicions
Fiabilisation
de Défaillances
retransmissions de
tion, Ack, Nack, Decision, Forward)
(expirations des
messages
temporisations)
par les divers sites, ainsi que l’état couRESEAU
rant (Init, CWaitEstimate, CWaitAck,
PWaitProposition, PWaitDeciF IG . 4 – Extraction d’informations à différents niveaux
sion, End) de chacune des entités mises en jeu. Cependant, une telle prise de données est restrictive et ne sera représentative que des événements marquant l’exécution de l’algorithme au niveau du module de consensus (figure 4), mais ne
APPLICATIONS
6
dénotera en aucun cas des causes environnementales influençant cette exécution. Une trace ainsi obtenue pourra par exemple relater du passage au ”round” suivant d’une entité, - ce qui indique implicitement la suspicion du coordinateur courant par cette entité -, mais ne suffira pas à déduire par exemple
la déconnexion de l’une de ces entités. Aussi, une extraction de données particulières au niveau du module de détection de défaillances et du module de fiabilisation des communication semble également
nécessaire. Par exemple, l’information retournée par un détecteur de défaillances lorsqu’il est interrogé,
peut être mémorisée de façon à faciliter l’analyse et l’interprétation des traces d’exécutions générées
ensuite. De même au niveau du module de fiabilisation, la trace des messages retransmis, ou tout du
moins le nombre de retransmissions effectuées pour un même message, paraı̂t indispensable à une analyse future des délais d’attente dans l’exécution de l’algorithme.
Aussi, vis à vis de l’algorithme de consensus étudié, la phase d’instrumentation nécessite une collecte
d’informations à différents niveaux hiérarchiques.
Par ailleurs, la prise de mesures représente une perturbation dans l’exécution normale et a donc un
coût (prise de temps, enregistrement des informations dans un fichier) dont il faudra tenir compte lors
de l’interprétation des données ainsi récoltées. De plus, ce coût lié à la prise de mesures n’a pas le
même impact suivant le type d’entités concerné. En effet, la collecte d’informations aura davantage de
conséquences sur une entité aux ressources limitées (un PDA par exemple) que une machine puissante
(PC, ordinateur portable, etc...). Aussi, afin de limiter au maximum ce coût lié à l’enregistrement d’informations, une analyse précise des événements significatifs et nécessaires à la fois à l’évaluation et à la
visualisation, est effectuée.
De ce fait, l’objectif étant la visualisation du déroulement de l’algorithme de consensus, les traces récoltées
proviendront essentiellement du niveau module de consensus, mais s’appuieront également en complément sur les enregistrements relatant d’informations issues des modules de détections de défaillances
et de fiabilisation, indispensables à la représentation (figure 4).
Enfin, un formalisme précis du traçage est défini ensuite. En effet, chaque enregistrement d’événement
doit contenir l’ensemble des informations nécessaires à une analyse future (par exemple, la date d’occurrence, un identifiant unique de l’événement dans le cas où plusieurs événements similaires peuvent
se produire, etc...). Aussi, une étude sur la ”manière” de récupérer les informations est nécessaire afin
de pouvoir enregistrer un maximum d’informations en un minimum de données.
4. Visualisation
Les différents événements enregistrés sur les diverses entités participant aux élections, une fois ordonnés de façon
cohérente et datés approximativement dans un référentiel
temporel commun, peuvent être représentés graphiquement. Pour ce faire, nous avons choisi d’utiliser l’environProcessus
Processus
Processus
Détecteur
Consensus
Retransmission
nement de visualisation Pajé [9].
Aussi, l’obtention de diagrammes ”post mortem” représentatifs des exécutions de l’algorithme de consensus expériHeartbeats Suspicions
Compteurs
menté, nécessite que l’ensemble des traces récupérées soit
États
Messages
converti dans un format compatible avec l’outil de visualisation. La figure 5 représente le modèle de visualisation
Init
Estimate
choisi. Ce modèle se décompose en trois parties, une pour
Proposition
CWaitEstimate
Ack
CWaitAck
chaque module de l’architecture considérée (module de
Nack
PWaitProp
consensus, module de détection de défaillances et couche
Decision
PWaitDecision
de fiabilisation) ; mais ne présentant dans cet article que
Forward
End
les traces issues du module de consensus, seul le modèle
F IG . 5 – Modèle de visualisation
associé à ce module est détaillé. Ainsi, comme illustré dans
cette figure, pour chaque entité (site), les états introduits dans l’algorithme de consensus différents types
de messages échangés seront représentés visuellement.
SITES
7
Durée du consensus
(pour l’initiateur : PC5)
Attente majorité d’estimations
ms
0
5
10
15
20
25
30
Acquittement tardif
force le renvoi agressif de la décision
Attente majorité d’Ack
35
40
45
50
55
60
65
70
75
80
85
90
95
100
PC−0
PC−5
PDA−1
PDA−2
PDA−3
PDA−4
DECISION Phase
ESTIMATE Phase
PROPOSITION Phase
F IG . 6 – Diagramme post-mortem d’une élection ne donnant lieu à aucune suspicion
Exemple de visualisation obtenue :
Sur le diagramme 6, chaque ligne correspond à un module de consensus participant à l’algorithme et
permet d’illustrer les changements d’états survenus au cours du consensus. De plus, les communications entre les différentes entités sont représentées par des flèches allant de l’émetteur vers le ou les
récepteur(s). Il est important de constater que la diffusion d’un message est représentée graphiquement
par plusieurs flèches ayant la même origine, mais il est bien évident qu’en réalité un seul message est
réellement émis.
Comme illustré dans cette trace d’exécution, l’initiation du consensus est effectuée par un des participants, l’entité PC-5, qui envoie sa valeur d’Estimation au coordinateur de ce round (PC-0), déclenchant
ainsi l’implication cette l’entité. Le coordinateur diffuse alors sa valeur d’Estimation, et se met en attente de la réception des estimations d’une majorité de participants. Aussi, dès que le coordinateur a
obtenu une majorité d’estimations, il génère une proposition qu’il diffuse aussitôt. On peut noter par
exemple que la valeur d’estimation de l’entité PDA-4 n’est pas utilisée pour le calcul de la proposition
car elle parvient plus tard au coordinateur. Ceci n’empêche pas pour autant à cette entité de poursuivre
sa participation à l’obtention d’une décision commune. Lorsqu’une majorité d’acquittements est parvenue au coordinateur (PC-0), celui-ci peut dès lors diffuser la décision. Enfin, lorsque le coordinateur
reçoit les messages d’acquittement des entités PDA-1 et PDA-4, il diffuse de nouveau la décision (message de type Forward).
5. Exemples détaillés
L’algorithme de consensus présenté précédemment ayant été implanté sur un réseau ad-hoc sans fil de
type 802.11b, de nombreuses prises de mesures ont été réalisées afin de permettre la génération de traces
d’exécution et ainsi de valider expérimentalement le fonctionnement de l’algorithme. Aussi, après avoir
décrit le contexte expérimental dans lequel les expériences ont été réalisées, nous présentons les résultats
obtenus en terme de diagrammes d’exécution issus de ces différents tests.
5.1. Conditions Expérimentales
Une plateforme Java a été mise en place sur un réseau sous-jacent de type réseau 802.11b en mode adhoc, et dans lequel aucun mécanisme de routage ou d’encryption n’ont été mis en place. La configuration
matérielle des différentes entités mises en jeu dans nos expériences est proposée dans le tableau 1 en
annexe 1.
L’implémentation des détecteurs de défaillances retenue pour ces expérimentations s’appuie sur la mise
en place d’un mécanisme de ”heartbeat”. Aussi, dans ce modèle d’implémentation, deux paramètres
principaux sont associés aux détecteurs de défaillances : la période de heartbeat et le délai de temporisation [15]. De ce fait, les observations résultantes seront à interpréter en fonction des valeurs de ces
paramètres.
Par ailleurs, la réalisation d’un consensus nécessite que chaque entité composant le système étudié, à
savoir les entités participant à l’algorithme de consensus, possède préalablement :
• un identifiant unique,
8
• un fichier contenant la liste des participants (identique pour chaque entité),
• un algorithme de sélection (politique de choix d’une valeur parmi plusieurs).
Enfin, la fiabilisation des communication est réalisée par réémission régulière. Un paramètre de ”polling” permet ainsi de régler à la fois par polling la fréquence d’interrogation du détecteur de défaillances
et la retransmission des messages.
Description des expériences et réglages des paramètres :
Les résultats présentés ici ont été obtenus lors d’expérimentations impliquant 7 entités. Afin de capturer
les communications réseau sans interférer dans les expérimentations, une entité particulière (un ordinateur portable) ne participant pas réellement aux tests de consensus, a fait office de ”sniffer”. Ainsi,
hormis cette entité au rôle particulier, toutes les autres entités exécutent l’algorithme de consensus distribué dont les principes ont été introduits précédemment.
Précisons que : d’une part, le capteur de trafic réseau n’est pas intrusif et, d’autre part, les entités mises
en jeu restent physiquement à la même place et toutes ont leur mode d’économie d’énergie inactivé et
de plus restent alimentées électriquement tout au long des expériences.
Par ailleurs, chacune des expériences effectuée consiste en une série de 1000 élections consécutives (identifiées de manière unique) sans aucune synchronisation additionnelle, chaque élection étant initiée par
un des participants (par forcément le même). Rappelons le principe d’une élection dans cette série : une
élection est réalisée grâce à l’exécution de l’algorithme de consensus, afin d’obtenir d’un accord sur la
proposition d’un leader parmi les différents participants. Pour ce faire, lorsqu’une élection est engagée,
chaque participant soumet sa propre estimation (générée aléatoirement dans nos expérimentations).
La politique de choix d’une valeur parmi plusieurs a été déterminé tel que l”algorithme d’élection
sélectionne le participant ayant la valeur d’estimation la plus grande (celui ayant l’adresse IP la plus
grande en cas d’égalité sur la valeur d’estimation).
D’autre part, le paramétrage retenu dans les expérimentations proposées dans cet article, est donné par :
• 500 ms pour la période d’émission des heartbeats (2 pulsations par seconde au niveau du module de
détection de défaillances),
• 1500 ms pour la valeur de temporisation (temps écoulé avant la suspicion du site distant par le
détecteur de défaillances n’ayant reçu aucune information en provenance de ce site).
• 2000 ms pour le paramètre de ”polling” (interrogation du détecteur de défaillances et retransmission
éventuelle du dernier message précédemment émis).
5.2. Traces d’exécution obtenues
Comportement ”idéal” :
La trace d’exécution 6 illustre les différentes étapes du déroulement d ’une élection particulière dans
un cas ”idéal” (aucune perturbation extérieure, aucune suspicion, ...). Cette trace d’exécution permet
de bien distinguer les 3 phases du déroulement d’une élection : la phase d’Estimation, la phase de
Proposition et la phase de Decision. On peut ainsi retrouver les différentes phases introduites dans le
modèle théorique (figure 1).
Il est à noter que l’élection représentée par le diagramme 6 a été réalisée en un round seulement,
round durant lequel le coordinateur était l’entité PC-0. Ceci est bien visible sur le diagramme puisque
les groupes de messages (diffusions) sont en partance de l’entité PC-0 et que toutes les autres entités
émettent vers cette entité PC-0.
De plus, dans cette trace, la représentation d’une diffusion de messages utilisée met bien en évidence les
réceptions différées suivant les sites (latences variables de transmission des messages). Ce délai inclut
d’une part les transmissions réseau ainsi que la traversée des différentes couches, du niveau UDP/IP à
l’application Java (remontée de la pile).
Par ailleurs, comme l’illustre ce diagramme, le temps de réalisation d’un consensus dans de telles conditions est inférieur à 1 seconde (temps pour que toutes les entités aient connaissance de la décision).
Bien sûr ce temps inclut le coût dû à l’instrumentation, et dépend directement du nombre d’entités impliquées et du réglage des paramètres utilisé. Cependant, une telle observation permet notamment de
comparer le comportement des différentes entités (il semble par exemple que PC-5 reçoive plus rapidement les informations que les PDAs) et l’identification des phases à optimiser. Une analyse statistique
9
peut être menée pour caractériser les latences [13].
Avec une suspicion :
La trace d’exécution 7 permet d’illustrer le déroulement d’une élection pendant laquelle un des participants suspecte le coordinateur.
PDA2 suspecte le coordinateur (PC0)
et envoie un NACK
NACK message
ms
0
5
10
15
20
25
30
35
Réception NACK après émission décision
45
75
50
40
55
60
65
70
80
85
90
95
100
PC0
PC5
PDA1
PDA2
PDA3
PDA4
ESTIMATION Phase
(Round 1)
DECISION Phase (Round 1)
PROPOSITION Phase (Round 1)
ESTIMATION Phase (Round 2)
F IG . 7 – Diagramme post-mortem d’une élection pendant laquelle une fausse suspicion a lieu
En effet, venant à suspecter l’absence du coordinateur actuel (PC-0), l’entité PDA-2 envoie un nonacquittement (message Nack) en réponse à la Proposition faite par le coordinateur, puis passe au round
suivant (cf figure 2). Or, comme le montre la trace d’exécution, cette suspicion peut être qualifiée de
”fausse suspicion” car le coordinateur de ce round (PC-0) n’est pas réellement absent. Aussi, dans ce
cas de figure l’ordre des événements a une grande importance. En effet, avant de réceptionner ce nonacquittement (message Nack), le coordinateur ayant préalablement reçu une majorité d’acquittements
positifs (messages de type Ack), a déjà diffuser un message de Decision. Aussi, en réponse à ce message
Nack, le coordinateur (PC-0) diffuse simplement un nouveau message contenant sa valeur de Decision.
On peut ainsi constater la désynchronisation des participants puisque ceux-ci sont dans des états différents (rounds différents, phases différentes). Cependant, lorsqu’un participant connaı̂t la valeur de Decision, à chaque réception d’un message estampillé par l’identifiant du consensus il répond par diffusion
de cette valeur de décision (message FORWARD). Ainsi, la fin de la trace 7 montre que tous les participants finissent par connaı̂tre la valeur de décision.
Au vu de cette trace d’exécution, il apparaı̂t qu’une optimisation de la diffusion agressive de la décision
(message Forward) soit envisageable afin de diminuer la quantité de messages émis tout à préservant
la garantie de terminaison de l’algorithme.
Avec déconnexion d’une entité :
Tout d’abord, la déconnexion imprévisible d’une entité participante est considérée. Bien sûr, si l’entité
se déconnectant brutalement n’est pas coordinatrice du round (ou des rounds) en cours, sa déconnexion
n’aura pas de véritable impact sur la résolution de l’élection, si ce n’est sur la durée qui peut éventuellement être augmentée. Aussi, l’étude menée a porté sur la déconnexion de l’entité coordinatrice du
premier round (dans la liste initiale des participants) et son impact sur les performances.
Lorsque le premier coordinateur est absent, et si aucune autre perturbation n’intervient au cours de
l’expérience, toutes les élections sont réalisées en deux rounds. Ceci est illustré dans la trace d’exécution
8.
Comme on peut le voir au début de la trace 8 (figure 9), tous les participants sont présents. Cependant
PC-0, le premier coordinateur, se déconnecte (ou subit une défaillance) durant le premier round. Cette
déconnexion (ou défaillance) peut être qualifiée de déconnexion définitive (ou défaillance définitive)
par rapport à l’élection en cours. Après un délai dépendant des valeurs attribuées aux paramètres
10
Temporisation de changement de round
Déconnexion coordinateur PC0
0
100
200
300
400
500
600
700
800
900
1000
1100
1200
1300
1400
1500
1600
1700
1800
1900
2000
2100
2200
PC0
PC5
PDA1
PDA2
PDA3
PDA4
ROUND 2
ROUND 1
F IG . 8 – Trace d’exécution post-mortem d’une élection où le coordinateur du premier round (PC-0) se
déconnecte (ou subit une défaillance)
Déconnexion du coordinateur PC0
après diffusion de la Proposition
Émission Proposition
50
60
70
80
90
100
110
120
130
140
150
160
170
180
190
200
210
220
230
240
250
260
PC0
PC5
PDA1
PDA2
PDA3
PDA4
ESTIMATE messages
PROPOSITION Broadcast
ACK messages
F IG . 9 – Zoom sur le début du round 1 dans la trace 8
Suspicion de PC0 par PC5 qui déclenche le round 2 (coordinateur : PDA1)
2100
2105
2110
2115
2120
2125
2130
2135
2140
2145
2150
2155
2160
2165
2170
2175 2180
2185
2190
2195
2200 2205
2210
2215
PC0
PC5
PDA1
PDA2
PDA3
PDA4
ESTIMATE messages
PROPOSITION Broadcast
DECISION Broadcast
ACK Messages
FORWARD Broadcast
F IG . 10 – Décision lorsque le premier coordinateur est absent (fin de la trace 8)
des détecteurs de défaillances, les entités participantes finissent par passer au round suivant (fin de
la trace 8). L’illustration du second round où l’entité PDA-1 est coordinatrice est donnée dans la trace
d’exécution post-mortem 10.
6. Conclusion
Basé sur l’utilisation d’un mécanisme de détections de défaillances, un algorithme de consensus spécifiquement adapté à notre environnement fortement instable - réseaux sans fil ad-hoc composé d’entités
hétérogènes - a été développé et implanté. Dans cet article, nous avons présenté l’approche expérimentale
utilisée afin de valider le bon fonctionnement de cet algorithme de consensus, à savoir vérifier que le
comportement de cet algorithme est conforme à ses spécifications. Pour ce faire, divers scénarios mis en
œuvre dans nos expérimentations (pertes de communications, défaillances ou déconnexions d’une ou
de plusieurs entités) ont permis la génération de traces d’exécutions post mortem et par suite une analyse
comportementale basée sur les observations ainsi obtenues.
Par ailleurs, les traces d’exécution ainsi reconstruites permettent également l’obtention d’évaluations
des durées d’exécution de l’algorithme. En effet, les diagrammes ainsi réalisés sont des outils de visualisation du temps passé dans chacune des phases de l’algorithme de consensus. Bien que les coûts liés
à la prise de mesures pendant l’exécution de l’algorithme soient à prendre en compte, les durées ainsi
observées sont cependant relativement significatives et peuvent être comparées.
Aussi, en vue de l’optimisation de cet algorithme de consensus, une analyse fine de ces durées d’exécution sera publiée ultérieurement [13]. Elle permet la mise en place d’un réglage adéquat des paramètres
liés au module de consensus mais également des paramètres des détecteurs de défaillances.
11
Bibliographie
1. Aguilera, M. and Chen, W. and Toueg, S. – Failure Detection and Consensus in the Crash-Recovery
Model. In : International Symposium on Distributed Computing, pp. 231–245.
2. Canetti, R. and Rabin, T. – Fast Asynchronous Byzantine Agreement with Optimal Resilience. In :
In 25th ACM Symposium on Theory of Computing. pp. 42–51. – San Diego, California, United States,
1993.
3. Chandra, T. and Toueg, S. – Unreliable Failure Detectors for Reliable Distributed Systems. Journal of
the ACM, vol. 43, n˚ 2, mars 1996, pp. 225–267.
4. Durand, Y. and Perret, S. and Vincent, J-M. and Marchand, C. and Ottogalli, F-G. and Olive, V. and
Martin, S. and Dumant, B. and Chambon, S. – SIDRAH : A software infrastructure for a resilient
community of wireless devices. In : Smart Objects Conference, pp. 134–137. – Grenoble, France, 2003.
5. Fischer, M. and Lynch, N. and Paterson, M. – Impossibility of Distributed Consensus with One
Faulty. Journal of the ACM, vol. 32, n˚ 2, 1985, pp. 374–382.
6. Haddad, Y. – Performance dans les systèmes répartis : des outils pour les mesures. – Orsay, France, Thèse
de doctorat, Université Paris-Sud, 1988.
7. Hurfin, M. and Mostefaoui, A. and Raynal, M. – Consensus in Asynchronous Systems Where Processes
Can Crash and Recover. – Rapport technique n˚ IRISA Publication Interne, PI-1144, 1997.
8. Hurfin, M. and Raynal, M. – A Simple and Fast Asynchronous Consensus Protocol Based on a Weak
Failure Detector. Distributed Computing, vol. 12, n˚ 4, 1999, pp. 209–223.
9. Laboratoire Informatique et Distribution. – Pajé Home Page.
http ://www-apache.imag.fr/software/paje/.
10. Lamport, L. – Time, Clocks, and the Ordering of Events in a Distributed System. Communications of
the ACM, vol. 21, n˚ 7, juillet 1978, pp. 558–566.
11. Lynch, N. – Distributed Algorithms. – Morgan Kaufmann Publishers Inc., 1996.
12. Maillet, E. – Le traçage logiciel d’applications parallèles : conception et ajustement de qualité. – Grenoble,
France, Thèse de doctorat, Institut National Polytechnique de Grenoble, 1996.
13. Marchand, C. – Mise au point d’algorithmes répartis dans un environnement fortement variable, et
expérimentation dans le contexte de pico-réseaux. – Thèse de doctorat, Laboratoire ID-IMAG, décembre
2004.
14. Marchand, C. and Perret, S. and Vincent, J-M. – A Consensus based Middleware for Resilient Applications in Wireless Networks. – Submitted to IPDPS 2005.
15. Marchand, C. and Vincent, J-M. – Détecteurs de défaillances et qualité de service dans un réseau
ad-hoc hétérogène. In : Conférence Française sur les Systèmes d’Exploitation (CFSE’3), éd. par INRIA,
pp. 525–536. – La Colle sur Loup, France, octobre 2003.
16. Oliveira, R. and Guerraoui, R. and Schiper, A. – Consensus in the Crash-Recover Model. – Rapport
technique n˚ TR-97/239, 1997.
17. Ottogalli, F-G. – Observations et analyses quantitatives multi-niveaux d’applications à objets réparties. –
Grenoble, France, Thèse de doctorat, Université Joseph Fourier, 2001.
18. Schiper, A. – Early Consensus in an Asynchronous System with a Weak Failure Detector. Distributed
Computing, vol. 10, n˚ 3, avril 1997, pp. 149–157.
19. Tel, G. – Introduction to Distributed Algorithms. – Cambridge University Press, 1994.
20. Tixeuil, S. – Auto-Stabilisation Efficace. – Thèse de doctorat, Université Paris Sud, 2000.
12
ANNEXE 1 : Configuration matérielle
PC
PDA
Laptop
Type
HP Workstation
HP Ipaq 3800
HP Omnibook
Architecture
X86 (P4)
Strong ARM
X86 (PIII)
Processeur
2.4 GHz
207 MHz
1.0 GHz
Mémoire
512 MB
32 MB
256 MB
OS
Linux Debian (kernel 2.4)
Linux Familiar (kernel 2.4)
Linux Debian (kernel 2.4)
JVM
Sun Java JRE 1.4.2 01-b06
Jeode EVM Version 1.10.2
Sun Java JRE 1.4.2 01-b06
Wireless Card
Compaq Orinoco 802.11b
Compaq Orinoco 802.11b
Compaq Orinoco 802.11b
Nombre
1
4
2
TAB . 1 – Configuration matérielle des machines.
ANNEXE 2 : Extrapolation d’une horloge globale
Étant donné que chaque entité composant le système distribué considéré se réfère à sa propre horloge
physique, l’objectif est de définir une horloge de référence permettant d’avoir une datation globale. En
effet, définir des relations entre une horloge de référence et chacune des horloges locales de chaque
site du système permet d’avoir une approximation d’horloge globale. Cette solution proposée dans
différents travaux [6, 12, 17] permet de calculer des facteurs correctifs pour chaque datation locale afin
de les projeter dans un référentiel de temps commun. Ce principe de datation globale qui consiste en
une synchronisation des différentes datations locales utilisées, ne cherche pas à extrapoler une horloge
globale précise mais simplement à définir une relation d’ordre partielle entre les événements s’étant
produits sur différents sites répartis.
D’après Lamport [10], dans un système distribué, une relation partielle de précédence causale peut être
définie comme suit :
Définition :
On dit qu’un événement ei précède causalement un événement ej (ei ≺ ej ) si et seulement si une des
trois conditions suivantes est vérifiée :
1. les événements ei et ej se produisent sur le même processus et ei se produit avant ej localement.
2. les événements ei et ej se produisent sur deux processus distincts et ei est l’émission d’un message tandis que ej est la réception de ce même message.
3. ∃k tel que ei ≺ ek et ek ≺ ej
Chaque événement, initialement daté localement, doit donc être daté approximativement dans un référentiel
commun. La date locale d’un événement ei s’exprime donc dans le référentiel global par la formule
mathématique suivante :
i
i
deref
= αdeloc
+β
(1)
où α représente la dérive et β le décalage initial.
Aussi, si l’on ne s’intéresse qu’aux événements de types émissions et réceptions de messages, la relation
de causalité existant entre les divers événements est basée sur le fait que la date d’émission d’un message
Ei exprimée dans le référentiel global précède forcément la date de réception de ce message Ri dans le
même référentiel :
Ri
i
dE
ref ≤ dref .
Ri
i
Si le message i a été émis par le site A à la date dE
A et réceptionné par le site B à la date dB , on a donc :
Ri
i
αA dE
A + βA ≤ αB dB + βB
13
(2)
Bien évidemment, de telles relations existent entre les différents sites ayant réalisé au moins une communication entre eux. Cependant, suivant le type de protocole réparti testé expérimentalement, il peut
s’avérer que certaines paires de sites n’échangent aucun message pendant l’exécution. En effet, dans
l’exemple de l’algorithme de consensus, le principe théorique de fonctionnement ne définit des communications seulement du coordinateur vers les autres participants ou des participants vers l’entité coordinatrice du ”round”. Aussi, dans ce cas, quelques soient les conditions expérimentales, le consensus
se déroulant nécessairement en un ”round” au minimum, le référentiel de temps du premier coordinateur (premier site dans la liste des coordinateurs) semble être le plus adapté comme référence de temps
global.
De manière générale, on en vient alors à chercher les αk et βk (k représentant l’ensemble des sites mis
en jeu), tel que :
Ri
i
αA dE
A + βA ≤ αB dB + βB , ∀i
(3)
i
αB dE
B
(4)
+ βB ≤
i
αA dR
A
+ βA , ∀i
Cependant, face au nombre important d’événements enregistrés, les calculs réalisés portent sur les enveloppes convexes de chaque type d’événements (émissions, réceptions) et sur chacun des sites afin de
réduire l’ensemble des contraintes [6].
Pour chaque paire de sites distants du système, on cherche donc une droite passant entre deux enveloppes convexes (définies par l’équation (3)) afin de satisfaire toutes les contraintes, c’est à dire respecter
les relations d’ordre existantes entre les événements survenus sur ces deux sites.
Le système à résoudre se ramène donc à :
αA
≤ v2
αB
βA − βB
≤ v4
v3 ≤
αB
v1 ≤
(5)
(6)
Bien sûr, des relations similaires existent entre chaque couple de sites distants mis en jeu dans le système
ayant des interactions au cours de l’exécution d’une expérience.
Ainsi, on définit les αk et βk , k = 0...N (où N est le nombre de sites répartis dans le système), de
façon à ce que toutes les relations de causalité soient respectées. De ce fait, rien n’assure de l’exactitude
de la datation dans le référentiel global, mais seulement de l’ordre des événements en relation directe.
Aussi, la nouvelle datation ainsi obtenue (datation globale) peut éventuellement être biaisée du fait de
l’imprécision dans la prise de dates (top d’horloge, dérive due aux températures, le fait que la prise de
date fasse suite à l’événement, ...). De plus, les événements n’ayant aucune relation de causalité entre
eux sont susceptibles de ne pas être placés dans l’ordre de leur exécution réelle.
Finalement, cette méthode permet simplement de construire une approximation linéaire d’une horloge
globale qui respecte analytiquement la causalité des événements de l’exécution observée.
14