Sobes.tech
Middle

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:

  1. Importáld a net/http/pprof-t.
  2. Indíts egy HTTP szervert.
  3. Lépj a megfelelő URL-ekre (/debug/pprof/) a profilok eléréséhez.
  4. Használd a go tool pprof eszkö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.