Sobes.tech
Middle+

Mesélj a legutóbbi hibáról — mi történt, hogyan találták meg és hogyan oldották meg?

sobes.tech MI

Válasz az MI-től

A legutóbbi Go-projektjeink egyikében memória szivárgási problémával szembesültünk egy olyan szolgáltatásban, amely nagy számú párhuzamos kérést kezelt. A rendszer fokozatosan lassult, végül memóriahiányos hibával omlott össze.

Az ok a goroutine-ok helytelen használata volt: minden kéréshez egy goroutine-t indítottunk, de nem ellenőriztük azok befejezését, és nem szabadítottuk fel a kontextussal kapcsolatos erőforrásokat.

A problémát a pprof profilozó segítségével fedeztük fel, amely a goroutine-ok számának és a memóriahasználat növekedését mutatta.

Megoldás:

  • Hozzáadtunk egy kontextust időkorláttal és leállítással a goroutine-okhoz.
  • Átírtuk a kéréskezelést, hogy garantáljuk a goroutine-ok befejezését.
  • Bevezettünk egy goroutine-poolt, hogy korlátozzuk az egyszerre futó goroutine-ok maximális számát.

Példa a kontextus használatára egy goroutine leállításához:

ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
go func(ctx context.Context) {
    select {
    case <-ctx.Done():
        // takarítás és befejezés
        return
    // feldolgozás
    }
}(ctx)