Sobes.tech
Middle+

Պատմիր վերջին ձախողության մասին — ինչ տեղի ունեցավ, ինչպես գտան և ինչպես լուծեցին?

sobes.tech AI

Պատասխան AI-ից

Go ծրագրի վերջին նախագծերից մեկում մենք բախվեցինք հիշողության լքման խնդրի, որը տեղի էր ունենում ծառայությունում, որը մշակել էր մեծ քանակությամբ սինխրոն հարցումներ։ Սիստեմը աստիճանաբար դանդաղում էր և վերջում փլուզվում էր հիշողության բացակայության սխալի պատճառով։

Պատճառը սխալ օգտագործումն էր goroutines-ների։ Մենք սկսում էինք goroutine յուրաքանչյուր հարցման համար, բայց չէինք վերահսկում դրանց ավարտը և չազատագրում էինք կոնտեքստի հետ կապված ռեսուրսները։

Խնդիրը հայտնաբերվեց pprof պրոֆայլերով, որոնք ցույց տվեցին goroutine-ների քանակի և հիշողության սպառման աճը։

Որոշում՝

  • Ավելացրինք կոնտեքստ ժամանակային սահմանափակմամբ և չեղարկմամբ goroutines-ների համար։
  • Մշակեցինք հարցումների մշակումը, որպեսզի ապահովենք goroutine-ների ավարտը։
  • Հետագա սահմանափակման համար ներդրեցինք goroutine-ների պուլ։

Օրինակ՝ կոնտեքստի օգտագործում goroutine-ների չեղարկման համար՝

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // մաքառում և ավարտ
        return
    // մշակում
    }
}(ctx)