Sobes.tech
Middle+

Pověz mi o posledním failu — co se stalo, jak ho našli a jak ho řešili?

sobes.tech AI

Odpověď od AI

V jednom z našich posledních projektů v Go jsme narazili na problém úniku paměti v službě, která zpracovávala velké množství paralelních požadavků. Systém se začal postupně zpomalovat a nakonec selhal s chybou out-of-memory.

Příčinou bylo nesprávné používání gorutin: spouštěli jsme gorutinu pro každý požadavek, ale nekontrolovali jejich ukončení a neuvolňovali zdroje spojené s kontextem.

Problém byl odhalen pomocí profileru pprof, který ukázal nárůst počtu gorutin a spotřeby paměti.

Řešení:

  • Přidali jsme kontext s časovým limitem a zrušením pro gorutiny.
  • Přepsali jsme zpracování požadavků tak, aby bylo zajištěno ukončení gorutin.
  • Zavedli jsme pool gorutin pro omezení maximálního počtu současně běžících gorutin.

Příklad použití kontextu k zrušení gorutiny:

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // čištění a ukončení
        return
    // zpracování
    }
}(ctx)