Go でシングルCPUコア上で8.8Gbpsのビデオトラフィックを実現
Microsoft
Habr の開発者が、Thundering Herd 問題に対処するために、Go で書かれたカスタム RTSP から HLS へのストリーミングエンジン「Ruseon Core」の構築について説明しています。このエンジンは、sync.Pool を使用したゼロコピーリングバッファを利用してアロケーションを回避し、シングルコアで 8.8Gbps のスループットを達成し、FFmpeg や MediaMTX とは異なり、メモリと CPU の使用量を最小限に抑えています。
共有リンクが原因でサンダリング・ハード(群集雪崩)とサーバーのOOMが発生した後、著者はより高性能なハードウェアをレンタルする代わりに、Goでカスタムストリーミングエンジンを構築することにしました。Ruseon Coreと名付けられたこのエンジンは、RTSPストリームを取り込み、トランスコーディングなしでHLSに出力します。単にバイトを中継するだけです。重要な特徴は、sync.Poolを使用したゼロコピーリングバッファです。フレームはプールから取得したバッファに一度だけ書き込まれ、すべてのサブスクライバーと共有されるため、アロケーションとGCプレッシャーが排除されます。ベンチマークでは、13.9 ns/op、0 B/opという結果が出ています。Ryzen 5600xでのk6(1000ユーザー)による負荷テストでは、8.8 Gbps(70秒で81 GB)を達成し、6万件の成功したHTTPレスポンスがあり、失敗はありませんでした。サブスクライバー保護には、非ブロッキングチャネル送信を使用し、遅いクライアントにはフレームをドロップし、NeedsIFrameフラグを使用して次のキーフレームで再同期します。メモリ内には5つのHLSセグメントのスライディングウィンドウが保持され、古いセグメントは404を返し、hls.jsなどのプレーヤーがライブエッジにジャンプします。このシステムは100ストリームで250 MBのRAMを使用しますが、OSのソケットバッファがオーバーヘッドを追加します。著者はsync.Poolの落とし穴について警告し、トランスコーディングしないワークロードでは、FFmpegを避け、ゼロコピーでメモリを制御することが有益であると示唆しています。
出典: Habr — хаб ИИ —
原文
