GOGC ve GOMEMLIMIT
- Go kursu
- Uzman
- Ders 10/34
- 4 dk
GOGC ve GOMEMLIMIT çevre değişkenlerini öğrenirsin.
GOGC ve GOMEMLIMIT
GOGC (varsayılan 100), canlı heap'in yüzde kaç büyümesine izin verildikten sonra GC başlayacağını belirler: canlı heap 100 MB ise sonraki GC ~200 MB'ta başlar. Büyük GOGC daha az GC ama daha çok bellek; küçük GOGC tersini verir.
GOGC=200 ./app # daha seyrek GC
GOGC=off ./app # GC kapalı (dikkat!)
GOMEMLIMIT=1GiB ./app # yumuşak bellek sınırıGOMEMLIMIT (Go 1.19) toplam belleğe yumuşak bir üst sınır koyar; sınıra yaklaşınca GC sıklaşır.
Konteynerde iyi ayar
512 MB sınırlı bir konteynerde yaygın tarif: GOMEMLIMIT'i sınırın ~%90'ına koymak. Böylece Go bellek dolmadan GC'yi sıklaştırır ve OOM ile öldürülmez. Çok yüksek trafikte GOGC=off + GOMEMLIMIT birleşimi GC'yi yalnızca gerektiğinde çalıştırır; ama canlı heap sınırı aşarsa GC sürekli çalışır (death spiral), bu yüzden dikkatle izlenmelidir.
Uygulama GC yüzdesini değiştir
runtime/debug ile eski := debug.SetGCPercent(50) çağır, ardından debug.SetGCPercent(eski) ile geri al ve dönen değeri (50) yazdır. Ayrıca debug.SetMemoryLimit(-1) ile mevcut sınırı oku ve 0'dan büyük olduğunu yazdır.
Başlangıç kodu
package main
import (
"fmt"
"runtime/debug"
)
func main() {
// buraya yaz
}Örnek çözüm
package main
import (
"fmt"
"runtime/debug"
)
func main() {
eski := debug.SetGCPercent(50)
fmt.Println(debug.SetGCPercent(eski))
fmt.Println(debug.SetMemoryLimit(-1) > 0)
}Beklenen çıktı
50 true
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Canlı heap 50 MB ve GOGC=100 ise bir sonraki GC yaklaşık ne zaman başlar?
- Heap ~150 MB olunca
- Her 2 dakikada bir
- Heap ~100 MB olunca Doğru cevap
- Heap ~50 MB olunca
Açıklama: Hedef = canlı heap × (1 + GOGC/100) = 50 × 2 = 100 MB.
2 Koddan ayarla
eski := debug.____(200)
eski := debug.SetGCPercent(200)
Açıklama: runtime/debug.SetGCPercent GOGC değerini çalışma anında değiştirir ve eskisini döndürür.
3 Ayar ve etkisi
| Kavram | Anlamı |
|---|---|
GOGC=50 |
Sık GC, az bellek |
GOGC=400 |
Seyrek GC, çok bellek |
GOGC=off |
GC kapalı |
GOMEMLIMIT |
Yumuşak bellek sınırı |