Sobes.tech
Middle+

Son uğursuzluq haqqında danış — nə baş verdi, necə tapıldı və necə həll olundu?

sobes.tech Süni İntellekt

AI-dan cavab

Go dilindəki son layihələrimizdən birində, çox sayda paralel sorğu işləyən bir xidmətdə yaddaş sızması problemi ilə üzləşdik. Sistem tədricən yavaşladı və nəhayət, yaddaşın tükənməsi xətası ilə çöktü.

Səbəb goroutine-lərin düzgün istifadə edilməməsidir: hər sorğu üçün goroutine işə salırdıq, lakin onların tamamlanmasını nəzarət etmirdik və kontekstlə əlaqəli resursları sərbəst buraxmırdıq.

Problem pprof profilatoru ilə aşkar edildi, bu, goroutine sayının və yaddaş istifadəsinin artmasını göstərdi.

Həll:

  • Goroutine-lər üçün zaman aşımı və ləğv ilə kontekst əlavə etdik.
  • Sorğuların işlənməsini yenidən yazdıq, goroutine-lərin tamamlanmasını təmin etmək üçün.
  • Eyni zamanda işləyən goroutine-lərin maksimum sayını məhdudlaşdırmaq üçün goroutine hovuzu tətbiq etdik.

Goroutine-i ləğv etmək üçün kontekstin istifadəsi nümunəsi:

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // təmizləmə və sonlandırma
        return
    // işləmə
    }
}(ctx)