Jak zmierzyć użycie pamięci w Go i czym jest pprof?
sobes.tech AI
Odpowiedź od AI
Użycie pamięci w Go można mierzyć na kilka sposobów:
-
runtime.MemStats: Zapewnia migawkę statystyk użycia pamięci, w tym rozmiar sterty, liczbę obiektów, zbieranie śmieci itp. Przydatne do uzyskania ogólnego obrazu rozkładu pamięci.
-
Profilator pprof: Potężne narzędzie do analizy wydajności i wykorzystania zasobów, w tym pamięci. Pozwala na zbieranie profili użycia sterty w różnych momentach i ich analizę w celu wykrycia wąskich gardeł i wycieków pamięci.
-
debug.FreeOSMemory(): Wymusza zwolnienie pamięci do systemu operacyjnego. Może pośrednio pomóc zrozumieć, ile pamięci utrzymuje środowisko uruchomieniowe Go.
pprof (net/http/pprof) to pakiet w standardowej bibliotece Go, który integruje się z profilowaniem pprof z pakietu runtime/pprof. Udostępnia interfejsy HTTP do zbierania profili różnych zasobów, w tym CPU, sterty (pamięci), blokad, gorutyn i mutexów.
Aby go użyć:
- Zaimportuj
net/http/pprof. - Uruchom serwer HTTP.
- Uzyskaj dostęp do odpowiednich URL-i (
/debug/pprof/) w celu pobrania profili. - Użyj narzędzia
go tool pprofdo analizy zebranych danych.
Przykład użycia runtime.MemStats:
import (
"fmt"
"runtime"
"time"
)
func main() {
var m runtime.MemStats
runtime.ReadMemStats(&m) // Odczyt statystyk pamięci
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)
// Przykład pracy z pamięcią
_ = make([]byte, 1024*1024*10) // Przydziel 10MB
time.Sleep(100 * time.Millisecond) // Poczekaj, aż GC się wykona
runtime.ReadMemStats(&m)
fmt.Printf("Po alokacji: 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
}
Przykład użycia pprof w serwerze HTTP:
import (
_ "net/http/pprof" // Rejestracja obsługi pprof
"net/http"
"log"
)
func main() {
log.Println(http.ListenAndServe(":6060", nil)) // Nasłuchuj na porcie 6060
}
Po uruchomieniu tego kodu można przejść do http://localhost:6060/debug/pprof/ i uzyskać dostęp do różnych profili. Do analizy sterty można użyć go tool pprof http://localhost:6060/debug/pprof/heap.