2026'da Go Profilleme ve Benchmarking: pprof, trace ve Mülakat Soruları
pprof ve runtime/trace ile Go profilleme rehberi. CPU, bellek ve goroutine profilleri ile Go performans mülakat soruları hakkinda kapsamli bir kilavuz.

pprof ve runtime/trace paketi ile Go profilleme, tahminleri verilere dönüştürür. Performans soruları çoğu Go mülakatında karşımıza çıkar ve flame graph okuyabilen veya -inuse_space ile -allocs arasındaki farkı açıklayabilen adaylar öne çıkar. Bu araçlar standart kütüphane ile birlikte gelir, harici bağımlılık gerektirmez ve doğrudan benchmarklar ile entegre olur.
Go 1.24+ yedi yerleşik profil sunar: CPU, heap, allocs, goroutine, threadcreate, block ve mutex. Go 1.26, erişilemeyen bloklanmış goroutine'leri tespit eden deneysel bir goroutine leak profili ekledi.
pprof ile CPU Profilleme: Başlangıç Noktası
CPU profilleme, çağrı yığınını düzenli aralıklarla (varsayılan 100 Hz) örnekler ve hangi fonksiyonların işlemci zamanı tükettiğini kaydeder. runtime/pprof paketi düşük seviyeli veri toplamayı yönetirken, go tool pprof sonuçları analiz eder. 30 saniyelik bir profil 3000 örnek yakalar, bu da çoğu uygulama için istatistiksel anlamlılık açısından yeterlidir.
Bağımsız bir program, başlangıçta pprof.StartCPUProfile çağrısı yaparak profillemeyi etkinleştirir. Profil, go tool pprof'un daha sonra okuyacağı bir dosyaya yazılır:
package main
import (
"flag"
"log"
"os"
"runtime/pprof"
)
var cpuprofile = flag.String("cpuprofile", "", "write cpu profile to file")
func main() {
flag.Parse()
if *cpuprofile != "" {
f, err := os.Create(*cpuprofile)
if err != nil {
log.Fatal(err)
}
defer f.Close()
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
}
// Uygulama mantığı burada
}HTTP sunucuları için net/http/pprof'u yan etki olarak import etmek yeterlidir. Paket /debug/pprof/ altında handler'ları otomatik olarak kaydeder. Import dışında kod değişikliği gerekmez:
package main
import (
"net/http"
_ "net/http/pprof" // /debug/pprof/* handler'larını kaydeder
)
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}Çalışan bir sunucudan 30 saniyelik CPU profili almak için go tool pprof http://localhost:8080/debug/pprof/profile?seconds=30 komutu kullanılır. Araç profili indirir ve interaktif bir kabuk açar. seconds parametresi veri toplama süresini kontrol eder.
Profil Analizi: top, list ve Flame Graphlar
pprof kabuğu darboğazları tespit etmek için komutlar sağlar. top en fazla CPU zamanı tüketen fonksiyonları flat zamana göre sıralı olarak gösterir. list komutu her satır için zaman açıklamalarıyla kaynak kodunu gösterir ve yürütmeye hakim satırları tam olarak belirler.
# go tool pprof ile terminal oturumu
$ go tool pprof cpu.prof
(pprof) top 10
Showing nodes accounting for 4.2s, 85% of 4.9s total
flat flat% sum% cum cum%
1.8s 36.73% 36.73% 1.8s 36.73% runtime.memmove
0.9s 18.37% 55.10% 0.9s 18.37% encoding/json.(*decodeState).scanWhile
0.5s 10.20% 65.30% 2.3s 46.94% main.processRecords
...
(pprof) list processRecords
Total: 4.9s
0.5s 2.3s (flat, cum) 46.94% of Total
20: for _, r := range records {
21: 0.3s 0.3s data := json.Marshal(r)
22: 0.2s 2.0s result := transform(data)
...Web arayüzü görsel analiz ekler. go tool pprof -http=:6060 cpu.prof komutu flame graphlar, yönlendirilmiş graflar ve kaynak görünümleri ile bir tarayıcı açar. Go 1.26'dan itibaren flame graphlar web arayüzünde varsayılan görünüm olarak gelir. Flame graphlar çağrı hiyerarşisini yatay olarak gösterir, daha geniş çubuklar o fonksiyonda ve çağırdığı fonksiyonlarda daha fazla zaman harcandığını gösterir.
Flame graphta X ekseni örnek popülasyonunu temsil eder, zamanı değil. Her kutu bir fonksiyondur ve genişliği o fonksiyonun örneklerde ne sıklıkla göründüğünü gösterir. Üst fonksiyonlar alt fonksiyonların altında yer alır. Üstteki geniş platoları arayın: bu fonksiyonlar gerçek işi yapar.
Bellek Profilleme: Heap vs Allocs
Bellek profilleme iki farklı soruyu yanıtlar. heap profili (-inuse_space) yakalama anında belleği neyin tuttuğunu gösterir. allocs profili, o bellek serbest bırakılmış olsa bile, zaman içinde tahsislerin nerede gerçekleştiğini gösterir.
Mevcut bellek kullanımını azaltmak için heap profilini inceleyin. Tahsis oranını ve GC yükünü azaltmak için allocs profilini inceleyin. Yüksek tahsis oranları sık garbage collection tetikler, bu da goroutine'leri duraklatır ve CPU kullanımını artırır.
# Çalışan sunucudan heap profili alma
$ curl -o heap.prof http://localhost:8080/debug/pprof/heap
$ go tool pprof -inuse_space heap.prof
# Allocs profili alma (30s boyunca tahsis sayısı)
$ curl -o allocs.prof "http://localhost:8080/debug/pprof/allocs?seconds=30"
$ go tool pprof -alloc_objects allocs.prof-inuse_objects bayrağı bayt yerine canlı nesneleri sayar, bu bellek parçalanmasını tespit etmek için kullanışlıdır. -alloc_space bayrağı profil periyodu boyunca toplam tahsis edilen baytları gösterir ve hızlıca serbest bıraksalar bile belleği yoğun kullanan fonksiyonları ortaya çıkarır.
Yaygın tahsis noktaları döngülerde string birleştirmeyi (strings.Builder kullanılmalı), heap'e kaçan arayüz dönüşümlerini ve ön tahsis olmadan slice büyümesini içerir. Go derleyici dokümantasyonu kaçış analizini detaylı açıklar.
testing.B ile Benchmark Profilleme
testing paketi profillemeyi doğrudan benchmarklarla entegre eder. Bu kombinasyon, tam uygulamanın gürültüsü olmadan belirli kod yollarını izole eder. Benchmark profilleme şu soruyu yanıtlar: "Bu fonksiyon izolasyonda nasıl performans gösteriyor?"
package parser
import "testing"
func BenchmarkParseJSON(b *testing.B) {
data := []byte(`{"id":1,"name":"test","values":[1,2,3]}`)
b.ReportAllocs() // Tahsis istatistiklerini dahil et
b.ResetTimer() // Kurulumu zamanlama dışında tut
for i := 0; i < b.N; i++ {
_, _ = Parse(data)
}
}Benchmark yürütme sırasında profil oluşturmak bayraklarla yapılır. -cpuprofile ve -memprofile bayrakları profilleri daha sonra analiz için dosyalara yazar:
# Benchmark sırasında CPU profili
$ go test -bench=BenchmarkParseJSON -cpuprofile=cpu.prof -benchtime=5s
# Benchmark sırasında bellek profili
$ go test -bench=BenchmarkParseJSON -memprofile=mem.prof -benchtime=5s
# Sonucu analiz et
$ go tool pprof -http=:6060 cpu.prof-benchtime bayrağı benchmarkın ne kadar süre çalışacağını kontrol eder. Daha uzun çalışmalar daha doğru profiller üretir ama daha fazla zaman alır. 5 saniyelik bir çalışma genellikle kararlı sonuçlar sağlar. Mikro-benchmarklar için varyansı kontrol etmek üzere -count=10 kullanılır.
Go mülakatlarında başarılı olmaya hazır mısın?
İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.
runtime/trace ile Yürütme İzleme
pprof zamanın nerede harcandığını gösterirken, runtime/trace olayların ne zaman gerçekleştiğini gösterir. Trace, goroutine zamanlamasını, sistem çağrılarını, GC olaylarını ve ağ aktivitesini bir zaman çizelgesinde yakalar. Eşzamanlılık davranışına bu görünürlük, istatistiksel profillemeyi tamamlar.
package main
import (
"os"
"runtime/trace"
)
func main() {
f, _ := os.Create("trace.out")
defer f.Close()
trace.Start(f)
defer trace.Stop()
// Uygulama mantığı
runConcurrentTasks()
}Trace görüntüleyici goroutine yaşam sürelerini, bloklama olaylarını ve işlemci kullanımını gösterir. Her goroutine yatay bir çubuk olarak görünür, renkler çalışıp çalışmadığını, bloklanıp bloklanmadığını veya zamanlamayı bekleyip beklemediğini gösterir:
$ go tool trace trace.out
# http://127.0.0.1:port adresinde tarayıcı açarHTTP sunucuları için /debug/pprof/trace?seconds=5 adresinden trace alınabilir. Trace görüntüleyici hangi goroutine'lerin neyde bloklandığını gösterir ve CPU profillerinin yakalayamadığı çekişme kalıplarını ortaya çıkarır. "Goroutine analysis" görünümü goroutine'leri oluşturma yerine göre gruplar ve sızıntıları veya beklenmeyen dallanmayı tespit etmeye yardımcı olur.
Trace'ler profillerden daha ağırdır. Meşgul bir sunucunun 5 saniyelik trace'i yüzlerce megabayt veri üretebilir. Kısa süreler ve hedefli toplama kullanılmalıdır.
Çekişme için Block ve Mutex Profilleme
Block profilleme, senkronizasyon primitiflerinde bekleyen goroutine'leri kaydeder: kanallar, mutex'ler ve koşul değişkenleri. Mutex profilleme özellikle mutex çekişmesine odaklanır. Bu profiller CPU profillemesine görünmez eşzamanlılık darboğazlarını ortaya çıkarır.
Bu profilleri etkinleştirmek için çekişme gerçekleşmeden önce runtime parametrelerini ayarlamak gerekir:
// Block profillemesini etkinleştir (1 = tüm bloklama olaylarını örnekle)
runtime.SetBlockProfileRate(1)
// Mutex profillemesini etkinleştir (1 = tüm mutex çekişmesini örnekle)
runtime.SetMutexProfileFraction(1)Üretim ortamında yükü azaltmak için daha yüksek değerler ayarlanmalıdır. 1000000 (bir mikrosaniye) block profil oranı veya 100 mutex fraksiyonu minimum etki ile kullanışlı veri sağlar. Bu değerleri çok düşük ayarlamak her olayı yakalar ve uygulamayı yavaşlatabilir.
Bu profilleri standart endpoint'lerden alma:
$ curl -o block.prof http://localhost:8080/debug/pprof/block
$ curl -o mutex.prof http://localhost:8080/debug/pprof/mutex
$ go tool pprof block.profBlock profilleri bloklama olaylarının sayısını değil, toplam bekleme süresini gösterir. Bir kez 1 saniye bloklanan fonksiyon, 1000 kez 1 milisaniye bloklanana benzer görünür. Bu durumları ayırt etmek için yürütme izleme kullanılmalıdır.
Yaygın Profilleme Tuzakları
Profilleme sonuçları çarpıtabilecek ek yük getirir. CPU profilleme yaklaşık %5 ek yük ekler. Bellek profilleme tahsisleri örnekler (varsayılan olarak 512KB başına 1), bu nedenle küçük tahsisler görünmeyebilir. İzleme her olayı yakalar ve %10-30 ek yük ekleyebilir.
Birkaç hata yanıltıcı profillere yol açar:
Optimize edilmiş build'leri farklı profilleme. Her zaman üretimde kullanılan aynı build bayraklarıyla profil alın. Debug build'ler inlining ve optimizasyonları devre dışı bırakır, bu da sıcak noktaların farklı yerlerde görünmesine neden olur.
Yapay yük altında profilleme. Boş bir sunucunun profili boş döngüyü gösterir, gerçek darboğazları değil. Gerçekçi trafik kalıpları altında profil alın.
GC ek yükünü görmezden gelme. CPU profilleri garbage collection'da harcanan zamanı içerir. Yüksek runtime.gc* varlığı bellek tahsis sorunlarını gösterir, CPU sorunlarını değil. Bunları bellek profillemeyle ele alın.
Kısa profilleme süreleri. 1 saniyelik profil sadece 100 örnek yakalar. İstatistiksel gürültü baskın olur. Kararlı yük altında en az 30 saniye profil alın.
Profilleme Hakkında Go Mülakat Soruları
Performans soruları adayın gerçek sorunları teşhis edip edemeyeceğini test eder. Mülakatçılar araçlara aşinalık ve her profilin neyi ortaya çıkardığını anlama ararlar.
S: Heap profilleme ne zaman allocs profillemeden farklı sonuçlar gösterir?
Heap yakalama anında tutulan belleği gösterir. Allocs, serbest bırakılan bellek dahil tüm tahsisleri gösterir. Bir döngüde geçici tamponlar tahsis eden fonksiyon allocs'ta görünür ama anlık görüntüden önce tamponlar toplanmışsa heap'te görünmez. GC yükünü azaltmak için allocs, sızıntıları bulmak için heap kullanın.
S: Bir goroutine takılmış görünüyor. Hangi profil yardımcı olur?
Goroutine profili tüm goroutine'lerin yığın izlerini gösterir. Block profili goroutine'lerin nerede beklediğini gösterir. Go 1.26+ için deneysel goroutine leak profili kanallarda veya mutex'lerde bloklanmış erişilemeyen goroutine'leri tespit eder. Yürütme izleme bloklama olaylarının zaman çizelgesini gösterir.
S: pprof'ta flat yüzde ile cumulative yüzde ne anlama gelir?
Flat fonksiyonun kendisindeki zamanı ölçer. Cumulative çağırdığı fonksiyonlardaki zamanı dahil eder. Yüksek cumulative ama düşük flat'e sahip fonksiyon işi delege eden bir koordinatördür. Yüksek flat'e sahip fonksiyon gerçek hesaplamayı yapar. Önce yüksek flat'e sahip fonksiyonları optimize edin.
S: Test kurulumunu profillemedan benchmark nasıl profillenir?
Kurulum tamamlandıktan sonra b.ResetTimer() çağrısı yapın. İterasyon başına kurulumu olan benchmarklar için kurulum kodu etrafında b.StopTimer() ve b.StartTimer() kullanın. Zamanlayıcı çağrıları nanosaniye ek yüke sahiptir, bu nedenle sıkı döngülerde kaçının.
S: Bir fonksiyon yavaş olmasına rağmen neden CPU profilinde görünmeyebilir?
CPU profilleme yalnızca aktif olarak CPU kullanan fonksiyonları yakalar. I/O bağlı fonksiyonlar (ağ, disk veya kanallarda bekleyen) CPU profillerinde değil, block profillerinde veya trace'lerde görünür. Örnekleme toplam 10ms'den az çalışan fonksiyonları da kaçırabilir.
S: Go 1.24 Swiss Tables map implementasyonu profillemeyi nasıl etkiler?
Go 1.24, bucket tabanlı map'i Swiss Tables ile değiştirdi ve map yoğun iş yükleri için CPU ek yükünü %2-3 azalttı. Yükseltmeden önce ve sonra alınan profiller farklı map ile ilgili çağrı yığınları gösterir. GOEXPERIMENT=noswissmap bayrağı karşılaştırma için eski implementasyona geri döner.
Üretimde Sürekli Profilleme
Anlık profiller geçici sorunları kaçırır. Pyroscope veya Parca gibi sürekli profilleme araçları düşük ek yükle sürekli örnek toplar ve dağıtımlar arasında karşılaştırma sağlar. Bu araçlar profilleri metrikler ve trace'lerle ilişkilendirir.
Go'nun yerleşik profilleri pprof formatı aracılığıyla bu araçlarla çalışır. pprof.me servisi 2026'da karşılaştırma özellikleri ekledi ve kod değişikliklerinden önce ve sonra optimizasyon etkisini ölçmek için profillerin yüklenmesini ve karşılaştırılmasını sağlıyor.
Go mülakat hazırlığı için hem araçları hem de temel kavramları anlamak önemlidir. Context paketi ve eşzamanlılık kalıpları sıklıkla profilleme sorularıyla birlikte karşımıza çıkar. Performans optimizasyonu genellikle profilleme verilerini Go runtime davranışı bilgisiyle birleştirmeyi gerektirir.
Go Profilleme Uygulama Davranışı Hakkında Ne Ortaya Koyar
- CPU profilleri sıcak fonksiyonları tespit eder ama I/O bağlı işi kaçırır. Tam resim için trace ile birleştirin.
- Bellek profilleri tutma sorunlarını (heap) tahsis kaymasından (allocs) ayırır. Sızıntılar için
-inuse_space, GC yükü için-alloc_spacekullanın. - Block ve mutex profilleri CPU profillerinin göremediği çekişmeyi ortaya çıkarır. Yük altında gecikme arttığında bunları etkinleştirin.
- Benchmark profilleme belirli kod yollarını izole eder. Doğru ölçümler için her zaman
b.ReportAllocs()veb.ResetTimer()çağrısı yapın. - Trace görüntüleyici goroutine zamanlamasını ve bloklama olaylarını zaman çizelgesinde gösterir, eşzamanlılık hatalarını teşhis etmek için gereklidir.
- Go 1.24 runtime iyileştirmeleri Swiss Tables map'ler ve yeni mutex implementasyonu sayesinde CPU ek yükünü %2-3 azalttı.
/debug/pprof/endpoint'leri ile üretim profilleme kimlik doğrulama gerektirir. Bu endpoint'leri asla halka açık bırakmayın: dahili uygulama durumunu sızdırırlar ve pahalı profil toplama yoluyla hizmet reddi saldırılarına olanak tanıyabilirler.
Pratik yapmaya başla!
Mülakat simülatörleri ve teknik testlerle bilgini test et.
Go kodundaki hatayı bulabilir misin?
Gerçek bir kod parçası, gizli bir hata, günde bir deneme. Denemek için hesap gerekmez.

Yazan:
Anthony Fillion-MailletSharpSkill kurucusu
10 yılı aşkın süredir fullstack geliştirici. SharpSkill’i yönetiyor ve burada yayımlanan her şeyden sorumlu.
19 Eylül 2026 tarihinde güncellendi
Paylaş
İlgili makaleler

2026'da İleri Seviye Go Arayüzleri: Kompozisyon, Tip Doğrulamaları ve Mülakat Soruları
Go arayüz kompozisyonu, tip doğrulamaları ve Go 1.26 öz-referanslı jeneriklerde ustalaşın. Pratik örnekler ve teknik mülakat soruları içerir.

2026'da Go Context Paketi: İptal, Timeout ve Mülakat Soruları
Go context paketi hakkında kapsamlı rehber - Context arayüzünden WithCancel ve WithTimeout'a, ileri düzey kalıplara ve mülakat sorularına kadar her şey.

2026'da Go ile Test: Birim Testleri, Mock'lar ve Teknik Mülakat Soruları
Standart kütüphane, tablo güdümlü testler, mock'lar ve mülakatçıların beklediği kalıplarla Go testlerinde ustalaşın. testify, gomock ve testing paketi ile pratik örnekler.