Go로 단일 CPU 코어에서 8.8Gbps 비디오 트래픽 달성하기
Microsoft
Habr의 한 개발자는 Go로 작성된 맞춤형 RTSP-to-HLS 스트리밍 엔진인 Ruseon Core를 사용하여 Thundering Herd 문제를 해결하는 방법을 설명합니다. 이 엔진은 할당을 피하기 위해 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초 동안 81GB)를 달성했고 60,000건의 성공적인 HTTP 응답이 있었으며 실패는 없었습니다. 구독자 보호에는 논블로킹 채널 전송을 사용하며 느린 클라이언트에게는 프레임을 드롭하고, NeedsIFrame 플래그를 사용하여 다음 키프레임에서 재동기화합니다. 메모리에는 5개의 HLS 세그먼트로 구성된 슬라이딩 윈도우가 유지되며, 오래된 세그먼트는 404를 반환하여 hls.js와 같은 플레이어가 라이브 엣지로 점프하도록 합니다. 이 시스템은 100개의 스트림에 대해 250MB RAM을 사용하지만, OS 소켓 버퍼가 오버헤드를 추가합니다. 저자는 sync.Pool의 함정에 대해 경고하며, 트랜스코딩이 아닌 워크로드의 경우 FFmpeg를 피하고 제로 카피로 메모리를 제어하는 것이 유리하다고 제안합니다.
출처: Habr — хаб ИИ —
원문
