Sobes.tech
Middle

Ako merať využitie pamäte v Go a čo je pprof?

sobes.tech AI

Odpoveď od AI

Použitie pamäte v Go je možné merať niekoľkými spôsobmi:

  • runtime.MemStats: Poskytuje snapshot štatistík využívania pamäte, vrátane veľkosti haldy, počtu objektov, zberu odpadu a pod. Je užitočný na získanie všeobecného prehľadu o rozložení pamäte.

  • Profiler pprof: Silný nástroj na analýzu výkonu a využívania zdrojov, vrátane pamäte. Umožňuje zbierať profily využívania haldy v rôznych časových bodoch a analyzovať ich na identifikáciu úzkych miest a únikov pamäte.

  • debug.FreeOSMemory(): Nútene uvoľňuje pamäť operačnému systému. Môže nepriamo pomôcť pochopiť, koľko pamäte drží Go runtime.

pprof (net/http/pprof) — je balík v štandardnej knižnici Go, ktorý sa integruje s profilerom pprof z balíka runtime/pprof. Poskytuje HTTP rozhrania na zber profilov rôznych zdrojov, vrátane CPU, haldy (pamäte), blokád, gorútín a mutexov.

Na jeho použitie:

  1. Importujte net/http/pprof.
  2. Spustite HTTP server.
  3. Navštívte príslušné URL adresy (/debug/pprof/) na prístup k profilom.
  4. Použite nástroj go tool pprof na analýzu zozbieraných dát.

Príklad použitia runtime.MemStats:

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

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Čítame štatistiku pamäte
	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)

	// Príklad práce s pamäťou
	_ = make([]byte, 1024*1024*10) // Vyhradzujeme 10MB

	time.Sleep(100 * time.Millisecond) // Čakáme, aby GC mohol odbehnúť

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

Príklad použitia pprof v HTTP serveri:

import (
	_ "net/http/pprof" // Importujeme na registráciu pprof handlerov
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // Počúvame na porte 6060
}

Po spustení tohto kódu môžete pristúpiť na adresu http://localhost:6060/debug/pprof/ a získať prístup k rôznym profilom. Na analýzu haldy použite go tool pprof http://localhost:6060/debug/pprof/heap.