Go ile Tek Bir CPU Çekirdeğinde 8.8 Gbps Video Trafiği Elde Etmek
Microsoft
Habr'dan bir geliştirici, Thundering Herd sorununu ele almak için Ruseon Core adlı özel bir RTSP'den HLS'ye akış motorunu Go'da oluşturmayı anlatıyor. Motor, sıfır kopyalı halka tampon ve sync.Pool kullanarak bellek ayırmalarını önlüyor; FFmpeg veya MediaMTX'ten farklı olarak tek bir çekirdekte 8.8 Gbps verim elde ediyor ve minimum bellek ile CPU kullanımı sağlıyor.
Paylaşılan bir bağlantı, bir grup sunucunun aşırı yüklenmesine ve sunucu belleğinin tükenmesine neden olduktan sonra, yazar daha güçlü donanım kiralamak yerine Go dilinde özel bir akış motoru oluşturmaya karar verdi. Ruseon Core adı verilen motor, RTSP akışlarını alır ve dönüştürme yapmadan, yalnızca baytları aktararak HLS çıktısı verir. Temel özellik, sync.Pool ile sıfır kopyalı bir halka tamponudur: kareler havuza bir kez yazılır ve tüm abonelerle paylaşılır, böylece bellek tahsisi ve çöp toplama baskısı ortadan kalkar. Kıyaslama, işlem başına 13.9 nanosaniye ve 0 bayt bellek gösteriyor. Ryzen 5600x üzerinde k6 (1000 kullanıcı) ile yapılan yük testinde, 70 saniyede 81 gigabayt olmak üzere saniyede 8.8 gigabit hıza ve 60 bin başarılı HTTP yanıtına ulaşıldı, hiçbir hata oluşmadı. Abone koruması, engellemeyen kanal gönderimleri kullanır ve yavaş istemciler için karelerin atılmasını sağlar; ayrıca bir sonraki ana karede yeniden senkronizasyon için NeedsIFrame bayrağı kullanılır. Bellekte 5 HLS segmentinden oluşan kayan bir pencere tutulur; eski segmentler 404 döndürür ve hls.js gibi oynatıcıların canlı uca atlamasına neden olur. Sistem, 100 akış için 250 megabayt RAM kullanır, ancak işletim sistemi soket tamponları ek yük ekler. Yazar, sync.Pool tuzaklarına karşı uyarıyor ve dönüştürme gerektirmeyen iş yükleri için FFmpeg'den kaçınmanın ve sıfır kopyalama ile belleği kontrol etmenin faydalı olduğunu öne sürüyor.
Kaynak: Habr — хаб ИИ —
orijinal
