Hoe meet je het geheugenverbruik in Go en wat is pprof?
sobes.tech AI
Antwoord van AI
Het geheugen gebruik in Go kan op verschillende manieren worden gemeten:
-
runtime.MemStats: Biedt een momentopname van de geheugenstatistieken, inclusief de grootte van de heap, het aantal objecten, garbage collection, enzovoort. Het is handig voor het krijgen van een algemeen overzicht van de geheugenverdeling.
-
pprof profiler: Een krachtig hulpmiddel voor het analyseren van prestaties en resourcegebruik, inclusief geheugen. Het stelt je in staat om heap-gebruikprofielen op verschillende momenten te verzamelen en te analyseren om knelpunten en geheugenlekken te identificeren.
-
debug.FreeOSMemory(): Dwingt geheugen vrij te geven aan het besturingssysteem. Het kan indirect helpen te begrijpen hoeveel geheugen de Go-runtime vasthoudt.
pprof (net/http/pprof) is een pakket in de standaardbibliotheek van Go dat integreert met de pprof profiler uit het runtime/pprof pakket. Het biedt HTTP-interfaces voor het verzamelen van profielen van verschillende bronnen, waaronder CPU, heap (geheugen), blokkades, goroutines en mutexen.
Om het te gebruiken:
- Importeer
net/http/pprof. - Start een HTTP-server.
- Ga naar de juiste URL's (
/debug/pprof/) om profielen te verkrijgen. - Gebruik het
go tool pprofhulpprogramma om de verzamelde gegevens te analyseren.
Voorbeeld van het gebruik van runtime.MemStats:
import (
"fmt"
"runtime"
"time"
)
func main() {
var m runtime.MemStats
runtime.ReadMemStats(&m) // Lees geheugenstatistieken
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)
// Voorbeeld van geheugen gebruik
_ = make([]byte, 1024*1024*10) // Reserveer 10MB
time.Sleep(100 * time.Millisecond) // Wacht tot GC kan uitvoeren
runtime.ReadMemStats(&m)
fmt.Printf("Na allocatie: 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
}
Voorbeeld van het gebruik van pprof in een HTTP-server:
import (
_ "net/http/pprof" // Importeer om pprof handlers te registreren
"net/http"
"log"
)
func main() {
log.Println(http.ListenAndServe(":6060", nil)) // Luister op poort 6060
}
Na het starten van deze code, kun je naar http://localhost:6060/debug/pprof/ gaan om verschillende profielen te bekijken. Voor heap-analyse, gebruik go tool pprof http://localhost:6060/debug/pprof/heap.