CodeBlanks Logo Icon CodeBlanks

Meydan okuma 4 - Üretim runtime

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.
  • SIGTERM geldiğ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

main.go
package main

import "fmt"

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
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

Soru
a := hesapla(2, 512<<20)
runtime.GOMAXPROCS(a.Procs)
debug.____(a.MemLimit)
Cevap
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ış

Uzman bölümündeki tüm dersler