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