Sobes.tech
Middle

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:

  1. Importeer net/http/pprof.
  2. Start een HTTP-server.
  3. Ga naar de juiste URL's (/debug/pprof/) om profielen te verkrijgen.
  4. Gebruik het go tool pprof hulpprogramma 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.