Sobes.tech
Middle

Kako izmeriti korišćenje memorije u Go i šta je pprof?

sobes.tech АИ

Одговор од АИ

Upotreba memorije u Go može se meriti na nekoliko načina:

  • runtime.MemStats: Pruža snapshot statistike korišćenja memorije, uključujući veličinu hrpe, broj objekata, sakupljanje smeća i dr. Koristan je za dobijanje opšte slike o rasporedu memorije.

  • Profiler pprof: Moćan alat za analizu performansi i korišćenja resursa, uključujući memoriju. Omogućava prikupljanje profila korišćenja hrpe u različitim trenucima i njihovu analizu za identifikaciju uskih grla i curenja memorije.

  • debug.FreeOSMemory(): Prisilno oslobađa memoriju operativnom sistemu. Može indirektno pomoći da se razume koliko memorije drži Go runtime.

pprof (net/http/pprof) — to je paket u standardnoj biblioteci Go, koji se integriše sa profilerom pprof iz paketa runtime/pprof. On pruža HTTP interfejse za prikupljanje profila različitih resursa, uključujući CPU, hrpu (memoriju), blokade, goroutine i muteakse.

Da biste ga koristili:

  1. Uvezite net/http/pprof.
  2. Pokrenite HTTP server.
  3. Posetite odgovarajuće URL adrese (/debug/pprof/) za pristup profilima.
  4. Koristite alat go tool pprof za analizu prikupljenih podataka.

Primer korišćenja runtime.MemStats:

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

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Čitamo statistiku memorije
	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)

	// Primer rada sa memorijom
	_ = make([]byte, 1024*1024*10) // Dodeljujemo 10MB

	time.Sleep(100 * time.Millisecond) // Čekamo da GC odradi svoj posao

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

Primer korišćenja pprof u HTTP serveru:

import (
	_ "net/http/pprof" // Uvozimo za registraciju pprof handlera
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // Slušamo na portu 6060
}

Nakon pokretanja ovog koda, možete pristupiti adresi http://localhost:6060/debug/pprof/ i dobiti pristup različitim profilima. Za analizu hrpe, koristite go tool pprof http://localhost:6060/debug/pprof/heap.