Aller au contenu principal

Superviser un système : lois continues et détection d'anomalies

Ce que ce chapitre apporte

  • Rappeler comment un système d'exploitation gère les processus et la mémoire.
  • Interpréter les métriques classiques de supervision et leur mode d'échantillonnage.
  • Reconnaître les lois continues usuelles : normale, log-normale, exponentielle, Weibull.
  • Vérifier graphiquement et par un test qu'une série suit une loi donnée.
  • Détecter des anomalies par z-score, écart interquartile et statistiques robustes.
  • Choisir un seuil de vigilance en connaissant son taux de fausses alertes.

Une semaine de mesures relevées chaque minute sur un parc de serveurs : charge processeur, mémoire, trafic réseau, température. Des milliers de lignes, dont l'immense majorité ne dit rien. L'enjeu n'est pas d'en calculer la moyenne, c'est de déclencher la bonne alerte au bon moment. Ce chapitre suit ce trajet : comprendre ce que mesurent ces métriques, reconnaître la loi que suit chacune (les lois y sont continues, là où le chapitre sur le risque les comptait une à une), et poser des seuils qui ne noient pas l'équipe sous les fausses alertes.

Ce que mesure la supervision

Superviser, c'est observer un système en fonctionnement pour décider s'il faut intervenir. Encore faut-il savoir ce que les chiffres décrivent.

Processus et ordonnancement

Le système d'exploitation gère le matériel et arbitre entre les programmes. Un processus est un programme en cours d'exécution, avec sa mémoire propre et son état ; l'ordonnanceur (scheduler) répartit le temps de processeur entre les processus prêts, en leur accordant des tranches de quelques millisecondes.

Ce que « 100 % de CPU » veut dire

La charge processeur est la proportion de temps pendant laquelle le processeur n'était pas inactif, sur l'intervalle de mesure. À 100 % il travaille sans interruption : ce n'est pas une panne, c'est un processeur utilisé. Le signal d'alerte est ailleurs : dans la file d'attente des processus prêts, qui dit combien de tâches attendent leur tour.

Une moyenne de charge cache le régime

Un processeur à 50 % en moyenne sur une minute peut avoir tourné à mi-charge tout du long, ou avoir passé trente secondes à 100 % et trente à 0 %. Pour un utilisateur, ces deux situations n'ont rien à voir : la seconde donne des à-coups perceptibles. Plus l'intervalle de mesure est long, plus il en cache : c'est pourquoi on relève une mesure par minute, et pas une moyenne horaire.

Mémoire

La mémoire physique (RAM) est découpée en pages de taille fixe. Chaque processus voit un espace d'adressage virtuel continu, que la table des pages traduit en adresses physiques : c'est ce qui permet l'isolation entre processus et l'illusion d'une mémoire plus grande que la RAM.

Quand la RAM manque, le système écrit des pages inutilisées sur disque, le swap. Un accès disque étant des milliers de fois plus lent qu'un accès RAM, un système qui swappe activement s'effondre en performance.

La métrique mémoire à surveiller n'est pas celle qu'on croit

Une mémoire « utilisée à 95 % » est normale : le système garde en cache tout ce qu'il peut, et libère à la demande. Ce qui compte, c'est la mémoire disponible, et surtout l'activité de swap. Un serveur en swap soutenu est en train de mourir, même si sa charge CPU paraît saine.

Une série temporelle

Chaque métrique relevée à intervalle régulier forme une série temporelle. Elle se distingue d'une série statistique ordinaire sur deux points : les observations sont ordonnées, et elles ne sont pas indépendantes, la charge de cette minute ressemble à celle de la précédente.

La conséquence, immédiate

Tous les indicateurs du chapitre 3 restent calculables, mais ils ignorent le temps. Une moyenne journalière écrase la différence entre le jour et la nuit ; un histogramme de la charge sur 24 heures mélange deux régimes distincts. Il faut donc tracer la série dans le temps avant de la résumer : c'est le même réflexe que le nuage de points, avec le temps en abscisse.

Variables aléatoires continues

Une température, une durée, un débit peuvent prendre n'importe quelle valeur d'un intervalle. On ne peut plus lister les P(X=x)P(X = x) comme pour une loi discrète du chapitre sur les probabilités : elles valent toutes zéro.

Définition

Une variable aléatoire continue est décrite par sa densité de probabilité ff, une fonction positive d'aire totale 1. La probabilité se lit comme une aire, c'est-à-dire une intégrale au sens du chapitre sur l'intégration :

P(aXb)=abf(x)dxP(a \leq X \leq b) = \int_a^b f(x)\,dx

La fonction de répartition F(x)=P(Xx)F(x) = P(X \leq x) est la primitive de la densité qui s'annule en -\infty.

Une densité n'est pas une probabilité

C'est le contresens le plus fréquent du passage au continu. La valeur f(x)f(x) n'est pas la probabilité d'obtenir xx : cette probabilité vaut zéro, puisqu'il y a une infinité de valeurs possibles.

Conséquence qui déroute : f(x)f(x) peut dépasser 1 sans rien casser. Une loi uniforme sur [0;0,1][0 ; 0{,}1] a une densité constante égale à 10, et c'est parfaitement correct : ce qui doit valoir 1, c'est l'aire sous la courbe, pas sa hauteur (10×0,1=110 \times 0{,}1 = 1).

Ce qui a un sens, c'est toujours une probabilité d'intervalle : P(a<X<b)P(a < X < b), l'aire entre aa et bb. D'où l'usage de la fonction de répartition FF, qui donne directement P(Xx)P(X \leq x), et le calcul P(a<X<b)=F(b)F(a)P(a < X < b) = F(b) - F(a).

Les quatre lois continues à connaître

Loi normale N(μ,σ2)N(\mu , \sigma ^2)

La courbe en cloche, symétrique autour de μ\mu. Elle apparaît dès qu'une grandeur est la somme de nombreux petits effets indépendants, c'est le théorème central limite. Une température de salle machine, un bruit de mesure : normal.

La règle des trois sigmas
  • 68 % des valeurs tombent dans [μσ;μ+σ][\mu - \sigma ; \mu + \sigma] ;
  • 95 % dans [μ2σ;μ+2σ][\mu - 2\sigma ; \mu + 2\sigma] ;
  • 99,7 % dans [μ3σ;μ+3σ][\mu - 3\sigma ; \mu + 3\sigma].

C'est de là que sortent tous les seuils « à 3 sigmas » de la supervision, et c'est valable uniquement si la série est normale.

μ−2σ30μ−σ35μ40μ+σ45μ+2σ50charge processeur (%)densité0,9545
± 2 σ
σ = 5

entre 30 et 50, l'aire vaut 0,9545. Déplacer l'écart-type : elle ne bouge pas.

Une charge processeur normale, de moyenne 40 % et d'écart-type 5. L'aire teintée couvre deux écarts-types de part et d'autre : 95 % du temps, la charge tombe entre 30 et 50 %.

Ce qu'il faut regarder n'est pas le sommet, c'est la vitesse à laquelle la courbe retombe de part et d'autre. Au bord de la zone teintée, elle est déjà très basse ; un peu plus loin, elle est collée à l'axe. C'est cette chute rapide qui donne son sens à un seuil : au-delà, il ne reste presque rien à laisser passer.

Loi log-normale

XX est log-normale si ln(X)\ln(X) est normale. Densité asymétrique, étalée à droite, définie sur les valeurs positives. Elle apparaît quand une grandeur est le produit de nombreux facteurs : temps de réponse, taille de fichiers, durée d'une requête qui traverse plusieurs couches.

C'est la loi des temps de réponse, et cela change tout

Sur une série log-normale, moyenne et médiane diffèrent nettement, et la règle des trois sigmas ne tient plus. Un seuil « moyenne + 3σ » y est franchi par bien plus de valeurs ordinaires qu'annoncé, et chacune déclenche une fausse alerte. C'est l'erreur la plus courante de la supervision : appliquer une règle normale à une grandeur qui ne l'est pas.

Les deux formes, l'une sous l'autre. Sur la première, regarder la symétrie : le côté gauche est l'image exacte du côté droit. C'est pour cela que mode, médiane et moyenne y tombent au même point, et que la règle des trois sigmas y est exacte.

μ−2σ34μ−σ42μ50μ+σ58μ+2σ66temps de réponse (ms)densité
Une loi normale. Mode, médiane et moyenne tombent au même point, et 99,7 % des valeurs restent à moins de trois écarts-types.

La seconde est la loi des temps de réponse, des tailles de fichiers, des durées de traitement. Elle est nulle en dessous de zéro, ce qu'une durée exige, et sa queue s'étire vers la droite sans fin. Deux choses à y regarder : l'écart entre les trois repères, qui mesure l'asymétrie, et le fait que la courbe ne rejoint jamais l'axe à droite. Sur cette loi, une valeur trois fois supérieure à la médiane se produit encore 7 % du temps, soit une minute sur quatorze. C'est ce que veut dire « queue épaisse », et c'est ce qui va mettre en défaut le seuil à trois sigmas.

mode20,85médiane36,6moyenne48,48temps de réponse (ms)densité
Une loi log-normale. Les trois indicateurs se séparent : le mode est le plus à gauche, la moyenne le plus à droite, et c'est la queue qui l'y traîne.
Pourquoi le seuil à trois sigmas s'effondre ici

Sur une loi normale, il reste 0,13 % des valeurs au-delà de xˉ+3σ\bar{x} + 3\sigma. Sur la log-normale de la figure, il en reste 1,85 %, quatorze fois plus. Sur un relevé à la minute, la règle promettait deux fausses alertes par jour ; elle en produit vingt-sept.

La raison se voit en repassant au logarithme, la seule échelle où cette loi est une cloche. La figure a pour moyenne 48 ms et pour écart-type 42 ms : le seuil xˉ+3σ\bar{x} + 3\sigma tombe donc à 175 ms. Or ln(175)5,16\ln(175) \approx 5{,}16, et sur l'échelle du logarithme la loi est centrée en μ=3,6\mu = 3{,}6 avec σ=0,75\sigma = 0{,}75. Le seuil n'est donc qu'à (5,163,6)/0,752,1(5{,}16 - 3{,}6)/0{,}75 \approx 2{,}1 écart-type du centre. Un seuil annoncé « à trois sigmas » n'en vaut que deux, et une cloche laisse 1,85 % de ses valeurs au-delà de 2,1 écarts-types. Le compte est bon, et le « trois » de l'énoncé était une illusion d'échelle : atteindre les 0,13 % promis demanderait un seuil à 347 ms, le double.

Le seuil bas est absurde pour la même raison, en pire : xˉ3σ\bar{x} - 3\sigma vaut ici 4812648 - 126, un nombre négatif, là où aucune durée n'existe. Une chute anormale du temps de réponse, signe d'un service qui renvoie des erreurs sans rien traiter, ne serait donc jamais signalée.

La parade tient en une ligne : sur une grandeur positive et étirée, travailler sur le logarithme, ou employer un critère de rang comme l'écart interquartile, qui ne suppose aucune forme.

Loi exponentielle E(λ)E(\lambda )

Densité f(x)=λeλxf(x) = \lambda e^{-\lambda x} sur les réels positifs, d'espérance 1/λ1/\lambda. C'est la loi des durées entre deux événements quand ces événements arrivent au hasard à taux constant, le pendant continu de la loi de Poisson.

Le mot « pendant » se démontre, et le raisonnement tient en trois phrases. Si les incidents suivent une loi de Poisson de taux λ\lambda, la probabilité d'en compter zéro sur une durée tt vaut eλte^{-\lambda t}, c'est le terme k=0k = 0 de la loi. Or n'avoir aucun incident avant l'instant tt revient exactement à dire que le temps d'attente XX du prochain incident dépasse tt. Donc P(X>t)=eλtP(X > t) = e^{-\lambda t}, et la fonction de répartition vaut F(t)=1eλtF(t) = 1 - e^{-\lambda t}, dont la dérivée est bien λeλt\lambda e^{-\lambda t}.

Compter les événements et mesurer l'attente entre eux sont donc deux lectures du même phénomène : λ\lambda y désigne le même taux, une fois par unité de temps, une fois comme inverse d'une durée moyenne.

Sa propriété caractéristique est l'absence de mémoire :

P(X>s+tX>s)=P(X>t)P(X > s + t \mid X > s) = P(X > t)

En clair, le membre de gauche se lit « sachant que le composant a déjà tenu la durée ss, probabilité qu'il tienne encore la durée tt ». Le membre de droite est la même probabilité pour un composant neuf. L'égalité dit donc que le passé ne compte pas : un composant qui a déjà tenu mille heures tombera en panne dans l'heure suivante avec la probabilité d'un composant sorti d'usine. C'est un modèle de panne accidentelle, pas d'usure.

Loi de Weibull

Elle généralise l'exponentielle en ajoutant un paramètre de forme kk, ce qui lui permet de représenter l'usure :

  • k<1k < 1 : taux de panne décroissant, mortalité infantile, les défauts de fabrication se révèlent tôt ;
  • k=1k = 1 : taux constant, c'est exactement l'exponentielle ;
  • k>1k > 1 : taux croissant, usure, la panne devient plus probable avec l'âge.

C'est la loi de référence en fiabilité, et celle qui décrit correctement la durée de vie d'un disque dur.

Reconnaître la loi d'après la question
  • Somme de petits effets → normale.
  • Produit de facteurs, série étalée à droite → log-normale.
  • Durée entre événements à taux constant → exponentielle.
  • Durée de vie avec usure → Weibull.

Vérifier la loi d'une série

Supposer une loi sans la vérifier est la fausse piste la plus coûteuse : tout ce qui suit en dépend. La vérification se fait en trois temps, du moins au plus formel.

L'histogramme avec la densité théorique superposée : c'est grossier mais cela élimine les erreurs grossières, qui sont les plus fréquentes.

Le diagramme quantile-quantile (QQ-plot) : on trace les quantiles observés contre les quantiles théoriques. Si la loi est la bonne, les points s'alignent sur la première bissectrice. Les écarts aux extrémités se lisent immédiatement, et ce sont justement les extrémités qui décident des seuils d'alerte.

Le test de Kolmogorov-Smirnov : il mesure l'écart maximal entre la fonction de répartition empirique et la théorique, et en tire une pp-valeur. Une pp-valeur inférieure à 0,05 conduit à rejeter l'hypothèse que la série suit la loi testée.

Ce que dit une pp-valeur, et ce qu'elle ne dit pas

La pp-valeur est la probabilité d'observer un écart au moins aussi grand que celui mesuré, en supposant que la série suit vraiment la loi testée.

Une pp-valeur de 0,03 se lit donc : « si la loi était exacte, un écart de cette ampleur ou plus n'arriverait que trois fois sur cent ». Comme c'est peu, on préfère renoncer à l'hypothèse plutôt que d'admettre avoir observé un cas rare.

La lecture fausse, et elle est très répandue

Une pp-valeur de 0,03 ne dit pas qu'il y a 3 % de chances que la loi soit la bonne, ni 97 % qu'elle soit fausse. Ce serait P(hypotheˋsedonneˊes)P(\text{hypothèse} \mid \text{données}), alors que le test calcule P(donneˊeshypotheˋse)P(\text{données} \mid \text{hypothèse}). Les deux ne sont pas égales, et le chapitre 2, sur le conditionnement et la formule de Bayes, a montré à quel point elles peuvent différer.

Une pp-valeur au-dessus de 0,05 ne prouve pas davantage que la loi est bonne : elle dit seulement que ces données-là ne suffisent pas à la rejeter. Absence de preuve n'est pas preuve d'absence.

Le test de Kolmogorov-Smirnov a deux limites qu'on tait souvent
  1. Si on estime μ\mu et σ\sigma sur les données mêmes, la pp-valeur du test est faussée dans le sens optimiste : le test accepte trop facilement. La correction s'appelle le test de Lilliefors.
  2. Sur un grand échantillon, le test rejette tout. Avec 10 000 points, le moindre écart devient significatif, or aucune série réelle ne suit exactement une loi théorique. Une pp-valeur minuscule sur 10 000 mesures ne dit pas que le modèle est inutilisable, elle dit que l'échantillon est grand.

Le code ci-dessous fabrique une journée de supervision (1 440 mesures à la minute) et confronte deux métriques à la loi normale.

main.py
Sortie
>_ Prêt à exécuter…

Les deux séries brutes sont rejetées, mais pas pour la même raison. L'asymétrie (skewness) le montre : franchement positive pour la latence, dont la queue s'étire à droite ; nulle pour la température, qui est pourtant rejetée elle aussi. Ce qui l'éloigne de la cloche, c'est le cycle jour/nuit. Cette oscillation de 1,5 °C est bien plus forte que le bruit de mesure. Elle étale les valeurs entre le creux et le sommet, et une sinusoïde passe plus de temps près de ses extrêmes qu'au milieu. La série mélange donc les heures chaudes et les heures fraîches, c'est-à-dire deux régimes. Une fois le cycle retiré, le résidu passe le test sans difficulté, comme le logarithme de la latence. Voici les séries brutes en images.

main.py
Sortie
>_ Prêt à exécuter…

Le QQ-plot de la latence s'écarte nettement de la droite dans le haut : les grandes valeurs observées dépassent de loin celles que prévoit la loi normale, et c'est exactement la zone qui décide des alertes. Celui de la température s'en écarte de l'autre manière, aux deux bouts, en forme de S : ses extrêmes restent en deçà de ceux d'une cloche, parce que le cycle borne la série.

Vérification rapideon peut se reprendre

1.Le z-score classique repose sur la moyenne et l'écart-type. Son défaut ?

2.Avant d'appliquer une règle à trois sigmas, il faut…

3.Un temps de réponse est souvent mieux décrit par…

4.Quel levier réduit les fausses alertes sans durcir le seuil ?

5.Une loi exponentielle est sans mémoire. Concrètement ?

Détecter une anomalie

Une anomalie est une observation qui s'écarte assez du comportement habituel pour mériter un regard. Ce chapitre s'en tient à des méthodes fondées sur des statistiques classiques (pas d'apprentissage automatique), et c'est amplement suffisant.

Le z-score

Définition

z=xxˉσz = \frac{x - \bar{x}}{\sigma}

En clair : retrancher la moyenne pour savoir de combien la valeur s'écarte du comportement habituel, puis diviser par l'écart-type pour exprimer cet écart dans l'unité de la série elle-même, sa dispersion ordinaire. Un zz de 2 se lit « deux fois la dispersion habituelle », et cela veut dire la même chose sur des degrés et sur des millisecondes. On signale généralement z>3|z| > 3.

Ce seuil de 3 n'a rien d'arbitraire : c'est la queue de distribution qu'il laisse passer qui le fixe.

μ−2σ-2μ−σ-1μ0μ+σ1μ+2σ2zdensité0,9973
± 3 σ
σ = 1

entre -3 et 3, l'aire vaut 0,9973. Déplacer l'écart-type : elle ne bouge pas.

Le seuil à trois sigmas. L'aire teintée vaut 0,9973 : il reste 0,27 % des mesures au-delà, soit environ une sur 370. Sur une métrique relevée toutes les minutes, cela fait une fausse alerte toutes les six heures.

Ce qu'il faut regarder ici, ce n'est pas la cloche, ce sont les deux minces bandes qu'elle laisse en dehors de la zone teintée. La série est normale et rien ne s'y passe : ces bandes ne contiennent donc que des mesures ordinaires, et toute alerte qu'elles déclenchent est fausse. Déplacer le seuil, c'est déplacer la frontière de cette zone, donc changer l'épaisseur des bandes.

Le calcul qui décide du seuil

Un seuil ne se choisit pas en pourcentage mais en fausses alertes par jour. À 3σ sur une mesure par minute : 1440×0,002741440 \times 0{,}0027 \approx 4 fausses alertes quotidiennes. À 4σ : 1440×0,00006330,091440 \times 0{,}0000633 \approx 0{,}09, soit une tous les onze jours. C'est ce nombre-là qu'on présente à l'équipe d'exploitation, pas le sigma.

Le z-score se sabote lui-même

Deux défauts, et ils vont ensemble. D'abord il suppose la normalité : sur une série log-normale, le seuil « moyenne + 3σ » laisse passer plus de dix fois le nombre de valeurs ordinaires annoncé, et le seuil bas tombe sous zéro.

Ensuite, moyenne et écart-type sont calculés en incluant les anomalies. Une valeur extrême gonfle σ\sigma, donc réduit son propre z-score : c'est l'effet de masquage.

Il va jusqu'à plafonner le score. Doubler la taille du pic double son écart à la moyenne, qui est le numérateur, mais double aussi l'écart-type qu'il fabrique presque à lui seul, qui est le dénominateur. Le rapport des deux ne bouge pas. Il ne dépend donc plus de la valeur du pic, seulement du nombre de mesures :

zmax=n1nz_{\max} = \frac{n - 1}{\sqrt{n}}

En clair : sur nn mesures, une valeur isolée ne peut pas obtenir un score plus grand que celui-là, si énorme soit-elle. Ce plafond reste sous le seuil de 3 tant que la série compte moins de onze mesures : en dessous, aucun pic ne peut déclencher l'alerte, quelle que soit son ampleur.

Le masquage sur sept valeurs, vérifiable à la main

Charge relevée sur sept minutes : 10,11,12,11,10,1210, 11, 12, 11, 10, 12 et un pic à 60\mathbf{60}. Personne n'hésiterait à qualifier ce pic d'anomalie.

Par le z-score. La somme vaut 10+11+12+11+10+12+60=12610 + 11 + 12 + 11 + 10 + 12 + 60 = 126, donc la moyenne 126/7=18126 / 7 = 18. La somme des carrés des écarts à 18 vaut 20622062, et l'écart-type 2062/618,54\sqrt{2062 / 6} \approx 18{,}54, en divisant par N1N - 1 comme le fait le code plus bas.

Ce choix suit la règle du chapitre 3 : sept relevés ne sont pas « la série » qu'on décrit, ce sont un échantillon à partir duquel on estime le comportement normal du capteur. C'est le cas de toute supervision, qui juge l'avenir d'après un historique. Sur des milliers de relevés, diviser par NN ou par N1N - 1 ne change d'ailleurs plus rien.

Le pic a tiré la moyenne vers le haut, et surtout il pèse (6018)2=1764(60 - 18)^2 = 1764 des 20622062 de la somme des carrés des écarts. Il fournit donc 86 % de la somme dont l'écart-type est tiré : celui contre lequel on va le juger est presque entièrement son œuvre. Son z-score vaut donc

z=(6018)/18,54=2,27z = (60 - 18) / 18{,}54 = 2{,}27

soit en dessous du seuil de 3. L'alerte ne part pas. Et elle ne partirait pas davantage avec un pic à 6 000 : sur sept mesures, le plafond calculé plus haut vaut 6/72,276/\sqrt{7} \approx 2{,}27, et le pic à 60 y est déjà.

Par le z-score robuste. La médiane vaut 1111, et les écarts absolus à la médiane sont 1,0,1,0,1,1,491, 0, 1, 0, 1, 1, 49, de médiane MAD=1\mathrm{MAD} = 1. Le pic ne peut pas influencer une médiane, puisqu'il n'en déplace pas le rang central. D'où

zrob=0,6745×(6011)/1=33z_{\text{rob}} = 0{,}6745 \times (60 - 11) / 1 = 33

soit onze fois le seuil. L'alerte part sans ambiguïté.

Par l'écart interquartile. Q1=10Q_1 = 10, Q3=12Q_3 = 12, donc IQR=2\mathrm{IQR} = 2 et la limite haute vaut 12+1,5×2=1512 + 1{,}5 \times 2 = 15. Le pic est signalé lui aussi.

Deux méthodes sur trois voient une anomalie que la troisième déclare normale, sur les mêmes sept nombres. La différence ne tient pas au seuil choisi mais à ce qu'on met dans le dénominateur.

L'écart interquartile

On signale les valeurs hors de [Q11,5IQR;Q3+1,5IQR][Q_1 - 1{,}5\,\mathrm{IQR} ; Q_3 + 1{,}5\,\mathrm{IQR}], la règle de la boîte à moustaches vue au chapitre 3. Quartiles et IQR étant robustes, quelques valeurs extrêmes ne les déplacent pas : pas d'effet de masquage. Et la méthode ne suppose aucune loi.

Le z-score robuste

On remplace moyenne et écart-type par leurs équivalents robustes. La médiane MeMe remplace la moyenne. L'écart absolu médian remplace l'écart-type : c'est la médiane des distances à la médiane,

MAD=meˊdiane(xiMe)\mathrm{MAD} = \text{médiane}\left(|x_i - Me|\right)

et le score devient

zrob=0,6745×xMeMADz_{\text{rob}} = 0{,}6745 \times \frac{x - Me}{\mathrm{MAD}}

En clair, c'est le même geste que le z-score, avec deux remplacements. L'écart au centre se compte à partir de la médiane et non de la moyenne. La dispersion ordinaire se lit sur le MAD, c'est-à-dire l'écart typique des autres points à cette médiane. Le facteur 0,67450{,}6745 ramène l'échelle du MAD à celle d'un écart-type sur une loi normale, de sorte que le seuil de 3 garde le même sens qu'avec le z-score classique.

Tout l'intérêt tient au dénominateur : une valeur extrême peut multiplier l'écart-type, elle ne déplace pas une médiane, qui ne dépend que d'un rang. Le seuil ne se laisse donc pas fabriquer par ce qu'il doit détecter.

Le pourcentage du maximum

« Alerte au-delà de 90 % du maximum observé » : simple, immédiat, et sans aucune propriété. Le maximum est la statistique la moins robuste qui soit, il est déterminé par une seule valeur, souvent celle dont on doute le plus. À citer, à ne pas utiliser seul.

main.py
Sortie
>_ Prêt à exécuter…
Ce que la comparaison montre

Les trois incidents sont réels et massifs, et les trois méthodes les trouvent tous ; pourtant les seuils diffèrent de six points de charge. Le z-score classique place sa limite le plus haut, vers 69 %, parce que les incidents ont eux-mêmes gonflé l'écart-type. Les méthodes robustes, qui les ignorent dans le calcul du seuil, descendent à 63 % et 66 %, et le paient de quelques signalements supplémentaires sur des mesures ordinaires.

Il n'y a pas de méthode gagnante dans l'absolu : il y a un arbitrage entre incidents manqués et fausses alertes, et c'est à l'exploitant de le trancher. Sur une série de cinq cents points, trois incidents gonflent peu l'écart-type ; sur une série courte, ou avec des incidents plus nombreux, le masquage vu plus haut ferait basculer la comparaison.

Régler un seuil de vigilance

Trois méthodes, trois seuils différents sur la même série. Reste à décider lequel poser, et ce choix-là n'est plus statistique.

Un seuil produit deux types d'erreurs : les faux négatifs (incidents manqués) et les faux positifs (fausses alertes). Les baisser tous les deux en même temps est impossible : durcir le seuil réduit les fausses alertes et augmente les incidents manqués.

Le calcul que personne ne fait, et qui décide de tout

Les quatre fausses alertes quotidiennes calculées plus haut valent pour une métrique sur un serveur. Avec quatre métriques et vingt serveurs, on atteint plus de 300 alertes par jour, dont presque aucune ne correspond à un incident.

C'est le résultat de Bayes, posé dans Probabilités, sous sa forme opérationnelle : une équipe noyée sous les fausses alertes finit par toutes les ignorer, y compris la vraie. La figure qui l'accompagne se règle exactement sur ce cas : descendre la rareté à quelques dixièmes de pour-cent, et regarder ce que devient la valeur prédictive d'un excellent détecteur.

La figure suivante rend cet arbitrage manipulable. Trois anomalies ont été injectées dans une série par ailleurs normale ; déplacer le seuil fait bouger les deux comptes, et jamais dans le même sens.

seuil à
73,526,750,1anomalie détectée · relevé 120 · 97fausse alerte · relevé 295 · 26.2anomalie détectée · relevé 300 · 94anomalie détectée · relevé 455 · 99fausse alerte · relevé 547 · 75.7anomalie détectée · relevé 900 · 76fausse alerte · relevé 1026 · 74.2fausse alerte · relevé 1179 · 20.1fausse alerte · relevé 1244 · 77.8fausse alerte · relevé 1361 · 74.7fausse alerte · relevé 1421 · 23.8charge CPU (%) · 1440 relevés

anomalies détectées

4 / 4

aucune manquée

fausses alertes

7

sur 1440 relevés

cadence attendue

environ 3,9 par jour

0,270 % hors du seuil

C'est la dernière colonne qu'on présente à une équipe d'exploitation, pas le sigma : à 3σ sur un relevé toutes les minutes, la métrique déclenche environ 3,9 par jour sans qu'il ne se passe rien.

Une journée de relevés à la minute, quatre anomalies injectées. Trois sont franches, la quatrième est une dérive discrète à 76 %. Parcourir les seuils : c'est elle qui décide du réglage.

Parcourir les neuf réglages fait apparaître ce qu'aucune formule ne dit : il n'existe pas de seuil sans perte.

À 2σ, la métrique se déclenche 61 fois dans la journée sans que rien ne se passe. À 3σ, elle ne se trompe plus que 7 fois, et attrape encore les quatre anomalies. À 3,5σ, elle ne se trompe presque plus, et laisse passer la dérive à 76 %, cerclée en pointillés sur le dessin. Les trois pics francs, eux, restent détectés jusqu'à 5σ : ce ne sont pas eux qui décident du réglage.

C'est toujours l'anomalie la plus discrète qui fixe le seuil, et c'est pourquoi on ne le règle pas sans savoir ce qu'on cherche à détecter.

Le compte observé n'est pas la cadence attendue

À 3σ, la figure annonce une cadence de 3,9 fausses alertes par jour et en compte 7 sur cette journée-là. Les deux nombres sont justes : le premier est une espérance, le second un tirage. Sur une seule journée, l'écart est ordinaire.

C'est la raison pour laquelle on ne règle pas un seuil sur une journée de données. Il faut soit plusieurs semaines, soit le calcul théorique, et de préférence les deux, qui doivent alors se rejoindre.

La cadence est le seul nombre qui se présente

« 3 sigmas » ne veut rien dire pour une équipe d'exploitation. « Environ quatre réveils par jour et par métrique » veut dire quelque chose, et se discute. Le sigma est un moyen de calcul ; la cadence de fausses alertes est la grandeur qu'on négocie.

Trois leviers, dans l'ordre où on les emploie :

  1. Exiger une persistance : alerter seulement si le seuil est dépassé pendant kk minutes consécutives. Un pic isolé disparaît, une dérive réelle passe. C'est le levier le plus efficace et le moins coûteux.
  2. Corréler plusieurs métriques : CPU et latence simultanément. La probabilité que deux signaux indépendants se déclenchent à tort en même temps est le produit des deux, bien plus petite.
  3. Choisir le seuil selon le coût : manquer une surchauffe coûte un serveur, manquer un pic de trafic coûte quelques secondes de lenteur. Les deux ne méritent pas le même réglage.
main.py
Sortie
>_ Prêt à exécuter…
Le seuil calculé sur 24 heures rate un tiers de l'incident

La journée mélange deux régimes, une nuit à 30 % et un plateau diurne à 57 %. Ce mélange gonfle l'écart interquartile, donc pousse le seuil à 86 % : seules les dix minutes les plus violentes de l'incident sont vues. Le même calcul mené sur les seules heures ouvrées descend le seuil à 75 % et détecte les quinze minutes.

Même série, même méthode, même règle. Ce qui change, c'est qu'on a d'abord séparé les régimes. C'est le conseil qui paraissait théorique au début du chapitre, et qui coûte ici cinq minutes d'incident non vues.

Vérification

Vérification rapideon peut se reprendre

1.Un seuil durci fait passer les fausses alertes de quatre par jour à une tous les onze jours. Que devient l'autre plateau de la balance ?

2.Pourquoi le z-score robuste emploie-t-il la médiane et le MAD ?

3.Une métrique de latence est fortement asymétrique à droite. Quelle loi la décrit le mieux ?

4.Avant d'appliquer une règle à trois sigmas, quelle vérification s'impose ?

Exercices type

Une série de latences a pour moyenne 45 ms et pour médiane 28 ms. Que peut-on en déduire ?

La moyenne est très supérieure à la médiane : la distribution est fortement asymétrique à droite. Quelques requêtes très lentes tirent la moyenne, tandis que la majorité se situe autour de 28 ms.

C'est la signature d'une loi log-normale, typique des temps de réponse.

Conséquence pratique : ne pas utiliser de z-score sur cette série. Travailler sur ln(latence)\ln(\text{latence}), ou passer par des quantiles : c'est la raison d'être des p95p95 et p99p99 (les 95ᵉ et 99ᵉ centiles) en supervision applicative.

Sur 1 440 mesures normales par jour, combien de fausses alertes produit un seuil à 2 sigmas ? à 3 sigmas ?

À 2 sigmas : 4,6 % des mesures sortent de l'intervalle, soit 0,046×14400{,}046 \times 1440 \approx 66 fausses alertes par jour. Inexploitable.

À 3 sigmas : 0,27 %, soit 0,0027×14400{,}0027 \times 1440 \approx 4 par jour. Acceptable pour une métrique, déjà lourd pour dix.

Et ce calcul suppose la série normale et les mesures indépendantes, deux hypothèses fausses sur une série temporelle, où les valeurs successives se ressemblent. En pratique, les fausses alertes arrivent groupées, ce qui est à la fois plus visible et plus facile à filtrer par une règle de persistance.

Pourquoi le z-score détecte-t-il mal une anomalie très grande ?

Parce que la valeur extrême entre dans le calcul de la moyenne et de l'écart-type qui servent à la juger, c'est l'effet de masquage.

Une seule valeur énorme fait exploser σ\sigma, ce qui freine mécaniquement la croissance de son propre z-score. Grossir l'anomalie ne sert donc à rien : le numérateur et le dénominateur grandissent ensemble, et leur rapport reste plafonné à (n1)/n(n-1)/\sqrt{n}, soit 2,27 sur sept mesures. Sur une série de moins de onze valeurs, ce plafond est sous 3 : aucun pic ne peut déclencher l'alerte. Plusieurs anomalies simultanées se masquent en outre les unes les autres.

Les méthodes robustes (IQR\mathrm{IQR}, MAD\mathrm{MAD}) n'ont pas ce défaut : médiane et quartiles ne bougent pas quand quelques points s'envolent.

Un disque a une durée de vie suivant une loi de Weibull de paramètre k=2,5k = 2{,}5. Que faut-il en conclure pour la maintenance ?

k>1k > 1 signifie un taux de panne croissant avec l'âge : c'est un phénomène d'usure, pas d'accident.

Conséquence directe : la maintenance préventive a du sens. Remplacer les disques au-delà d'un certain âge réduit réellement le taux de panne, et l'âge est un bon prédicteur.

Contraste utile : si k=1k = 1 (exponentielle, sans mémoire), remplacer un composant ancien par un neuf ne changerait rien au risque de panne du mois suivant. La politique de maintenance découle directement de la forme de la loi.

Le test de Kolmogorov-Smirnov donne p=0,001p = 0{,}001 sur 10 000 mesures de température. Faut-il abandonner le modèle normal ?

Pas nécessairement. Sur un échantillon de cette taille, le test détecte des écarts infimes : aucune série physique réelle ne suit exactement une loi théorique, et le test finit toujours par le voir.

La question utile n'est pas « la loi est-elle exacte ? » mais « l'écart est-il gênant pour l'usage prévu ? ». Si on pose un seuil à 3 sigmas, ce qui compte est la qualité de l'ajustement dans la queue de distribution, et cela se lit sur un QQ-plot, pas sur une pp-valeur.

Il faut donc regarder l'ampleur de l'écart (la statistique DD du test, l'écart maximal entre les deux fonctions de répartition) plutôt que sa significativité.

Deux serveurs ont la même charge CPU moyenne de 55 %. Comment savoir lequel est en difficulté ?

La moyenne ne peut pas répondre. Il faut :

  1. La dispersion : un serveur régulier à 55 % et un autre alternant 10 % et 100 % n'ont pas le même comportement. Écart-type et IQR\mathrm{IQR} les séparent.
  2. La série temporelle : le second est-il saturé pendant les heures ouvrées et inactif la nuit (auquel cas c'est normal) ou ses pics sont-ils erratiques ?
  3. Les quantiles hauts : p95p95 et p99p99 disent la charge dans les pires moments, qui est ce que ressentent les utilisateurs.
  4. Les métriques corrélées : mémoire, activité de swap, latence. Un CPU à 55 % avec du swap soutenu est un serveur en difficulté ; à 55 % sans swap, c'est un serveur qui travaille.

La méthode

  1. Tracer la série dans le temps avant tout. Les régimes jour/nuit et les incidents s'y voient à l'œil nu.
  2. Séparer les régimes s'il y en a plusieurs. Un indicateur global sur deux populations mélangées ne décrit ni l'une ni l'autre.
  3. Identifier la loi : histogramme, puis QQ-plot, puis test, dans cet ordre, du plus parlant au plus formel.
  4. Ne jamais appliquer un raisonnement en sigmas à une série qu'on n'a pas vérifiée normale.
  5. Comparer au moins deux méthodes de détection, et donner les seuils qu'elles produisent.
  6. Chiffrer le taux de fausses alertes attendu par jour. C'est ce nombre qui rend un seuil acceptable ou non.
  7. Ajouter une règle de persistance avant de durcir un seuil : c'est plus efficace et cela ne coûte pas de sensibilité.
  8. Conclure par une recommandation actionnable : quel seuil, sur quelle métrique, avec quelle durée, et pourquoi.

Synthèse

  • La charge CPU est une proportion de temps ; ce qui alerte, c'est la file d'attente. La mémoire s'apprécie par le disponible et le swap, pas par l'utilisé.
  • Une série temporelle est ordonnée et auto-corrélée : la tracer avant de la résumer.
  • Une loi continue se décrit par sa densité ; la probabilité est une aire.
  • Normale = somme d'effets. Log-normale = produit d'effets, temps de réponse. Exponentielle = durées entre événements, sans mémoire. Weibull = durées de vie, k>1k > 1 pour l'usure.
  • Règle des trois sigmas : 68/95/99,7%68 / 95 / 99{,}7 \%, valable uniquement sur une série normale.
  • Vérifier la loi : histogramme → QQ-plot → Kolmogorov-Smirnov. Le test rejette tout sur un grand échantillon.
  • z-score : simple, suppose la normalité, souffre de l'effet de masquage. Sur nn mesures, une valeur isolée plafonne à (n1)/n(n-1)/\sqrt{n}, donc sous 3 en deçà de onze mesures.
  • IQR et z robuste (MAD) : sans hypothèse de loi, insensibles aux valeurs extrêmes.
  • Le pourcentage du maximum n'a aucune propriété : à citer, pas à utiliser.
  • Un seuil à 3 sigmas produit ~4 fausses alertes par jour et par métrique sur un relevé à la minute.
  • Persistance puis corrélation de métriques avant de durcir un seuil.

Et ensuite

Les cinq premiers chapitres ont produit des calculs à faire : une espérance, un intervalle, un seuil. Reste à les écrire, et la façon de les écrire n'est pas neutre : elle décide de ce qu'on pourra tester, paralléliser et corriger six mois plus tard. Paradigmes de programmation ouvre le deuxième temps du parcours.

Mettre en pratique