Maison >développement back-end >Golang >Guide d'optimisation des performances Go : maîtriser Go pprof

Guide d'optimisation des performances Go : maîtriser Go pprof

WBOY
WBOYoriginal
2024-04-07 10:30:02474parcourir

Guide d'optimisation des performances Go : Maîtrisez Go pprof Le langage Go fournit l'outil d'analyse des performances pprof, qui peut être optimisé en suivant les étapes suivantes : Installez l'outil Go pprof : go install golang.org/x/perf/cmd/pprof@latest Générer fichier d'analyse des performances : pprof -seconds=5 http-server.exe fichier de profilage des performances d'analyse : pprof http-server.exe, utilisez les commandes top, flamegraph, callgraph et web dans l'outil de ligne de commande pour analyser la mémoire, le processeur et le temps. Cas pratique : Corrigez les fuites de mémoire en optimisant le code pour libérer les instances *http.Handler, améliorant ainsi considérablement l'efficacité du programme.

Go 性能优化指南:掌握 Go pprof

Guide d'optimisation des performances Go : Maîtriser Go pprof

Introduction

Le langage Go fournit un puissant outil d'analyse des performances pprof, qui peut aider les développeurs à identifier et à optimiser les goulots d'étranglement des performances des programmes. Cet article présentera comment utiliser pprof pour l'analyse des performances et démontrera comment optimiser le code Go à travers un cas pratique.

Installer et utiliser pprof

  1. Installer l'outil Go pprof :
go install golang.org/x/perf/cmd/pprof@latest
  1. Générer le fichier de profilage :
pprof -seconds=5 http-server.exe

Analyser le fichier de profilage

pprof Le fichier généré peut être visualisé et analysé à l'aide d'outils de ligne de commande interactifs :

pprof http-server.exe

Commandes courantes

  • top : Affichez les fonctions qui consomment le plus de temps, de CPU et de mémoire. top:显示消耗时间、CPU 和内存最多的函数。
  • flamegraph:生成火焰图,可视化函数调用的时间分布。
  • callgraph:生成调用图,显示函数之间的调用关系。
  • web:启动一个交互式的 Web 界面,提供所有分析功能。

实战案例:内存优化

以下是一个简化的 Go 代码示例,它会出现内存泄漏问题:

package main

import (
    "fmt"
    "runtime"

    "github.com/gorilla/mux"
)

func main() {
    router := mux.NewRouter()
    router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {})

    // 在处理请求中创建大量的空结构体
    for i := 0; i < 10000; i++ {
        router.HandleFunc(fmt.Sprintf("/%d", i), func(w http.ResponseWriter, r *http.Request) {})
    }
}

使用 pprof 分析内存泄漏

  1. 运行程序并生成内存剖析文件:
pprof -allocspace=1024 http-server.exe
  1. 使用交互式命令行工具分析文件:
pprof http-server.exe
  1. 输入以下命令查看分配最多的内存:
top -sort=inuse

输出将显示分配最多的对象类型,如:

Flat profile: alloc space = 1.05 GiB
   Node count   Node alloc bytes
               1       1.05 GiB       <nil>

这表明程序生成了大量的 *http.Handler 实例,它们在处理请求后从未被释放。

优化代码

要修复内存泄漏,可以修改代码,在不再需要时手动释放 *http.Handler

flamegraph : Générez un graphique de flamme pour visualiser la distribution temporelle des appels de fonction.

callgraph : générez un graphique d'appel pour montrer la relation d'appel entre les fonctions.

web : lancez une interface Web interactive qui fournit toutes les fonctions d'analyse.

Cas pratique : Optimisation de la mémoire

Ce qui suit est un exemple de code Go simplifié, qui aura un problème de fuite de mémoire :🎜
for i := 0; i < 10000; i++ {
    path := fmt.Sprintf("/%d", i)
    router.Handle(path, http.HandlerFunc(myHandler)).Methods(http.MethodGet)
    runtime.SetFinalizer(&router.Handlers[path], func(h http.Handler) {
        h.ServeHTTP(nil, nil)
        router.Remove(path)
    })
}
🎜Utilisez pprof pour analyser les fuites de mémoire🎜🎜🎜Exécutez le programme et générez un profilage de la mémoire file:🎜🎜
Flat profile: alloc space = 20 MiB
   Node count   Node alloc bytes
               1        20 MiB       <nil>
🎜🎜Utilisez un outil de ligne de commande interactif pour analyser le fichier : 🎜🎜rrreee
    🎜Entrez la commande suivante pour voir la mémoire la plus allouée : 🎜🎜rrreee🎜La sortie affichera le les types d'objets les plus alloués, tels que : 🎜rrreee 🎜Cela indique que le programme génère un grand nombre d'instances *http.Handler qui ne sont jamais libérées après le traitement de la requête. 🎜🎜Optimisez le code🎜🎜Pour corriger la fuite de mémoire, vous pouvez modifier le code pour libérer manuellement *http.Handler lorsqu'il n'est plus nécessaire Exemple : 🎜rrreee🎜Résultats de l'optimisation🎜🎜Réexécutez le programme avec. le code optimisé Et générez un fichier de profilage de la mémoire, vous pouvez observer que la fuite de mémoire a été résolue : 🎜rrreee🎜Conclusion🎜🎜pprof est un outil puissant qui aide les développeurs à identifier et à optimiser les performances du code Go. En comprenant comment générer et analyser les fichiers de profilage pprof, les développeurs peuvent rapidement identifier et résoudre les problèmes de performances, améliorant ainsi considérablement l'efficacité du programme. 🎜

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn