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:
- Importēt
net/http/pprof. - Sākt HTTP serveri.
- Apmeklēt atbilstošās URL adreses (
/debug/pprof/) piekļuvei profiliem. - Izmantot
go tool pprofrī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.