როგორ შეიძლება გაზომოთ მეხსიერების გამოყენება Go-ში და რა არის pprof?
sobes.tech AI
პასუხი AI-სგან
Go-да хәтер куллануны берничә ысул белән үлчәргә мөмкин:
-
runtime.MemStats: Хәтер куллану статистикасының төшермәсе, шул исәптән җыелган күләм, объектлар саны, чүп җыю һәм башка. Ул хәтер бүленешенең гомуми күренешен алырга файдалы.
-
Профайлер pprof: Көчле инструмент, ул эшләү тизлеген һәм ресурслар куллануын, шул исәптән хәтерне анализлау өчен. Ул җыелган күләм профилләрен төрле вакытларда җыю һәм аларны анализлау мөмкинлеген бирә, бу тарлыклар һәм хәтер агып китүләрен ачыкларга ярдәм итә.
-
debug.FreeOSMemory(): Операцион системага хәтерне мәҗбүриләп бушату. Ул косвенно Go рантаймында ничә хәтер тотылганын аңларга ярдәм итә.
pprof (net/http/pprof) — бу Go стандарт китапханәсендәге пакет, ул runtime/pprof пакетыннан pprof профайлеры белән интеграцияләнә. Ул CPU, җыелган күләм (хәтер), блокировкалар, goroutine һәм мьютексларның профильләрен җыю өчен HTTP интерфейсларын тәкъдим итә.
Аны куллану өчен:
net/http/pprofны импортлау.- HTTP серверын башлау.
- Тиешле URL-адресларга (
/debug/pprof/) кереп профильләрне карау. - Җыелган мәгълүматларны анализлау өчен
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 кулланырга мөмкин.