Middle+
Povedz mi o poslednom faili — čo sa stalo, ako ho našli a ako ho vyriešili?
sobes.tech AI
Odpoveď od AI
V jednom z našich posledných projektov v Go sme narazili na problém úniku pamäte v službe, ktorá spracovávala veľké množstvo paralelných požiadaviek. Systém začal postupne spomaľovať a nakoniec zlyhal s chybou out-of-memory.
Príčinou bolo nesprávne používanie gorútin: spúšťali sme gorutinu pre každú požiadavku, ale nekontrolovali ich ukončenie ani neuvoľňovali zdroje spojené s kontextom.
Problém bol odhalený pomocou profileru pprof, ktorý ukázal nárast počtu gorútin a spotreby pamäte.
Riešenie:
- Pridali sme kontext s timeoutom a zrušením pre gorutiny.
- Prepisali sme spracovanie požiadaviek, aby sme zabezpečili ukončenie gorútin.
- Zaviedli sme pool gorútin na obmedzenie maximálneho počtu súčasne bežiacich gorútin.
Príklad použitia kontextu na zrušenie gorutiny:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// čistenie a ukončenie
return
// spracovanie
}
}(ctx)