Performances Go : comment profiler et accélérer le code

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

Votre code Go est lent ? Il est temps de regarder sous le capot

\n\n

Vous avez écrit un service en Go. Il fonctionne. Mais lorsque la charge atteint 10 000 RPS, le serveur commence à « s'essouffler ». Une situation familière ? Go est réputé pour ses performances « prêtes à l'emploi », mais même ce langage élégant a ses pièges. Les fuites de goroutines, une gestion inefficace de la mémoire, des allocations superflues – tout cela tue la vitesse.

\n\n

Dans cet article, nous allons voir comment le profilage Go aide à trouver les goulots d'étranglement, et montrer des techniques concrètes d'optimisation d'applications Go. Vous apprendrez comment, grâce aux outils intégrés pprof et go test -bench, transformer votre application en fusée. C'est parti !

\n\n

La boîte à outils du profileur : pprof et trace

\n\n

Go fournit deux outils puissants pour l'analyse des performances : pprof (profilage CPU, mémoire, verrous) et go tool trace (analyse de la concurrence et des événements GC).

\n\n

Intégrer pprof dans un serveur HTTP

\n\n

La façon la plus simple de commencer le profilage est d'ajouter net/http/pprof à votre serveur. Cela prend exactement une ligne d'import :

\n\n
import (\n    _ "net/http/pprof"\n    "net/http"\n)\n\nfunc main() {\n    http.ListenAndServe(":8080", nil)\n}
\n\n

Maintenant, les profils sont disponibles à l'adresse /debug/pprof/. Pour capturer un profil CPU pendant 30 secondes, exécutez :

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

Après la collecte des données, une console interactive se lance. La commande top15 affiche les fonctions les plus gourmandes :

\n\n
(pprof) top15\nShowing nodes accounting for 3.50s, 87.50% of 4.00s total\n      flat  flat%   sum%        cum   cum%\n     1.20s 30.00% 30.00%      1.50s 37.50%  main.heavyComputation
\n\n

Vous voyez main.heavyComputation ? C'est notre candidat à l'optimisation. Pour la visualisation, utilisez web (si Graphviz est installé) – vous obtiendrez un graphe d'appels.

\n\n

Profilage mémoire : rechercher les fuites

\n\n

Les fuites mémoire en Go sont le plus souvent des fuites de goroutines ou des références oubliées à de gros objets. Capturons un profil heap :

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

La commande alloc_objects montre quelles fonctions créent le plus d'objets :

\n\n
(pprof) alloc_objects\n    2.50GB  100%  100%      2.50GB  100%  main.createLargeSlice
\n\n

Voilà comment nous avons trouvé une fonction qui alloue 2,5 Go de mémoire ! Peut-être qu'elle crée une énorme slice qui pourrait être réutilisée avec sync.Pool.

\n\n

Écrire des benchmarks : votre premier pas vers l'optimisation

\n\n

Avant d'optimiser, il faut mesurer. Les benchmarks Go sont l'outil standard pour mesurer les performances de fonctions individuelles.

\n\n

Exemple : comparer la concaténation de chaînes

\n\n

Supposons que nous concaténions des chaînes dans une boucle. La mauvaise version :

\n\n
func ConcatSlow(parts []string) string {\n    result := ""\n    for _, p := range parts {\n        result += p\n    }\n    return result\n}
\n\n

La bonne version – utiliser strings.Builder :

\n\n
func ConcatFast(parts []string) string {\n    var b strings.Builder\n    for _, p := range parts {\n        b.WriteString(p)\n    }\n    return b.String()\n}
\n\n

Écrivons un benchmark (fichier concat_test.go) :

\n\n
func BenchmarkConcatSlow(b *testing.B) {\n    parts := []string{"Hello", " ", "World", "!", " ", "From", " ", "Go"}\n    for i := 0; i < b.N; i++ {\n        ConcatSlow(parts)\n    }\n}\n\nfunc BenchmarkConcatFast(b *testing.B) {\n    parts := []string{"Hello", " ", "World", "!", " ", "From", " ", "Go"}\n    for i := 0; i < b.N; i++ {\n        ConcatFast(parts)\n    }\n}
\n\n

Lançons :

\n\n
go test -bench=. -benchmem
\n\n

Résultat :

\n\n
BenchmarkConc                

Blogs

Book Recommendations