Sobes.tech
Middle

როგორ შეიძლება გაზომოთ მეხსიერების გამოყენება Go-ში და რა არის pprof?

sobes.tech AI

პასუხი AI-სგან

Go-да хәтер куллануны берничә ысул белән үлчәргә мөмкин:

  • runtime.MemStats: Хәтер куллану статистикасының төшермәсе, шул исәптән җыелган күләм, объектлар саны, чүп җыю һәм башка. Ул хәтер бүленешенең гомуми күренешен алырга файдалы.

  • Профайлер pprof: Көчле инструмент, ул эшләү тизлеген һәм ресурслар куллануын, шул исәптән хәтерне анализлау өчен. Ул җыелган күләм профилләрен төрле вакытларда җыю һәм аларны анализлау мөмкинлеген бирә, бу тарлыклар һәм хәтер агып китүләрен ачыкларга ярдәм итә.

  • debug.FreeOSMemory(): Операцион системага хәтерне мәҗбүриләп бушату. Ул косвенно Go рантаймында ничә хәтер тотылганын аңларга ярдәм итә.

pprof (net/http/pprof) — бу Go стандарт китапханәсендәге пакет, ул runtime/pprof пакетыннан pprof профайлеры белән интеграцияләнә. Ул CPU, җыелган күләм (хәтер), блокировкалар, goroutine һәм мьютексларның профильләрен җыю өчен HTTP интерфейсларын тәкъдим итә.

Аны куллану өчен:

  1. net/http/pprofны импортлау.
  2. HTTP серверын башлау.
  3. Тиешле URL-адресларга (/debug/pprof/) кереп профильләрне карау.
  4. Җыелган мәгълүматларны анализлау өчен go tool pprof утилитасын куллану.

Мисал итеп runtime.MemStats куллану:

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

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Хәтер статистикасын уку
	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)

	// Хәтер белән эшләү мисалы
	_ = make([]byte, 1024*1024*10) // 10MB билгели

	time.Sleep(100 * time.Millisecond) // GC-ның эшләвен көтү

	runtime.ReadMemStats(&m)
	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)
}

func bToMb(b uint64) uint64 {
	return b / 1024 / 1024
}

HTTP серверында pprof куллану мисалы:

import (
	_ "net/http/pprof" // pprof хендлерларын теркәү өчен импортлау
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // 6060 портында тыңлау
}

Бу кодны эшләтеп җибәргәннән соң, http://localhost:6060/debug/pprof/ адресына кереп, төрле профильләргә керә аласыз. Кучның анализы өчен go tool pprof http://localhost:6060/debug/pprof/heap кулланырга мөмкин.