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í:
- Importujte
net/http/pprof. - Spusťte HTTP server.
- Přistupte k odpovídajícím URL (
/debug/pprof/) pro získání profilů. - Použijte nástroj
go tool pprofpro 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.