Özet - Runtime
- Go kursu
- Uzman
- Ders 24/34
- 4 dk
GOMAXPROCS, Gosched ve Stack'i birleştirerek bir izleyici yazarsın.
Runtime özeti
Bu grupta çalışma zamanıyla konuşmayı öğrendin: NumCPU, NumGoroutine, runtime/metrics ile gözlem; GOMAXPROCS ile paralellik ayarı; Gosched ile yol verme; Stack ve Caller ile teşhis; Goexit ile goroutine sonlandırma.
GOTRACEBACK=all ./app // çökmede tüm goroutine'ler
GODEBUG=gctrace=1,schedtrace=1000 ./appdebug.SetTraceback ve sınırlar
runtime/debug paketi ek düğmeler sunar: SetTraceback("all") çökme çıktısını genişletir, SetMaxStack tek goroutine'in yığın sınırını (varsayılan 1 GB, 64 bit) ayarlar, SetMaxThreads M sınırını (10.000) değiştirir, FreeOSMemory boş belleği işletim sistemine iade etmeye zorlar.
Uygulama Sızıntı dedektörü
once := runtime.NumGoroutine() al. 5 goroutine başlat; hepsi bir dur kanalını beklesin. close(dur) çağır, time.Sleep(20 * time.Millisecond) bekle ve sayının eski değere döndüğünü (runtime.NumGoroutine() == once) yazdır.
Başlangıç kodu
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"runtime"
"time"
)
func main() {
once := runtime.NumGoroutine()
dur := make(chan struct{})
for i := 0; i < 5; i++ {
go func() { <-dur }()
}
close(dur)
time.Sleep(20 * time.Millisecond)
fmt.Println(runtime.NumGoroutine() == once)
}Beklenen çıktı
true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bir serviste goroutine sızıntısından şüpheleniyorsan önce ne izlersin?
- Zamanla goroutine sayısının artışını Doğru cevap
- NumCPU değerini
- GOOS değerini
- Derleme süresini
Açıklama: Sürekli artan NumGoroutine (ya da /sched/goroutines metriği) sızıntı işaretidir; goroutine profili nerede takıldıklarını gösterir.
2 Çökme ayrıntısı
____=all ./app
GOTRACEBACK=all ./app
Açıklama: GOTRACEBACK=all panic'te yalnızca çöken değil tüm goroutine'lerin yığınını yazdırır.
3 Grubun özeti
| Kavram | Anlamı |
|---|---|
NumGoroutine |
Sızıntı izleme |
GOMAXPROCS |
Paralellik |
runtime.Caller |
Satır bilgisi |
Goexit |
Defer'li çıkış |