Sobes.tech
Middle

Go'da bellek kullanımını nasıl ölçebiliriz ve pprof nedir?

sobes.tech yapay zeka

AI'dan gelen yanıt

Go'da bellek kullanımı birkaç şekilde ölçülebilir:

  • runtime.MemStats: Bellek kullanım istatistiklerinin anlık görüntüsünü sağlar, heap boyutu, nesne sayısı, çöp toplamı vb. dahil. Belleğin dağılımı hakkında genel bir görünüm elde etmek için kullanışlıdır.

  • pprof profil oluşturucu: Performans ve kaynak kullanımı, özellikle bellek, dahil olmak üzere, analiz etmek için güçlü bir araçtır. Farklı zamanlarda heap kullanım profilleri toplayabilir ve bunları darboğazları ve bellek sızıntılarını tespit etmek için analiz edebilirsiniz.

  • debug.FreeOSMemory(): Belleği zorla işletim sistemine geri verir. Bu, Go çalışma zamanının ne kadar bellek tuttuğunu dolaylı olarak anlamaya yardımcı olabilir.

pprof (net/http/pprof) Go'nun standart kütüphanesinde bulunan ve runtime/pprof paketinden pprof profilleyicisiyle entegre olan bir pakettir. CPU, heap (bellek), kilitler, goroutine'ler ve mutexler gibi çeşitli kaynakların profillerini toplamak için HTTP arayüzleri sağlar.

Kullanmak için:

  1. net/http/pprof'u içe aktarın.
  2. Bir HTTP sunucusu başlatın.
  3. Profilere erişmek için uygun URL'lere (/debug/pprof/) gidin.
  4. Toplanan verileri analiz etmek için go tool pprof aracını kullanın.

runtime.MemStats kullanımı örneği:

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

func main() {
	var m runtime.MemStats
	runtime.ReadMemStats(&m) // Bellek istatistiklerini oku
	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)

	// Bellek kullanımı örneği
	_ = make([]byte, 1024*1024*10) // 10MB ayır

	time.Sleep(100 * time.Millisecond) // GC'nin çalışmasını sağla

	runtime.ReadMemStats(&m)
	fmt.Printf("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 sunucusunda pprof kullanımı örneği:

import (
	_ "net/http/pprof" // pprof handler'larını kaydetmek için içe aktar
	"net/http"
	"log"
)

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

Bu kod çalıştırıldıktan sonra, http://localhost:6060/debug/pprof/ adresine giderek çeşitli profillere erişebilirsiniz. Heap analizi için go tool pprof http://localhost:6060/debug/pprof/heap kullanılabilir.