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:
- Importați
net/http/pprof. - Porniți un server HTTP.
- Accesați URL-urile corespunzătoare (
/debug/pprof/) pentru a obține profiluri. - Utilizați utilitarul
go tool pprofpentru 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.