Sobes.tech
Middle

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:

  1. net/http/pprof ni import qiling.
  2. HTTP serverini ishga tushiring.
  3. Profilga kirish uchun mos URL'larni (/debug/pprof/) oching.
  4. To'plangan ma'lumotlarni tahlil qilish uchun go tool pprof ni 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.