Sobes.tech
Middle

Come si può misurare l'uso della memoria in Go e cos'è pprof?

sobes.tech AI

Risposta dell'AI

L'uso della memoria in Go può essere misurato in diversi modi:

  • runtime.MemStats: Fornisce uno snapshot delle statistiche di utilizzo della memoria, inclusa la dimensione dell'heap, il numero di oggetti, la raccolta dei rifiuti, ecc. Utile per avere una panoramica generale della distribuzione della memoria.

  • Profilatore pprof: Uno strumento potente per analizzare le prestazioni e l'utilizzo delle risorse, inclusa la memoria. Permette di raccogliere profili dell'uso dell'heap in diversi momenti e analizzarli per identificare colli di bottiglia e perdite di memoria.

  • debug.FreeOSMemory(): Rilascia forzatamente la memoria al sistema operativo. Può aiutare indirettamente a capire quanta memoria il runtime di Go mantiene.

pprof (net/http/pprof) è un pacchetto della libreria standard di Go che si integra con il profiler pprof del pacchetto runtime/pprof. Fornisce interfacce HTTP per raccogliere profili di varie risorse, tra cui CPU, heap (memoria), blocchi, goroutine e mutex.

Per usarlo:

  1. Importare net/http/pprof.
  2. Avviare un server HTTP.
  3. Accedere agli URL corrispondenti (/debug/pprof/) per ottenere profili.
  4. Utilizzare lo strumento go tool pprof per analizzare i dati raccolti.

Esempio di utilizzo di runtime.MemStats:

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

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Leggere le statistiche di memoria
	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)

	// Esempio di lavoro con la memoria
	_ = make([]byte, 1024*1024*10) // Assegna 10MB

	time.Sleep(100 * time.Millisecond) // Aspetta che il GC possa eseguirsi

	runtime.ReadMemStats(&m)
	fmt.Printf("Dopo l'allocazione: 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
}

Esempio di utilizzo di pprof in un server HTTP:

import (
	_ "net/http/pprof" // Importa per registrare i gestori pprof
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // Ascolta sulla porta 6060
}

Dopo aver avviato questo codice, puoi accedere a http://localhost:6060/debug/pprof/ per ottenere vari profili. Per analizzare l'heap, puoi usare go tool pprof http://localhost:6060/debug/pprof/heap.