गो में एक सिंगल CPU कोर पर 8.8 Gbps वीडियो ट्रैफिक हासिल करना

MicrosoftMicrosoft
Habr के एक डेवलपर ने 'Thundering Herd' समस्या से निपटने के लिए गो में 'Ruseon Core' नामक एक कस्टम RTSP-से-HLS स्ट्रीमिंग इंजन बनाने का वर्णन किया है। यह इंजन मेमोरी आवंटन से बचने के लिए sync.Pool के साथ एक ज़ीरो-कॉपी रिंग बफर का उपयोग करता है, जिससे एक कोर पर 8.8 Gbps थ्रूपुट प्राप्त होता है, और FFmpeg या MediaMTX के विपरीत न्यूनतम मेमोरी और CPU उपयोग होता है।
एक साझा लिंक के कारण जब सर्वर पर अत्यधिक लोड (थंडरिंग हर्ड) और OOM (आउट ऑफ मेमोरी) की समस्या हुई, तो लेखक ने अधिक शक्तिशाली हार्डवेयर किराए पर लेने के बजाय Go में एक कस्टम स्ट्रीमिंग इंजन बनाने का निर्णय लिया। यह इंजन, जिसका नाम Ruseon Core है, RTSP स्ट्रीम को इनपुट करता है और बिना ट्रांसकोडिंग के HLS आउटपुट करता है, केवल बाइट्स को रिले करता है। इसकी मुख्य विशेषता sync.Pool के साथ एक ज़ीरो-कॉपी रिंग बफर है: फ्रेम्स को पूल से लिए गए बफर में एक बार लिखा जाता है और सभी सब्सक्राइबर्स के साथ साझा किया जाता है, जिससे एलोकेशन और जीसी प्रेशर समाप्त हो जाता है। बेंचमार्क 13.9 ns/op और 0 B/op दिखाता है। Ryzen 5600x पर k6 (1000 उपयोगकर्ता) के साथ लोड टेस्टिंग में 8.8 Gbps (70 सेकंड में 81 GB) की गति प्राप्त हुई, जिसमें 60k सफल HTTP प्रतिक्रियाएं हुईं और कोई विफलता नहीं हुई। सब्सक्राइबर सुरक्षा के लिए नॉन-ब्लॉकिंग चैनल सेंड का उपयोग किया जाता है, जिसमें धीमे क्लाइंट के लिए फ्रेम ड्रॉप किए जाते हैं, और NeedsIFrame फ्लैग अगले कीफ्रेम पर रीसिंक करने के लिए होता है। मेमोरी में 5 HLS सेगमेंट की स्लाइडिंग विंडो रखी जाती है; पुराने सेगमेंट 404 लौटाते हैं, जिससे hls.js जैसे प्लेयर लाइव एज पर कूद जाते हैं। सिस्टम 100 स्ट्रीम के लिए 250 MB RAM उपयोग करता है, लेकिन OS सॉकेट बफर अतिरिक्त ओवरहेड जोड़ते हैं। लेखक sync.Pool की कमियों के बारे में चेतावनी देता है और सुझाव देता है कि नॉन-ट्रांसकोडिंग वर्कलोड के लिए, FFmpeg से बचना और ज़ीरो-कॉपी के साथ मेमोरी नियंत्रण करना फायदेमंद है।
स्रोत: Habr — хаб ИИ — मूल
इस विषय पर हमारी पिछली पोस्ट ↓
ताज़ा समाचार