Middle+
Son hatayı anlat — ne oldu, nasıl buldunuz ve nasıl çözdünüz?
sobes.tech yapay zeka
AI'dan gelen yanıt
Go dilinde son projelerimizden birinde, çok sayıda paralel isteği işleyen bir hizmette bellek sızıntısı sorunu yaşadık. Sistem yavaş yavaş yavaşlamaya başladı ve sonunda out-of-memory hatasıyla çöktü.
Sorun, goroutine'lerin yanlış kullanımıydı: her istek için bir goroutine başlatıyorduk, ancak bunların tamamlanmasını kontrol etmiyor ve bağlamla ilişkili kaynakları serbest bırakmıyorduk.
Sorun, pprof profil oluşturucu kullanılarak tespit edildi; bu, goroutine sayısında ve bellek kullanımında artış gösterdi.
Çözüm:
- Goroutine'ler için zaman aşımı ve iptal içeren bir bağlam ekledik.
- İstek işleme kodunu, goroutine'lerin tamamlanmasını garanti edecek şekilde yeniden yazdık.
- Aynı anda çalışan maksimum goroutine sayısını sınırlamak için bir goroutine havuzu uyguladık.
Bir goroutine'yi iptal etmek için bağlam kullanım örneği:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// temizlik ve sonlandırma
return
// işlem
}
}(ctx)