Sobes.tech
Middle

Jak změřit využití paměti v Go a co je pprof?

sobes.tech AI

Odpověď od AI

Použití paměti v Go lze měřit několika způsoby:

  • runtime.MemStats: Poskytuje snímek statistik využití paměti, včetně velikosti haldy, počtu objektů, sběru odpadu atd. Je užitečný pro získání celkového přehledu o rozdělení paměti.

  • Profil pprof: Výkonný nástroj pro analýzu výkonu a využití zdrojů, včetně paměti. Umožňuje sbírat profily využití haldy v různých časech a analyzovat je za účelem identifikace úzkých míst a úniků paměti.

  • debug.FreeOSMemory(): Vynuceně uvolňuje paměť operačnímu systému. Může nepřímo pomoci pochopit, kolik paměti si udržuje běhové prostředí Go.

pprof (net/http/pprof) je balíček v standardní knihovně Go, který se integruje s profilerem pprof z balíčku runtime/pprof. Poskytuje HTTP rozhraní pro sběr profilů různých zdrojů, včetně CPU, haldy (paměti), zámků, gorutin a mutexů.

Pro použití:

  1. Importujte net/http/pprof.
  2. Spusťte HTTP server.
  3. Přistupte k odpovídajícím URL (/debug/pprof/) pro získání profilů.
  4. Použijte nástroj go tool pprof pro analýzu sesbíraných dat.

Příklad použití runtime.MemStats:

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

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Čtení statistik paměti
	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)

	// Příklad práce s pamětí
	_ = make([]byte, 1024*1024*10) // Vyhrazení 10MB

	time.Sleep(100 * time.Millisecond) // Čekání na spuštění GC

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

Příklad použití pprof v HTTP serveru:

import (
	_ "net/http/pprof" // Registrace handlerů pprof
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // Naslouchání na portu 6060
}

Po spuštění tohoto kódu můžete přistupovat na http://localhost:6060/debug/pprof/ a získat různé profily. Pro analýzu haldy použijte go tool pprof http://localhost:6060/debug/pprof/heap.