Sobes.tech
Middle

Kaip galima išmatuoti atminties naudojimą Go ir kas yra pprof?

sobes.tech AI

Atsakymas iš AI

Naudojant atmintį Go galima matuoti keliais būdais:

  • runtime.MemStats: Pateikia atminties naudojimo momentinį vaizdą, įskaitant krūvos dydį, objektų skaičių, šiukšlių surinkimą ir kt. Naudinga bendrai atminties paskirstymo apžvalgai.

  • Profileris pprof: Galingas įrankis našumo ir išteklių naudojimo analizei, įskaitant atmintį. Leidžia rinkti krūvos naudojimo profilius skirtingais laikais ir juos analizuoti, siekiant nustatyti vietas, kur yra spragos ir atminties nutekėjimai.

  • debug.FreeOSMemory(): Priverstinai atlaisvina atmintį operacinei sistemai. Tai gali netiesiogiai padėti suprasti, kiek atminties naudoja Go vykdymo laikas.

pprof (net/http/pprof) — tai Go standartinės bibliotekos paketas, kuris integruojasi su runtime/pprof paketu pprof profiliu. Jis teikia HTTP sąsajas įvairių išteklių profilių rinkimui, įskaitant CPU, krūvą (atmintį), blokus, gorutinas ir mutexus.

Naudojimui:

  1. Importuoti net/http/pprof.
  2. Paleisti HTTP serverį.
  3. Aplankyti atitinkamas URL (/debug/pprof/) profilų pasiekiamumui.
  4. Naudoti go tool pprof įrankį surinktų duomenų analizei.

Pavyzdys naudojant runtime.MemStats:

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

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Skaityti atminties statistiką
	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)

	// Pavyzdys, kaip dirbti su atmintimi
	_ = make([]byte, 1024*1024*10) // Rezervuoti 10MB

	time.Sleep(100 * time.Millisecond) // Palaukti, kol GC įvykdys

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

Pavyzdys naudojant pprof HTTP serveryje:

import (
	_ "net/http/pprof" // įtraukiame pprof registracijai
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // klausome 6060 prievadu
}

Po šio kodo paleidimo, galite naršyti adresu http://localhost:6060/debug/pprof/ ir pasiekti įvairius profilius. Krūvos analizę galima atlikti naudojant go tool pprof http://localhost:6060/debug/pprof/heap.