Sobes.tech
Middle

Go-da yaddaş istifadəsini necə ölçmək və pprof nədir?

sobes.tech Süni İntellekt

AI-dan cavab

Go-da yaddaş istifadəsini müxtəlif üsullarla ölçmək mümkündür:

  • runtime.MemStats: Yaddaş statistikalarının anlıq görüntüsünü təmin edir, o cümlədən yığma ölçüsü, obyektlərin sayı, tullantıların toplanması və s. Ümumi yaddaş bölgüsü haqqında ümumi məlumat almaq üçün faydalıdır.

  • pprof profilatoru: Performans və resurs istifadəsini, o cümlədən yaddaşı analiz etmək üçün güclü vasitədir. O, müxtəlif vaxtlarda yığma istifadəsi profillərini toplaya və onları analiz edə bilər, bu da dar boğazları və yaddaş sızmalarını müəyyən etməyə kömək edir.

  • debug.FreeOSMemory(): Əməliyyat sisteminə yaddaşı məcburən azad edir. Bu, Go çalışma vaxtının nə qədər yaddaş saxladığını dolayısı ilə anlamağa kömək edə bilər.

pprof (net/http/pprof) Go-nun standart kitabxanasında olan və runtime/pprof paketindən pprof profilatoru ilə inteqrasiya olunan bir paketdir. CPU, yığma (yaddaş), kilidlər, goroutine və mutexlər kimi müxtəlif resursların profillərini toplamaq üçün HTTP interfeyslər təqdim edir.

İstifadə üçün:

  1. net/http/pprof-u idxal edin.
  2. HTTP serverini başladın.
  3. Profil üçün uyğun URL-lərə (/debug/pprof/) daxil olun.
  4. Toplanmış məlumatları analiz etmək üçün go tool pprof alətindən istifadə edin.

runtime.MemStats-ın istifadəsinə nümunə:

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

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Yaddaş statistikalarını oxuyur
	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)

	// Yaddaş ilə işləmək nümunəsi
	_ = make([]byte, 1024*1024*10) // 10MB ayırır

	time.Sleep(100 * time.Millisecond) // GC-nin işləməsini gözləyir

	runtime.ReadMemStats(&m)
	fmt.Printf("Daha sonra: 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 serverdə pprof istifadə nümunəsi:

import (
	_ "net/http/pprof" // pprof handlerlərini qeydiyyatdan keçirmək üçün
	"net/http"
	"log"
)

func main() {
	log.Println(http.ListenAndServe(":6060", nil)) // 6060 portunda dinləyir
}

Bu kodu işə saldıqdan sonra, http://localhost:6060/debug/pprof/ ünvanına daxil olaraq müxtəlif profillərə baxa bilərsiniz. Yığımın analizi üçün go tool pprof http://localhost:6060/debug/pprof/heap istifadə edilə bilər.