Sobes.tech
Middle

Cum se poate măsura utilizarea memoriei în Go și ce este pprof?

sobes.tech AI

Răspuns de la AI

Utilizarea memoriei în Go poate fi măsurată în mai multe moduri:

  • runtime.MemStats: Oferă o fotografie a statisticilor de utilizare a memoriei, inclusiv dimensiunea heap-ului, numărul de obiecte, colectarea gunoiului etc. Este util pentru a obține o vedere de ansamblu asupra distribuției memoriei.

  • Profilator pprof: Un instrument puternic pentru analiza performanței și utilizarea resurselor, inclusiv memorie. Permite colectarea profilurilor de utilizare a heap-ului în diferite momente și analizarea lor pentru identificarea punctelor slabe și a scurgerilor de memorie.

  • debug.FreeOSMemory(): Eliberează memoria în mod forțat sistemului de operare. Poate ajuta indirect la înțelegerea câtă memorie reține runtime-ul Go.

pprof (net/http/pprof) este un pachet din biblioteca standard Go care se integrează cu profilatorul pprof din pachetul runtime/pprof. Oferă interfețe HTTP pentru colectarea profilurilor diferitelor resurse, inclusiv CPU, heap (memorie), blocări, goroutine și mutexuri.

Pentru a-l folosi:

  1. Importați net/http/pprof.
  2. Porniți un server HTTP.
  3. Accesați URL-urile corespunzătoare (/debug/pprof/) pentru a obține profiluri.
  4. Utilizați utilitarul go tool pprof pentru analiza datelor colectate.

Exemplu de utilizare a runtime.MemStats:

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

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Citirea statisticilor de memorie
	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)

	// Exemplu de lucru cu memoria
	_ = make([]byte, 1024*1024*10) // Alocă 10MB

	time.Sleep(100 * time.Millisecond) // Așteaptă ca GC să ruleze

	runtime.ReadMemStats(&m)
	fmt.Printf("După alocare: 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
}

Exemplu de utilizare pprof într-un server HTTP:

import (
	_ "net/http/pprof" // Înregistrarea handler-urilor pprof
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // Ascultă pe portul 6060
}

După ce porniți acest cod, puteți accesa http://localhost:6060/debug/pprof/ pentru a obține diferite profiluri. Pentru analiza heap-ului, puteți folosi go tool pprof http://localhost:6060/debug/pprof/heap.