Sobes.tech
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)