Au-delà des instructions d'impression : techniques de débogage pour les programmes Go (Section 2)
Dans cette section, nous parlerons du débogage avancé dans le langage de programmation Go. Le débogage d'applications Go complexes peut être décourageant, en particulier lorsqu'il s'agit de problèmes de performances ou de fuites de mémoire. Heureusement, Go propose un puissant outil de profilage et d'analyse des performances des applications : Pprof.
Pprof est un outil de profilage qui vous permet d'identifier les goulots d'étranglement des performances dans votre code en collectant et en analysant les données d'exécution. Avec pprof, vous pouvez obtenir des informations détaillées sur les performances de votre application, y compris des informations sur l'utilisation du processeur, l'allocation de mémoire, etc. En utilisant pprof, vous pouvez optimiser votre code et vous assurer que votre application fonctionne correctement, même sous de lourdes charges. Nous allons explorer comment utiliser pprof pour déboguer et optimiser vos applications Go. Nous couvrirons les bases de pprof, y compris comment collecter des données de profilage et générer des rapports. Nous aborderons également des sujets plus avancés, tels que l'interprétation des rapports de profilage et l'identification des goulots d'étranglement des performances dans votre code.
parlons plus concrètement des outils pprof en Go. Je vais commencer par un simple exemple de code Go. imaginons que nous ayons un programme Go qui utilise beaucoup de mémoire sous de lourdes charges. Nous soupçonnons qu'il pourrait y avoir un goulot d'étranglement de performance dans la randomFunction
fonction, qui effectue certains calculs qui sont au cœur de la fonctionnalité du programme.
import (
"fmt"
"net/http"
"sync"
"time"
_ "net/http/pprof"
)
func randomFunction(wg *sync.WaitGroup) {
defer wg.Done()
// This piece of code consumes Memory a lot
var a []int
for i := 0; i < 2<<30; i++ {
a = append(a, i)
}
time.Sleep(3 * time.Second)
}
func main() {
var wg sync.WaitGroup
// Server for pprof
go func() {
fmt.Println(http.ListenAndServe("localhost:5500", nil))
}()
wg.Add(1)
wg.Add(1) // we add another to wait program in wg.Wait forever and program can't exit
go randomFunction(&wg)
wg.Wait()
}
go run main.go &
go tool pprof http://localhost:5500/debug/pprof/heap
Dans ce rapport, nous pouvons voir que la randomFunction
fonction occupe une partie importante de la mémoire, puis nous prenons des mesures pour l'optimiser.
En utilisant pprof de cette manière, vous pouvez rapidement identifier les problèmes de performances dans votre code et prendre des mesures pour l'optimiser.
exportons d'abord ce rapport sous forme de fichier image, nous devons d'abord installer un outil :
pour Linux (basé sur Debian) :
apt-get install graphviz gv
brew install graphviz
vous pouvez installer ubuntu WSL et exécuter la commande Linux
maintenant, exécutez à nouveau la commande et au lieu d' top
utiliser png
la commande. vous pouvez voir qu'une image créée dans votre espace de travail
essayons cet outil pour obtenir un graphe de goroutines, donc :
go tool pprof http://localhost:5500/debug/pprof/goroutine
et ceci est une image générée :
pprof fournit un outil de visualisation basé sur le Web qui facilite l'analyse des données de profilage. Pour utiliser l'interface Web, vous pouvez accéder à http://localhost:5500/debug/pprof/
dans votre navigateur Web. Cela affichera une liste de points de terminaison de profilage que vous pouvez utiliser pour collecter différents types de données de profilage.
Par exemple, pour collecter un profil CPU à l'aide de l'interface Web, vous pouvez cliquer sur le profile
lien. Cela téléchargera un fichier de profil binaire sur votre machine locale.
Dans la section suivante, en tant que dernière section pour le débogage dans le langage de programmation Go, je parlerai des techniques d'identification et de résolution des conditions de concurrence, des blocages et d'autres problèmes de concurrence qui peuvent être difficiles à diagnostiquer.