Sobes.tech
Middle

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ć:

  1. Zaimportuj net/http/pprof.
  2. Uruchom serwer HTTP.
  3. Uzyskaj dostęp do odpowiednich URL-i (/debug/pprof/) w celu pobrania profili.
  4. Użyj narzędzia go tool pprof do 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.