Performance Tuning

Performance Test

OvenMediaEngine은 WebRTC 성능을 측정하기 위해 OvenRtcTester라는 테스터를 제공합니다. Go 언어로 개발되었으며 pion/webrtc/v3gorilla/websocket 모듈을 사용합니다. 이 훌륭한 프로젝트에 기여해주신 pion/webrtcarrow-up-rightgorilla/websocketarrow-up-right 팀에 깊은 감사를 드립니다.

Getting Started OvenRtcTester

Install GO

OvenRtcTester는 Go 언어로 개발되었으므로 시스템에 Go가 설치되어 있어야 합니다. 다음 URL에서 Go를 설치하십시오: https://golang.org/doc/installarrow-up-right

OvenRtcTester는 go 1.17 최신 버전으로 테스트되었습니다.

Run

다음과 같이 간단하게 실행할 수 있습니다: -url은 필수입니다. -life 옵션을 사용하지 않으면 사용자가 ctrl+c를 누를 때까지 무기한으로 실행됩니다.

$ cd OvenMediaEngine/misc/oven_rtc_tester
$ go run OvenRtcTester.go
-url parameter is required and must be vaild. (input : undefined)
  -cint int
        [Optional] PeerConnection connection interval (milliseconds) (default 100)
  -life int
        [Optional] Number of times to execute the test (seconds)
  -n int
        [Optional] Number of client (default 1)
  -sint int
        [Optional] Summary information output cycle (milliseconds) (default 5000)
  -url string
        [Required] OvenMediaEngine's webrtc streaming URL (default "undefined")

선호도에 따라 go build 또는 go install을 사용할 수도 있습니다.

circle-exclamation

Performance Tuning

Monitoring the usage of threads

Linux에는 스레드별 CPU 사용량을 모니터링하는 다양한 도구가 있습니다. 가장 간단한 top 명령어로 확인해 보겠습니다. top -H -p [pid] 명령을 실행하면 다음 화면이 나타납니다.

아래와 같이 OvenRtcTester를 사용하여 서버의 용량을 테스트할 수 있습니다. 최대 성능을 테스트할 때 OvenRtcTester 역시 많은 시스템 리소스를 사용하므로 OvenMediaEngine이 실행 중인 시스템과 분리하여 테스트하십시오. 또한 여러 대의 서버를 사용하여 OvenRtcTester를 테스트하는 것을 권장합니다. 예를 들어 하나의 OvenRtcTester에서 -n 500으로 500명의 플레이어를 시뮬레이션하고, 4대의 서버를 사용하여 2000명의 플레이어를 시뮬레이션할 수 있습니다.

circle-exclamation

OvenMediaEngine의 용량을 초과하면, OvenRtcTester의 Summary(요약) 보고서에서 Avg Video DelayAvg Audio Delay 또는 Packet loss를 통해 이를 확인할 수 있습니다.

위의 캡처 화면 오른쪽에서는 OvenRtcTester로 400명의 플레이어를 시뮬레이션합니다. OvenRtcTester의 <Summary>를 보면 Avg Video DelayAvg Audio Delay가 매우 높고 Avg FPS가 낮은 것을 알 수 있습니다.

그리고 왼쪽에서는 top -H -p 명령으로 스레드별 CPU 사용량을 확인할 수 있습니다. 이를 통해 StreamWorker 스레드가 100%로 사용되고 있음을 확인했으며, 이제 StreamWorker 스레드 수를 늘려 서버를 확장할 수 있습니다. OvenMediaEngine이 서버의 모든 코어를 100% 사용하지 않는 경우, 스레드 수를 튜닝하여 성능을 향상시킬 수 있습니다.

설정에서 StreamWorkerCount 수를 8로 튜닝한 결과입니다. 이번에는 OvenRtcTester로 1000명의 플레이어를 시뮬레이션했으며, 안정적으로 작동하는 것을 확인할 수 있습니다.

Tuning the number of threads

<Bind>WorkerCount는 소켓을 통한 송수신을 담당하는 스레드를 설정할 수 있습니다. 퍼블리셔(Publisher)의 AppWorkerCount를 사용하면 RTP 패키징과 같은 스트림별 처리에 사용되는 스레드 수를 설정할 수 있으며, StreamWorkerCount를 사용하면 SRTP 암호화와 같은 세션별 처리를 위한 스레드 수를 설정할 수 있습니다.

Scalable Threads and Configuration

Thread name

Element in the configuration

AW-XXX

<Application><Publishers><AppWorkerCount>

StreamWorker

<Application><Publishers><StreamWorkerCount>

SPICE-XXX

<Bind><Provider><WebRTC><IceCandidates><TcpRelayWorkerCount>

<Bind><Pubishers><WebRTC><IceCandidates><TcpRelayWorkerCount>

SPRtcSignalling

<Bind><Provider><WebRTC><Signalling><WorkerCount>

<Bind><Pubishers><WebRTC><Signalling><WorkerCount>

SPSegPub

<Bind><Pubishers><HLS><WorkerCount>

<Bind><Pubishers><DASH><WorkerCount>

SPRTMP-XXX

<Bind><Providers><RTMP><WorkerCount>

SPMPEGTS

<Bind><Providers><MPEGTS><WorkerCount>

SPOvtPub

<Bind><Pubishers><OVT><WorkerCount>

SPSRT

<Bind><Providers><SRT><WorkerCount>

AppWorkerCount

Type

Value

Default

1

Minimum

1

Maximum

72

AppWorkerCount를 사용하면, 하나의 애플리케이션에 수백 개의 스트림이 생성될 때 스트림의 분산 처리를 위한 스레드 수를 설정할 수 있습니다. 애플리케이션이 스트림 생성을 요청받으면, 생성된 스레드 중 하나에 스트림이 균등하게 할당됩니다. Stream의 주요 역할은 원본(raw) 미디어 패킷을 전송할 프로토콜의 미디어 형식으로 패킷화하는 것입니다. 수천 개의 스트림이 있을 경우 하나의 스레드에서 이를 처리하기 어렵습니다. 또한 StreamWorkerCount가 0으로 설정된 경우, AppWorkerCount가 세션으로 미디어 패킷을 전송하는 역할을 담당합니다.

이 값은 CPU 코어 수를 초과하지 않는 것이 권장됩니다.

StreamWorkerCount

Type

Value

Default

8

Minimum

0

Maximum

72

하나의 스레드에서 수천 명의 시청자에게 데이터를 전송하는 것은 불가능할 수 있습니다. StreamWorkerCount를 사용하면 세션을 여러 스레드에 분산시켜 동시에 전송할 수 있습니다. 즉, WebRTC의 SRTP 암호화나 HLS/DASH의 TLS 암호화에 필요한 리소스를 여러 스레드가 분산하여 처리할 수 있습니다. 이 값은 CPU 코어 수를 초과하지 않는 것이 권장됩니다.

Use-Case

다수의 스트림이 생성되고 각 스트림에 접속하는 시청자가 매우 적은 경우, 아래와 같이 AppWorkerCount를 늘리고 StreamWorkerCount를 낮춥니다.

소수의 스트림이 생성되고 각 스트림에 아주 많은 시청자가 접속하는 경우, 아래와 같이 AppWorkerCount를 낮추고 StreamWorkerCount를 늘립니다.

Last updated