8,8 Gbps videoliikenteen saavuttaminen yhdellä CPU-ytimellä Go-kielellä
Microsoft
Kehittäjä Habr-sivustolta kuvailee oman RTSP-HLS-suoratoistomoottorin rakentamista Go-kielellä, nimeltään Ruseon Core, Thundering Herd -ongelman käsittelemiseksi. Moottori käyttää zero-copy-rengaspuskuria sync.Poolin kanssa välttääkseen allokoinnit, saavuttaen 8,8 Gbps:n läpimenon yhdellä ytimellä minimaalisella muistin ja suorittimen käytöllä, toisin kuin FFmpeg tai MediaMTX.
Kun jaettu linkki aiheutti valtavan palvelinpiikin ja palvelimen muistin loppumisen, kirjoittaja päätti rakentaa oman suoratoistomoottorin Go-kielellä sen sijaan, että olisi vuokrannut tehokkaampaa laitteistoa. Moottori, nimeltään Ruseon Core, ottaa vastaan RTSP-suoratoistoja ja tuottaa HLS-muotoa ilman transkoodausta, välittäen vain tavuja. Keskeinen ominaisuus on zero-copy-rengaspuskuri, jossa käytetään sync.Poolia: kehykset kirjoitetaan kerran poolista otettuun puskuriin ja jaetaan kaikkien tilaajien kesken, mikä eliminoi allokaatiot ja GC-kuormituksen. Benchmark osoittaa 13,9 ns/op ja 0 B/op. Kuormitustestissä k6:lla (1000 käyttäjää) Ryzen 5600x -prosessorilla saavutettiin 8,8 Gbps (81 Gt 70 sekunnissa) 60 000 onnistuneella HTTP-vastauksella ja ilman virheitä. Tilaajien suojaamiseen käytetään estottomia kanavien lähetyksiä, joissa hitaiden asiakkaiden kehykset pudotetaan, sekä NeedsIFrame-lippua, joka synkronoi uudelleen seuraavaan avainkehykseen. Muistissa pidetään liukuvaa ikkunaa, jossa on 5 HLS-segmenttiä; vanhentuneet segmentit palauttavat 404-vastauksen, mikä saa soittimet, kuten hls.js:n, hyppäämään live-reunaan. Järjestelmä käyttää 250 Mt RAM-muistia 100 suoratoistolle, mutta käyttöjärjestelmän socket-puskurit lisäävät kuormitusta. Kirjoittaja varoittaa sync.Poolin sudenkuopista ja ehdottaa, että ilman transkoodausta työskennellessä FFmpegin välttäminen ja muistin hallinta zero-copy-tekniikalla on hyödyllistä.
Lähde: Habr — хаб ИИ —
Alkuperäinen
