Apprenez les méthodes pratiques de Brendan Gregg (USE, RED, flame graphs) pour enquêter sur la latence et les goulets d'étranglement en production avec des données, pas des suppositions.

Brendan Gregg est l'une des voix les plus influentes en performance des systèmes, en particulier dans l'univers Linux. Il a écrit des ouvrages largement utilisés, créé des outils pratiques et — surtout — partagé des méthodes claires pour enquêter sur des problèmes réels en production. Les équipes adoptent son approche parce qu'elle fonctionne sous pression : quand la latence grimpe et que tout le monde veut des réponses, il faut un moyen de passer de « peut‑être c'est X » à « c'est définitivement Y » avec un minimum de drama.
Une méthode de performance n'est pas un outil unique ou une commande astucieuse. C'est une façon répétable d'enquêter : une check‑list de ce qu'il faut regarder en premier, comment interpréter ce qu'on voit, et comment décider de l'étape suivante.
Cette répétabilité réduit les suppositions. Au lieu de dépendre de la personne qui a le plus d'intuition (ou l'opinion la plus forte), vous suivez un processus cohérent qui :
Beaucoup d'enquêtes sur la latence partent mal dans les cinq premières minutes. Les gens passent directement aux correctifs : « ajouter du CPU », « redémarrer le service », « augmenter le cache », « tuner le GC », « ça doit être le réseau ». Parfois ces actions aident — souvent elles masquent le signal, font perdre du temps ou introduisent un nouveau risque.
Les méthodes de Gregg vous poussent à différer les « solutions » jusqu'à ce que vous puissiez répondre à des questions plus simples : Qu'est‑ce qui est saturé ? Qu'est‑ce qui fait des erreurs ? Qu'est‑ce qui a ralenti — le débit, la mise en file d'attente, ou les opérations individuelles ?
Ce guide vous aide à restreindre la portée, mesurer les bons signaux et confirmer le goulet d'étranglement avant d'optimiser. L'objectif est un flux de travail structuré pour enquêter sur la latence et le profilage en production afin que les résultats ne dépendent pas de la chance.
La latence est un symptôme : les utilisateurs attendent plus longtemps la fin d'un travail. La cause se situe généralement ailleurs — contention CPU, attentes disque ou réseau, contention sur des verrous, garbage collection, mise en file d'attente, ou ralentissements de dépendances distantes. Mesurer uniquement la latence vous dit qu'il y a un problème, pas d'où il provient.
Ces trois signaux sont couplés :
Avant d'optimiser, capturez les trois pour la même fenêtre temporelle. Sinon vous risquez de « réparer » la latence en supprimant du travail ou en échouant plus vite.
La latence moyenne masque les pics que les utilisateurs retiennent. Un service avec une moyenne à 50 ms peut avoir des blocages fréquents à 2 s.
Suivez les percentiles :
Surveillez aussi la forme de la latence : un p50 stable avec un p99 en hausse indique souvent des blocages intermittents (par ex. contention de verrou, problèmes d'E/S, pauses stop‑the‑world) plutôt qu'un ralentissement généralisé.
Un budget de latence est un modèle simple de comptabilité : « si la requête doit finir en 300 ms, comment le temps peut‑il être réparti ? » Décomposez‑le en postes tels que :
Ce budget cadre la première tâche de mesure : identifiez quel poste a augmenté pendant le pic, puis enquêtez cette zone au lieu d'optimiser à l'aveugle.
Les travaux sur la latence partent de travers quand le « problème » est décrit comme le système est lent. Les méthodes de Gregg débutent plus tôt : forcez la question en un énoncé précis et testable.
Écrivez deux phrases avant de toucher aux outils :
Cela évite d'optimiser la mauvaise couche — par exemple le CPU hôte — alors que la douleur est isolée à un endpoint ou une dépendance en aval.
Prenez une fenêtre qui correspond à la plainte et inclut une période « bonne » en comparaison si possible.
Délimitez explicitement votre enquête :
La précision ici accélère les étapes suivantes (USE, RED, profilage) car vous saurez quelles données doivent évoluer si votre hypothèse est correcte.
Notez les déploiements, changements de config, évolutions de trafic et événements infra — mais n'assumez pas la causalité. Formulez‑les comme « si X, alors on s'attend à Y », afin de pouvoir confirmer ou rejeter rapidement.
Un petit journal évite le travail dupliqué entre collègues et facilite les transmissions.
Time | Question | Scope | Data checked | Result | Next step
Même cinq lignes comme celle‑ci peuvent transformer un incident stressant en un processus répétable.
La méthode USE (Utilisation, Saturation, Erreurs) est la check‑list rapide de Gregg pour scanner les « quatre grandes » ressources — CPU, mémoire, disque (stockage) et réseau — afin de cesser de deviner et commencer à restreindre le problème.
Au lieu de regarder des dizaines de tableaux, posez les mêmes trois questions pour chaque ressource :
Appliquée de manière cohérente, c'est un inventaire rapide de là où existe la « pression ».
Pour le CPU, l'utilisation est le % d'occupation, la saturation se manifeste par la file d'attente run‑queue ou des threads en attente d'exécution, et les erreurs peuvent inclure du throttling (en conteneurs) ou des interruptions mal gérées.
Pour la mémoire, l'utilisation est la mémoire utilisée, la saturation apparaît souvent sous forme de paging ou de collections fréquentes du GC, et les erreurs incluent les échecs d'allocation ou événements OOM.
Pour le disque, l'utilisation est le temps d'occupation du périphérique, la saturation est la profondeur de file et le temps d'attente lecture/écriture, et les erreurs sont les erreurs I/O ou timeouts.
Pour le réseau, l'utilisation est le débit, la saturation ce sont les pertes/queues/latences, et les erreurs sont retransmissions, resets, ou pertes de paquets.
Quand les utilisateurs signalent de la lenteur, les signaux de saturation sont souvent les plus révélateurs : files, temps d'attente et contention corrèlent plus directement avec la latence que l'utilisation brute.
Les métriques de service (latence des requêtes, taux d'erreur) vous disent l'impact. USE vous indique où regarder ensuite en identifiant la ressource sous contrainte.
Une boucle pratique :
La méthode RED vous garde ancré sur l'expérience utilisateur avant de plonger dans les graphiques d'hôte.
RED vous évite de courir après des métriques « intéressantes » qui n'affectent pas les utilisateurs. Il impose une boucle plus serrée : quel endpoint est lent, pour quels utilisateurs, et depuis quand ? Si la Duration monte seulement sur une route alors que le CPU global est stable, vous avez déjà un point de départ plus précis.
Une habitude utile : conserver RED détaillé par service et principaux endpoints (ou méthodes RPC clés). Cela permet de distinguer facilement une dégradation générale d'une régression localisée.
RED vous dit où ça fait mal. USE vous aide à tester quelle ressource en est responsable.
Exemples :
Gardez une présentation concentrée :
Si vous voulez un flux d'incident cohérent, associez cette section à l'inventaire USE dans /blog/use-method-overview pour passer de « les utilisateurs le ressentent » à « cette ressource est la contrainte » avec moins d'agitation.
Une enquête de performance peut exploser en dizaines de graphiques et d'hypothèses en quelques minutes. L'état d'esprit de Gregg est de rester étroit : votre travail n'est pas de « collecter plus de données », mais de poser la prochaine question qui élimine le plus rapidement l'incertitude.
La plupart des problèmes de latence sont dominés par un coût unique (ou une petite paire) : un verrou chaud, une dépendance lente, un disque surchargé, un pattern de pause GC. Prioriser signifie chercher d'abord ce coût dominant, car diminuer de 5 % cinq endroits différents déplace rarement la latence visible par l'utilisateur.
Un test pratique : « Qu'est‑ce qui pourrait expliquer la majeure partie du changement de latence que nous observons ? » Si une hypothèse n'explique qu'une petite part, c'est une question de moindre priorité.
Utilisez top‑down lorsque vous répondez à « les utilisateurs sont‑ils impactés ? » Commencez par les endpoints (signaux RED) : latence, débit, erreurs. Cela évite d'optimiser quelque chose qui n'est pas sur le chemin critique.
Utilisez bottom‑up quand l'hôte est manifestement malade (symptômes USE) : saturation CPU, pression mémoire incontrôlée, attente I/O. Si un nœud est saturé, vous perdrez du temps à regarder les percentiles d'endpoints sans comprendre la contrainte.
Quand une alerte sonne, prenez une branche et restez‑y jusqu'à confirmation ou réfutation :
Limitez‑vous à un petit ensemble de signaux de départ, puis creusez seulement quand quelque chose bouge. Si vous avez besoin d'une checklist pour rester concentré, liez vos étapes à un runbook comme /blog/performance-incident-workflow afin que chaque nouvelle métrique ait un but : répondre à une question précise.
Le profilage en production peut sembler risqué car il touche au système live — mais c'est souvent le moyen le plus rapide de remplacer le débat par des preuves. Les logs et tableaux vous disent que quelque chose est lent. Le profilage vous dit où le temps est passé : quelles fonctions sont chaudes, quels threads attendent, et quels chemins de code dominent pendant l'incident.
Le profilage est un outil de « budget temporel ». Plutôt que de débattre (« c'est la base de données » vs « c'est le GC »), vous obtenez des preuves comme « 45 % des échantillons CPU étaient dans le parsing JSON » ou « la plupart des requêtes sont bloquées sur un mutex ». Cela réduit la prochaine étape à un ou deux correctifs concrets.
Chacun répond à une question différente. Une latence élevée avec un faible CPU pointe souvent vers du off‑CPU ou de la contention de verrous plutôt que des hotspots CPU.
Beaucoup d'équipes commencent par du profiling à la demande, puis passent au toujours‑actif une fois qu'elles ont confiance dans la sécurité et voient des problèmes récurrents.
Le profilage sûr en production consiste à contrôler le coût. Préférez l'échantillonnage (ne tracez pas chaque événement), gardez les fenêtres de capture courtes (par ex. 10–30 secondes) et mesurez l'overhead sur un canari d'abord. Si vous doutez, commencez avec un échantillonnage basse fréquence et augmentez seulement si le signal est trop bruité.
Les flame graphs visualisent où le temps échantillonné a été passé pendant une fenêtre de profilage. Chaque « boîte » est une fonction (ou une frame de pile), et chaque pile montre comment l'exécution a atteint cette fonction. Ils sont excellents pour repérer rapidement des patterns — mais ils ne disent pas automatiquement « le bug est ici ».
Un flame graph représente généralement des échantillons on‑CPU : le temps pendant lequel le programme tournait réellement sur un cœur CPU. Il peut mettre en évidence des chemins CPU lourds, un parsing inefficace, une sérialisation excessive ou des hotspots qui brûlent réellement du CPU.
Il ne montre pas directement l'attente sur disque, réseau, ordonnanceur ou le temps bloqué sur un mutex (ce sont des temps off‑CPU et nécessitent un autre type de profilage). Il ne prouve pas non plus la causalité pour la latence utilisateur à moins que vous ne le rattachiez à un symptôme cadré.
La boîte la plus large est tentante à blâmer, mais demandez‑vous : est‑ce un hotspot modifiable ou simplement du « temps passé dans malloc, GC ou logging » parce que le vrai problème est en amont ? Faites aussi attention au contexte manquant (JIT, inlining, symboles) qui peut faire ressembler une boîte au coupable alors qu'elle n'est que la messagère.
Traitez un flame graph comme la réponse à une question cadrée : quel endpoint, quelle fenêtre, quels hôtes, et qu'est‑ce qui a changé. Comparez des flame graphs « avant vs après » (ou « sain vs dégradé ») pour le même chemin de requête afin d'éviter le bruit de profilage.
Quand la latence grimpe, beaucoup d'équipes regardent d'abord le % CPU. C'est compréhensible — mais cela pointe souvent dans la mauvaise direction. Un service peut être « seulement à 20 % CPU » et pourtant très lent si ses threads passent la plupart de leur temps à ne pas s'exécuter.
Le % CPU répond à « à quel point le processeur est occupé ? » Il n'indique pas « où est passé le temps de ma requête ? » Les requêtes peuvent stagner pendant que les threads attendent, sont bloqués ou parkés par l'ordonnanceur.
Idée clé : le temps horloge d'une requête inclut à la fois le travail on‑CPU et l'attente off‑CPU.
Le temps off‑CPU se cache souvent derrière des dépendances et de la contention :
Quelques signaux souvent corrélés aux goulets off‑CPU :
Ces symptômes indiquent « on attend », mais pas quoi on attend.
Le profilage off‑CPU attribue le temps à la raison pour laquelle vous n'étiez pas en exécution : bloqué dans des syscalls, attente sur des verrous, en sleep, ou désordonnancé. C'est puissant pour la latence car ça transforme des ralentissements vagues en catégories actionnables : « bloqué sur le mutex X », « attente sur read() depuis le disque », ou « bloqué dans connect() vers un upstream ». Une fois que vous pouvez nommer l'attente, vous pouvez la mesurer, la confirmer et la corriger.
Le travail de performance échoue souvent au même moment : quelqu'un repère une métrique suspecte, la déclare « le problème » et commence à tweaker. Les méthodes de Gregg vous poussent à ralentir et prouver ce qui limite le système avant de changer quoi que ce soit.
Un goulet d'étranglement est la ressource ou le composant qui actuellement plafonne le débit ou cause la latence. Si vous le soulagez, les utilisateurs voient une amélioration.
Un hot spot est l'endroit où le temps est passé (par ex. une fonction fréquentée dans un profil). Les hotspots peuvent être de réels goulets — ou simplement du travail occupé qui n'affecte pas le chemin lent.
Le bruit est tout ce qui semble significatif mais ne l'est pas : jobs en arrière‑plan, pics isolés, artefacts d'échantillonnage, effets de cache, ou « top talkers » qui ne corrèlent pas avec le problème visible par l'utilisateur.
Commencez par capturer un instantané propre avant : le symptôme utilisateur (latence ou taux d'erreur) et les signaux candidats (saturation CPU, profondeur de file, I/O disque, contention de verrous, etc.). Puis appliquez un changement contrôlé qui devrait n'affecter que la cause suspectée.
Exemples de tests causals :
La corrélation est un indice, pas un verdict. Si « le CPU monte quand la latence monte », vérifiez en changeant la disponibilité CPU ou en réduisant le travail CPU et observez si la latence suit.
Notez : ce qui a été mesuré, le changement exact, les résultats avant/après et l'amélioration observée. Cela transforme une victoire ponctuelle en playbook réutilisable pour le prochain incident — et empêche l'« intuition » de réécrire l'histoire plus tard.
Les incidents de performance paraissent urgents, c'est précisément quand les suppositions s'invitent. Un flux de travail léger et répétable vous aide à passer de « quelque chose est lent » à « nous savons ce qui a changé » sans tourner en rond.
Détecter : alerter sur latence et taux d'erreur visibles par l'utilisateur, pas seulement sur le CPU. Pager quand la p95/p99 dépasse un seuil pendant une fenêtre soutenue.
Trier : répondez immédiatement à trois questions : qu'est‑ce qui est lent, quand ça a commencé, et qui est affecté ? Si vous ne pouvez pas nommer la portée (service, endpoint, région, cohorte), vous n'êtes pas prêt à optimiser.
Mesurer : collectez des preuves qui restreignent le goulet. Préférez des captures bornées dans le temps (ex. 60–180 secondes) pour pouvoir comparer « mauvais » vs « bon ».
Corriger : changez une chose à la fois, puis re‑mesurez les mêmes signaux pour confirmer l'amélioration et écarter l'effet placebo.
Gardez un dashboard partagé que tout le monde utilise pendant les incidents. Rendez‑le ennuyeux et cohérent :
Le but n'est pas de tout grapher ; c'est de raccourcir le temps pour obtenir le premier fait.
Instrumentez les endpoints qui comptent vraiment (checkout, login, recherche), pas chaque endpoint. Pour chacun, convenez : p95 attendu, taux d'erreur maximal, et dépendance clé (DB, cache, tiers).
Avant la prochaine panne, mettez d'accord un kit de capture :
Documentez‑le dans un runbook court (ex. /runbooks/latency), incluant qui peut lancer les captures et où stocker les artefacts.
La méthodologie de Gregg repose sur le changement contrôlé et la vérification rapide. Si votre équipe construit des services avec Koder.ai (plateforme chat‑driven pour générer et itérer des applis web, backend et mobiles), deux fonctionnalités s'alignent naturellement :
Même si vous ne générez pas de code pendant un incident, ces habitudes — petits diffs, résultats mesurables et réversibilité rapide — sont les mêmes que Gregg recommande.
Il est 10h15 et votre dashboard montre le p99 de l'API passant d'environ 120 ms à ~900 ms pendant le pic. Le taux d'erreur est stable, mais des clients signalent des requêtes « lentes ».
Commencez par le service : Rate, Errors, Duration.
Vous tranchez la Duration par endpoint et voyez une route qui domine le p99 : POST /checkout. Le débit a doublé, les erreurs sont normales, mais la Duration augmente spécifiquement quand la concurrence monte. Cela pointe vers la mise en file ou la contention, pas un échec total.
Ensuite, vérifiez si la latence est du temps de calcul ou d'attente : comparez le « handler time » applicatif au temps total de requête (ou spans upstream vs downstream si vous avez du tracing). Le handler est court, le temps total est long — les requêtes attendent.
Inventoriez les goulets probables : Utilisation, Saturation, Erreurs pour CPU, mémoire, disque et réseau.
L'utilisation CPU est seulement ~35 %, mais la run queue CPU et les switches de contexte montent. Disque et réseau semblent stables. Ce décalage (CPU bas, forte attente) est un indice classique : les threads ne brûlent pas du CPU — ils sont bloqués.
Vous capturez un profil off‑CPU durant le pic et trouvez beaucoup de temps passé dans un mutex autour d'un cache partagé de « validation de promotion ».
Vous remplacez le verrou global par un verrou par‑clé (ou un chemin de lecture sans verrou), déployez et observez le p99 revenir à la normale alors que le débit reste élevé.
Checklist post‑incident :