Meydan okuma 4 - Üretim runtime
- Go kursu
- Uzman
- Ders 34/34
- 8 dk
GOMAXPROCS ve memory limit ayarlı bir servis yazarsın.
Meydan okuma: üretime hazır çalışma zamanı
Bir servisin main fonksiyonunu çalışma zamanı ayarlarıyla birlikte hazırlayacaksın:
- Bellek sınırını konteyner sınırının %90'ına ayarla (
debug.SetMemoryLimit). - GOMAXPROCS'u CPU kotasına göre ayarla.
- Başlangıçta sürümü, GOMAXPROCS'u ve bellek sınırını logla.
SIGTERMgeldiğinde nazikçe kapan.
limit := int64(float64(konteynerBayt) * 0.9)
debug.SetMemoryLimit(limit)Ayarları test edilebilir yap
Ortam okuma ve hesaplamayı saf bir fonksiyona ayırırsan main ince kalır ve mantık test edilebilir olur:
type Ayar struct {
Procs int
MemLimit int64
}
func hesapla(cpuKota float64, bellek int64) Ayar {
p := int(cpuKota)
if p < 1 { p = 1 }
return Ayar{Procs: p, MemLimit: int64(float64(bellek) * 0.9)}
}Uygulama Ayar hesabı
Yukarıdaki Ayar ve hesapla fonksiyonunu yaz. hesapla(0.5, 1000) ve hesapla(4, 1000) sonuçlarını %+v ile ayrı satırlarda yazdır.
Başlangıç kodu
package main
import "fmt"
func main() {
// buraya yaz
}Örnek çözüm
package main
import "fmt"
type Ayar struct {
Procs int
MemLimit int64
}
func hesapla(cpuKota float64, bellek int64) Ayar {
p := int(cpuKota)
if p < 1 {
p = 1
}
return Ayar{Procs: p, MemLimit: int64(float64(bellek) * 0.9)}
}
func main() {
fmt.Printf("%+v\n", hesapla(0.5, 1000))
fmt.Printf("%+v\n", hesapla(4, 1000))
}Beklenen çıktı
{Procs:1 MemLimit:900}
{Procs:4 MemLimit:900}
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Bellek sınırını neden konteyner sınırının tamamına değil %90'ına koyarsın?
- GC daha seyrek çalışsın diye
- Go %100'ü kabul etmediği için
- Performans için fark etmez
- Yığınlar ve Go dışı bellek için pay kalsın, OOM önlensin diye Doğru cevap
Açıklama: GOMEMLIMIT yumuşak bir sınırdır ve cgo, mmap gibi bazı bellekleri tam izleyemez; pay bırakmak çekirdeğin süreci öldürmesini önler.
2 Sınırı uygula
a := hesapla(2, 512<<20)
runtime.GOMAXPROCS(a.Procs)
debug.____(a.MemLimit)
a := hesapla(2, 512<<20)
runtime.GOMAXPROCS(a.Procs)
debug.SetMemoryLimit(a.MemLimit)
Açıklama: SetMemoryLimit hesaplanan yumuşak sınırı çalışma zamanına verir.
3 Ayar ve neden
| Kavram | Anlamı |
|---|---|
GOMAXPROCS = kota |
CPU kısıtlamasını önler |
GOMEMLIMIT = %90 |
OOM'u önler |
Başlangıç logu |
Teşhis kolaylığı |
SIGTERM işleme |
Nazik kapanış |