Hogyan mérhető a memóriahasználat Go-ban és mi az a pprof?
sobes.tech MI
Válasz az MI-től
A memóriahasználat Go-ban többféleképpen mérhető:
-
runtime.MemStats: Egy pillanatkép a memóriahasználati statisztikákról, beleértve a halom méretét, az objektumok számát, a szemétgyűjtést stb. Hasznos a memóriaeloszlás általános áttekintéséhez.
-
pprof profilozó: Egy erőteljes eszköz a teljesítmény és az erőforrások, beleértve a memóriát, történő elemzéséhez. Lehetővé teszi a halomhasználati profilok gyűjtését különböző időpontokban, és azok elemzését szűk keresztmetszetek és memória szivárgások azonosítására.
-
debug.FreeOSMemory(): Kényszeríti a memória felszabadítását az operációs rendszer felé. Közvetve segíthet megérteni, hogy a Go futásideje mennyi memóriát tart fenn.
A pprof (net/http/pprof) a Go standard könyvtárának egy csomagja, amely a runtime/pprof csomag pprof profilozójával integrálódik. HTTP interfészeket biztosít különböző erőforrások, például CPU, halom (memória), zárolások, goroutine-ok és mutexek profilozására.
Használatához:
- Importáld a
net/http/pprof-t. - Indíts egy HTTP szervert.
- Lépj a megfelelő URL-ekre (
/debug/pprof/) a profilok eléréséhez. - Használd a
go tool pprofeszközt az összegyűjtött adatok elemzéséhez.
Példa a runtime.MemStats használatára:
import (
"fmt"
"runtime"
"time"
)
func main() {
var m runtime.MemStats
runtime.ReadMemStats(&m) // Memória statisztikák olvasása
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)
// Memória használat példája
_ = make([]byte, 1024*1024*10) // 10MB lefoglalása
time.Sleep(100 * time.Millisecond) // Várakozás a GC futtatására
runtime.ReadMemStats(&m)
fmt.Printf("Utána: 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
}
Példa a pprof használatára egy HTTP szerveren:
import (
_ "net/http/pprof" // pprof kezelők regisztrálása
"net/http"
"log"
)
func main() {
log.Println(http.ListenAndServe(":6060", nil)) // Hallgatás a 6060-as porton
}
A kód futtatása után a http://localhost:6060/debug/pprof/ címen különböző profilokat érhet el. A halom elemzéséhez használja a go tool pprof http://localhost:6060/debug/pprof/heap parancsot.