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.
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.
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.
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.
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.
Variables aléatoires continues
Quand la grandeur mesurée peut prendre n'importe quelle valeur d'un intervalle (une température, une durée, un débit) on ne peut plus lister les : elles valent toutes zéro.
Une variable aléatoire continue est décrite par sa densité de probabilité , une fonction positive d'aire totale 1. La probabilité se lit comme une aire :
P(a ≤ X ≤ b) = ∫ₐᵇ f(x) dx
La fonction de répartition est la primitive de la densité qui s'annule en .
Conséquence qui déroute : $f(x)$ peut dépasser 1 sans rien casser. Une loi uniforme sur $[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.
Ce qui a un sens, c'est toujours une probabilité d'intervalle : $P(a < X < b)$, l'aire entre $a$ et $b$. D'où l'usage de la fonction de répartition $F$, qui donne directement $P(X \leq x)$, et le calcul $P(a < X < b) = F(b) - F(a)$.
Les quatre lois continues à connaître
Loi normale
La courbe en cloche, symétrique autour de . 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.
68 % des valeurs dans [μ − σ, μ + σ], 95 % dans [μ − 2σ, μ + 2σ], 99,7 % dans [μ − 3σ, μ + 3σ]. 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.
Loi log-normale
est log-normale si 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.
Loi exponentielle
Densité sur les réels positifs, d'espérance . 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.
Sa propriété caractéristique est l'absence de mémoire : . Un composant qui a déjà tenu mille heures n'est ni plus ni moins susceptible de tomber en panne dans l'heure suivante qu'un composant neuf. 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 , ce qui lui permet de représenter l'usure :
- : taux de panne décroissant, mortalité infantile, les défauts de fabrication se révèlent tôt ;
- : taux constant, c'est exactement l'exponentielle ;
- : 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.
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 -valeur. Une -valeur inférieure à 0,05 conduit à rejeter l'hypothèse que la série suit la loi testée.
μ et σ sur les données mêmes, la p-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
p-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.
L'asymétrie (skewness) est le premier signal : proche de 0 pour la température, franchement positive pour la latence. Voici les mêmes séries en images.
Le QQ-plot de la température suit la droite ; celui de la latence s'en écarte nettement dans le haut. C'est exactement la zone qui décide des alertes.
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…
Détecter une anomalie
Une anomalie est une observation qui s'écarte assez du comportement habituel pour mériter un regard. Le bloc s'en tient à des méthodes fondées sur des statistiques classiques (pas d'apprentissage automatique) et c'est amplement suffisant.
Le z-score
mesure l'écart d'une valeur à la moyenne, en nombre d'écarts-types. On signale généralement .
Ensuite, moyenne et écart-type sont calculés en incluant les anomalies. Une valeur extrême gonfle
σ, donc réduit son propre z-score : c'est l'effet de masquage. Plus l'anomalie est grosse, moins elle est détectable.
L'écart interquartile
On signale les valeurs hors de [Q₁ − 1,5 IQR ; Q₃ + 1,5 IQR], la règle de la boîte à moustaches. 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. L'écart absolu médian est MAD = médiane(|xᵢ − médiane(x)|), et :
z_robuste = 0,6745 × (x − médiane) / MAD
Le facteur 0,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.
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.
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.
Régler un seuil de vigilance
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.
0,3 % des mesures normales. Sur un relevé à la minute, cela fait 0,003 × 1440 ≈ 4 fausses alertes par jour et par métrique. Avec quatre métriques et vingt serveurs, on atteint 350 alertes quotidiennes, dont presque aucune ne correspond à un incident.C'est le résultat de Bayes du chapitre 2, sous sa forme opérationnelle : une équipe noyée sous les fausses alertes finit par toutes les ignorer, y compris la vraie.
Trois leviers, dans l'ordre où on les emploie :
- Exiger une persistance : alerter seulement si le seuil est dépassé pendant 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.
- 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.
- 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.
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.
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 : n'utilise pas de z-score sur cette série. Travaille sur ln(latence), ou passe par des quantiles, c'est la raison d'être des et 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 66 fausses alertes par jour. Inexploitable.
À 3 sigmas : 0,27 %, soit 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 , ce qui abaisse mécaniquement son propre z-score, et peut le ramener sous le seuil de 3. Plus l'anomalie est grosse, moins elle est détectable : exactement le contraire de ce qu'on veut.
Les méthodes robustes (IQR, 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{,}5$. Que faut-il en conclure pour la maintenance ?
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 (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{,}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 ce que j'en fais ? ». Si tu poses 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 -valeur.
Regarde donc l'ampleur de l'écart (la statistique du test) 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 :
- La dispersion : un serveur régulier à 55 % et un autre alternant 10 % et 100 % n'ont pas le même comportement. Écart-type et
IQRles séparent. - 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 ?
- Les quantiles hauts : et disent la charge dans les pires moments, qui est ce que ressentent les utilisateurs.
- 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
- Trace la série dans le temps avant tout. Les régimes jour/nuit et les incidents s'y voient à l'œil nu.
- Sépare 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.
- Identifie la loi : histogramme, puis QQ-plot, puis test, dans cet ordre, du plus parlant au plus formel.
- N'applique jamais un raisonnement en sigmas à une série que tu n'as pas vérifiée normale.
- Compare au moins deux méthodes de détection, et donne les seuils qu'elles produisent.
- Chiffre le taux de fausses alertes attendu par jour. C'est ce nombre qui rend un seuil acceptable ou non.
- Ajoute une règle de persistance avant de durcir un seuil : c'est plus efficace et cela ne coûte pas de sensibilité.
- Conclus par une recommandation actionnable : quel seuil, sur quelle métrique, avec quelle durée, et pourquoi.
En résumé
- 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 : trace-la 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, pour l'usure.
- Règle des trois sigmas : , 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.
- 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 ? On vient de superviser un système existant. Le chapitre suivant change d'échelle et regarde le logiciel lui-même : les grandes façons de le structurer, avec les paradigmes de programmation.