Sobes.tech
Middle

Comment mesurer l'utilisation de la mémoire en Go et qu'est-ce que pprof?

sobes.tech IA

Réponse de l'IA

L'utilisation de la mémoire en Go peut être mesurée de plusieurs façons:

  • runtime.MemStats: Fournit une instantanée des statistiques d'utilisation de la mémoire, y compris la taille du tas, le nombre d'objets, la collecte des déchets, etc. Utile pour avoir une vue d'ensemble de la répartition de la mémoire.

  • Profilage pprof: Un outil puissant pour analyser la performance et l'utilisation des ressources, y compris la mémoire. Permet de collecter des profils d'utilisation du tas à différents moments et de les analyser pour identifier les goulets d'étranglement et les fuites de mémoire.

  • debug.FreeOSMemory(): Libère la mémoire de manière forcée au système d'exploitation. Peut aider indirectement à comprendre combien de mémoire est retenue par le runtime de Go.

pprof (net/http/pprof) est un paquet de la bibliothèque standard de Go qui s'intègre avec le profileur pprof du paquet runtime/pprof. Il fournit des interfaces HTTP pour collecter des profils de diverses ressources, y compris CPU, tas (mémoire), blocages, goroutines et mutex.

Pour l'utiliser:

  1. Importer net/http/pprof.
  2. Démarrer un serveur HTTP.
  3. Accéder aux URLs correspondantes (/debug/pprof/) pour obtenir des profils.
  4. Utiliser l'outil go tool pprof pour analyser les données collectées.

Exemple d'utilisation de runtime.MemStats:

import (
	"fmt"
	"runtime"
	"time"
)

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Lire les statistiques de mémoire
	fmt.Printf("Alloc = %v MiB", bToMb(m.Alloc))
	fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
	fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
	fmt.Printf("\tNumGC = %v\n", m.NumGC)

	// Exemple de travail avec la mémoire
	_ = make([]byte, 1024*1024*10) // Allouer 10MB

	time.Sleep(100 * time.Millisecond) // Attendre que le GC puisse s'exécuter

	runtime.ReadMemStats(&m)
	fmt.Printf("Après allocation: Alloc = %v MiB", bToMb(m.Alloc))
	fmt.Printf("\tTotalAlloc = %v MiB", bToMb(m.TotalAlloc))
	fmt.Printf("\tSys = %v MiB", bToMb(m.Sys))
	fmt.Printf("\tNumGC = %v\n", m.NumGC)
}

func bToMb(b uint64) uint64 {
	return b / 1024 / 1024
}

Exemple d'utilisation de pprof dans un serveur HTTP:

import (
	_ "net/http/pprof" // Importer pour enregistrer les gestionnaires pprof
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // Écouter sur le port 6060
}

Après avoir lancé ce code, vous pouvez accéder à http://localhost:6060/debug/pprof/ pour obtenir différents profils. Pour analyser le tas, utilisez go tool pprof http://localhost:6060/debug/pprof/heap.