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)