Middle+
Papaskink apie paskutinį failą — kas įvyko, kaip radote ir kaip sprendėte?
sobes.tech AI
Atsakymas iš AI
Viename iš mūsų paskutinių projektų Go kalba susidūrėme su atminties nutekėjimo problema paslaugos, kuri apdorodavo didelį kiekį paralelinių užklausų. Sistema pradėjo lėtėti ir galų gale žlugo dėl trūkstamos atminties klaidos.
Priežastis buvo netinkamas gorutinių naudojimas: kiekvienai užklausai mes paleisdavome gorutinas, bet nesuvaldėme jų užbaigimo ir nesuteikėme išteklių, susijusių su kontekstu.
Problema buvo nustatyta naudojant pprof profilį, kuris parodė gorutinių skaičiaus ir atminties suvartojimo augimą.
Sprendimas:
- Pridėjome kontekstą su laiko limitu ir atšaukimu gorutinoms.
- Perrašėme užklausų apdorojimą, kad užtikrintume gorutinių užbaigimą.
- Įdiegėme gorutinių baseiną, kad apribotume vienu metu veikiančių gorutinių skaičių.
Pavyzdys, kaip naudoti kontekstą gorutinos atšaukimui:
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
select {
case <-ctx.Done():
// valymas ir užbaigimas
return
// apdorojimas
}
}(ctx)