Sobes.tech
Middle

Kuidas mõõta Go mälu kasutust ja mis on pprof?

sobes.tech AI

Vastus AI-lt

Go-sises mälu kasutamist saab mõõta mitmel viisil:

  • runtime.MemStats: Pakub hetke pilti mälu kasutusest, sealhulgas kogumiku suurust, objektide arvu, prügikogumise ja muu kohta. Kasulik mälu jaotuse üldpildi saamiseks.

  • Profiler pprof: Võimas tööriist jõudluse ja ressursside kasutamise analüüsimiseks, sealhulgas mälu. See võimaldab koguda kogumiku kasutamise profiile erinevatel aegadel ja neid analüüsida, et tuvastada kitsaskohti ja mälulekkeid.

  • debug.FreeOSMemory(): Sunni mälu vabastamine operatsioonisüsteemile. See võib kaudselt aidata mõista, kui palju mälu hoiab Go jooksuaeg.

pprof (net/http/pprof) — see on Go standardraamatukogu paket, mis integreerub runtime/pprof paketist pprof. See pakub HTTP-liideseid erinevate ressursside profiilide kogumiseks, sealhulgas CPU, kogumiku (mälu), blokeeringute, goroutine'ide ja mutex'ide profiile.

Kasutamiseks:

  1. Impordige net/http/pprof.
  2. Käivitage HTTP-server.
  3. Pöörduge vastavate URL-ide (/debug/pprof/) poole, et saada profiile.
  4. Kasutage go tool pprof tööriista kogutud andmete analüüsimiseks.

Näide runtime.MemStats kasutamisest:

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

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Loeb mälu statistikat
	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)

	// Näide mälu kasutamisest
	_ = make([]byte, 1024*1024*10) // Määrab 10MB

	time.Sleep(100 * time.Millisecond) // Ootab, kuni GC töötab

	runtime.ReadMemStats(&m)
	fmt.Printf("Pärast eraldamist: 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-serveri näide pprof-iga:

import (
	_ "net/http/pprof" // pprof käsitlejate registreerimiseks
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // kuulame 6060 pordil
}

Pärast selle koodi käivitamist saate külastada aadressi http://localhost:6060/debug/pprof/ ja pääseda ligi erinevatele profiilidele. Kogutud mälu analüüsimiseks kasutage go tool pprof http://localhost:6060/debug/pprof/heap.