1. Une méthode en quatre étapes #
Du symptôme à la ligne de code.
Méthode #
- Partir d'un symptôme : CPU élevé sur un dashboard, latence p99 dégradée, OOMKilled.
- Choisir le bon type de profil : CPU pour la consommation, wall clock pour la latence,
inuse_spacepour une fuite,alloc_spacepour la pression du GC,mutex/blockpour la contention. - Réduire le périmètre par labels (
service_name,pod,endpoint) et par plage de temps. - Lire la top table triée par self time, puis le flame graph pour comprendre d'où viennent les appels.
2. Comparer deux périodes #
La fonction diff.
Avant / après #
La vue Comparison (diff flame graph) superpose deux sélections : la référence (baseline) et la comparaison. Les fonctions en rouge consomment plus, celles en vert moins. C'est l'outil idéal pour :
- comparer une version N et N+1 (label
version) ; - comparer un pic de CPU à une période normale ;
- comparer deux régions ou deux types d'instances.
Bonne Pratique : Ajoutez systématiquement un label version (commit ou tag) à vos profils : chaque déploiement devient comparable en un clic.3. Cas concrets #
Ce que l'on trouve vraiment.
Exemples fréquents #
| Symptôme | Profil | Découverte typique |
|---|---|---|
| CPU élevé | process_cpu | Expression régulière compilée à chaque appel, sérialisation JSON par réflexion |
| GC très actif | alloc_space | Concaténations de chaînes dans une boucle, slices non pré-allouées |
| Mémoire qui croît sans fin | inuse_space | Cache sans éviction, goroutines bloquées qui retiennent des objets |
| Latence élevée, CPU bas | wall, block, mutex | Verrou global, pool de connexions trop petit |
| Coût cloud | process_cpu agrégé sur tout le parc | Une bibliothèque de logs coûte 15 % du CPU total |
// Avant : compilée à chaque appel (visible dans le flame graph : regexp.Compile)
func isValid(s string) bool { return regexp.MustCompile(`^[A-Z]{3}-\d+$`).MatchString(s) }
// Après : compilée une fois
var ref = regexp.MustCompile(`^[A-Z]{3}-\d+$`)
func isValid(s string) bool { return ref.MatchString(s) }Des profils dans les dashboards #
Le panneau Flame graph de Grafana peut être placé dans un dashboard à côté des métriques CPU du service. On peut aussi tracer une série issue des profils (par exemple le CPU d'une fonction donnée) pour suivre l'effet d'une optimisation dans le temps.
