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=30Une 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 CPUlist <fonction>— afficher la répartition ligne par ligne du tempsweb— 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.ToLowerCollecte d'un profil mémoire
Pour analyser l'utilisation de la mémoire :
go tool pprof http://localhost:8080/debug/pprof/heapCommandes importantes dans pprof pour la mémoire :
top— fonctions qui allouent le plus de mémoiresample_index=alloc_space— basculer sur la quantité totale de mémoire allouéesample_index=inuse_space— basculer sur la mémoire actuellement utiliséetr