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)