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:
net/http/pprof'u içe aktarın.- Bir HTTP sunucusu başlatın.
- Profilere erişmek için uygun URL'lere (
/debug/pprof/) gidin. - Toplanan verileri analiz etmek için
go tool pprofaracı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.