Middle+
Ispričaj mi o poslednjem failu — šta se desilo, kako su ga pronašli i kako su ga rešili?
sobes.tech АИ
Одговор од АИ
U jednom od naših poslednjih projekata u Go, suočili smo se sa problemom curenja memorije u servisu koji je obrađivao veliki broj paralelnih zahteva. Sistem je postepeno usporavao i na kraju je pao sa greškom out-of-memory.
Uzrok je bio netačan način korišćenja gorutina: pokretali smo gorutinu za svaki zahtev, ali nismo kontrolisali njihovo završavanje niti oslobađali resurse povezane sa kontekstom.
Problem je otkriven pomoću profilera pprof, koji je pokazao rast broja gorutina i potrošnje memorije.
Rešenje:
- Dodali smo kontekst sa timeout-om i otkazivanjem za gorutine.
- Prepisali smo obradu zahteva da bismo garantovali završavanje gorutina.
- Uveli smo pool gorutina za ograničenje maksimalnog broja istovremeno aktivnih gorutina.
Primer korišćenja konteksta za otkazivanje gorutine:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// čišćenje i završetak
return
// obrada
}
}(ctx)