Profilage du code Go : trouver les goulots d'étranglement avec pprof et trace

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Profilage du code Go : trouver les goulots d'étranglement



L'optimisation des performances est l'une des tâches clés d'un développeur, surtout lorsqu'il s'agit de systèmes à forte charge en Go. Cependant, avant d'optimiser quoi que ce soit, il faut savoir précisément quelles parties du code sont des goulots d'étranglement. Pour cela, il existe le profilage — la collecte et l'analyse des métriques d'exécution d'un programme.



Dans cet article, nous allons voir comment profiler des applications Go à l'aide d'outils intégrés : pprof et trace. Vous apprendrez à trouver les problèmes liés au CPU, à la mémoire, aux blocages et aux goroutines, ainsi qu'à interpréter les données obtenues.



Qu'est-ce que le profilage et pourquoi en a-t-on besoin ?



Le profilage est le processus de collecte de données sur le fonctionnement d'un programme pendant son exécution. Ces données aident à répondre aux questions :



  • Quelles fonctions consomment le plus de temps processeur ?
  • Où se produit l'allocation d'une grande quantité de mémoire ?
  • Quelles goroutines sont bloquées et sur quoi ?
  • Combien de temps prend un appel système ou une opération d'entrée-sortie ?


Go fournit des outils puissants pour le profilage directement prêts à l'emploi. Les principaux sont net/http/pprof pour les applications web et runtime/pprof pour les utilitaires en ligne de commande.



L'outil pprof : profils CPU et Mémoire



pprof est l'outil principal pour le profilage en Go. Il peut collecter des profils CPU, mémoire, blocages, goroutines et de contention sur les mutex.



Ajout de pprof dans une application web



La façon la plus simple d'activer le profilage est d'importer le package net/http/pprof :



package main

import ( "net/http" _ "net/http/pprof" // enregistre les handlers pprof)

func main() { // Votre application http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil)}


Ensuite, à l'adresse /debug/pprof/, différents profils seront disponibles. Par exemple :



  • /debug/pprof/profile — profil CPU (30 secondes par défaut)
  • /debug/pprof/heap — profil mémoire (heap)
  • /debug/pprof/goroutine — dump de toutes les goroutines
  • /debug/pprof/block — profil des blocages


Collecte d'un profil CPU



Pour collecter un profil CPU, utilisez la commande :



go tool pprof http://localhost:8080/debug/pprof/profile?seconds=30


Une fois la collecte terminée, la console interactive pprof s'ouvre. Les commandes les plus utiles sont :



  • top — afficher les fonctions qui consomment le plus de CPU
  • list <fonction> — afficher la répartition ligne par ligne du temps
  • web — ouvrir le graphe d'appels dans le navigateur (nécessite Graphviz)
  • peek <fonction> — afficher les fonctions appelantes et appelées


Exemple de sortie de top :



Showing nodes accounting for 3.50s, 70% of 5.00s total      flat  flat%   sum%        cum   cum%     1.20s 24.00% 24.00%      1.20s 24.00%  encoding/json.(*Decoder).Decode     0.80s 16.00% 40.00%      0.80s 16.00%  runtime.mallocgc     0.60s 12.00% 52.00%      1.80s 36.00%  main.processData     0.50s 10.00% 62.00%      0.50s 10.00%  runtime.memmove     0.40s  8.00% 70.00%      0.40s  8.00%  strings.ToLower


Collecte d'un profil mémoire



Pour analyser l'utilisation de la mémoire :



go tool pprof http://localhost:8080/debug/pprof/heap


Commandes importantes dans pprof pour la mémoire :



  • top — fonctions qui allouent le plus de mémoire
  • sample_index=alloc_space — basculer sur la quantité totale de mémoire allouée
  • sample_index=inuse_space — basculer sur la mémoire actuellement utilisée
  • tr

Blogs

Book Recommendations