Go'da xotira foydalanishini qanday o'lchash mumkin va pprof nima?
sobes.tech AI
AIdan javob
Go'da xotira ishlatilishini bir nechta usul bilan o'lchash mumkin:
-
runtime.MemStats: Xotira ishlatilishining statistikasi haqida snapshot taqdim etadi, jumladan, to'plamning o'lchami, ob'ektlar soni, chiqindilarni yig'ish va boshqalar. Xotira taqsimoti haqida umumiy tasavvur olish uchun foydalidir.
-
pprof profiling: Ishlash tezligi va resurslardan foydalanishni, jumladan xotirani, tahlil qilish uchun kuchli vositadir. U to'plamdan foydalanish profilingini turli vaqtlarda to'plash va ularni tahlil qilish imkonini beradi, bu esa muammoli joylar va xotira oqib ketishlarini aniqlashga yordam beradi.
-
debug.FreeOSMemory(): Operatsion tizimga majburan xotira bo'shatadi. Bu Go ish vaqtining qancha xotira ushlab turishini bilishga yordam berishi mumkin.
pprof (net/http/pprof) Go ning standart kutubxonasidagi paket bo'lib, u runtime/pprof paketidan pprof profiling bilan integratsiyalashgan. U CPU, to'plam (xotira), blokirovka, goroutine va mutexlar kabi turli resurslarning profilingini HTTP interfeysi orqali taqdim etadi.
Uni ishlatish uchun:
net/http/pprofni import qiling.- HTTP serverini ishga tushiring.
- Profilga kirish uchun mos URL'larni (
/debug/pprof/) oching. - To'plangan ma'lumotlarni tahlil qilish uchun
go tool pprofni foydalaning.
runtime.MemStats dan foydalanish misoli:
import (
"fmt"
"runtime"
"time"
)
func main() {
var m runtime.MemStats
runtime.ReadMemStats(&m) // Xotira statistikalarini o'qish
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)
// Xotira bilan ishlash misoli
_ = make([]byte, 1024*1024*10) // 10MB ajratish
time.Sleep(100 * time.Millisecond) // GC ishga tushishini kutish
runtime.ReadMemStats(&m)
fmt.Printf("Keyin: 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 serverda pprof ni ishlatish misoli:
import (
_ "net/http/pprof" // pprof handlerlarini ro'yxatga olish uchun import
"net/http"
"log"
)
func main() {
log.Println(http.ListenAndServe(":6060", nil)) // 6060 portida tinglash
}
Bu kodni ishga tushirgandan so'ng, http://localhost:6060/debug/pprof/ manziliga kirib, turli profiling ma'lumotlariga ega bo'lishingiz mumkin. Heap profiling uchun go tool pprof http://localhost:6060/debug/pprof/heap ni ishlatish mumkin.