Sobes.tech
Middle

Kā var mērīt atmiņas izmantošanu Go un kas ir pprof?

sobes.tech AI

Atbilde no AI

Atmiņas izmantošanu Go var mērīt vairākos veidos:

  • runtime.MemStats: Sniedz atmiņas izmantošanas momentuzņēmumu, ieskaitot kaudzes lielumu, objektu skaitu, atkritumu savākšanu un citus rādītājus. Tas ir noderīgi, lai iegūtu kopēju priekšstatu par atmiņas sadalījumu.

  • Profiler pprof: Jaudīgs rīks veiktspējas un resursu izmantošanas analīzei, ieskaitot atmiņu. Tas ļauj savākt kaudzes izmantošanas profilus dažādos laikos un tos analizēt, lai identificētu šaurās vietas un atmiņas noplūdes.

  • debug.FreeOSMemory(): Piespiedu atbrīvo atmiņu operētājsistēmai. Tas var netieši palīdzēt saprast, cik daudz atmiņas izmanto Go laikmetā.

pprof (net/http/pprof) — tas ir Go standarta bibliotēkas pakets, kas integrējas ar runtime/pprof paketi pprof. Tas nodrošina HTTP saskarnes dažādu resursu profilu savākšanai, ieskaitot CPU, kaudzi (atmiņu), bloķēšanas, goroutine un mutexu profilus.

Lai to izmantotu:

  1. Importēt net/http/pprof.
  2. Sākt HTTP serveri.
  3. Apmeklēt atbilstošās URL adreses (/debug/pprof/) piekļuvei profiliem.
  4. Izmantot go tool pprof rīku analīzei savāktajiem datiem.

Piemērs, izmantojot runtime.MemStats:

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

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Nolasīt atmiņas statistiku
	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)

	// Piemērs, kā strādāt ar atmiņu
	_ = make([]byte, 1024*1024*10) // Rezervēt 10MB

	time.Sleep(100 * time.Millisecond) // Gaidīt, kamēr GC darbosies

	runtime.ReadMemStats(&m)
	fmt.Printf("Pēc piešķiršanas: 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
}

HTTP servera piemērs ar pprof:

import (
	_ "net/http/pprof" // reģistrē pprof handlerus
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // klausāmies uz 6060 portu
}

Pēc šī koda palaišanas, varat apmeklēt http://localhost:6060/debug/pprof/ un piekļūt dažādiem profiliem. Lai analizētu kaudzi, izmantojiet go tool pprof http://localhost:6060/debug/pprof/heap.