개발자의 오르막
분산트랜스코딩으로 알아보는 Boss-Worker 아키텍처 본문
트랜스 코딩이란 무엇일까?
위의 그림과 같이 현대에서는 하나의 영상이 다양한 기기에서 재생됩니다. Computer, TV, Tablet 등 다양한 디스플레이에서 재생되는 것은 물론, 하나의 디스플레이에서도 우리는 여러 해상도와 비트레이트를 제공합니다.
💡 해상도 (Resolution) : 1인치 안에 표현되는 화소나 점의 개수
비트레이트 (Bitrate) : 초당 처리하는 비트, 영상 재생 시 비트레이트가 높을 수록 하이 퀄리티의 영상을 볼 수 있습니다.
우리가 다양한 디바이스에서 원하는 해상도, 비트레이트, 화면비율 등으로 영상을 시청할 수 있는 것은 동영상이 사전에 다양한 버전으로 변환되어 제공되기 때문입니다. 원본 동영상 파일을 다른 포맷의 동영상 파일로 변환하는 과정을 트랜스코딩이라 합니다.
그러면 실제로, 트랜스코딩을 한다는 것은 구체적으로 어떤 과정이 발생하는 것일까요?
- 사용자가 동영상파일을 트랜스코딩하기 위해 업로드를 진행합니다.
- 서버는 하나의 영상 파일을 영상파일과 오디오파일로 분리하는 작업을 진행합니다. (Demuxer)
- 영상파일, 오디오파일을 변환하고자 하는 포맷으로 인코딩을 합니다.
- 이후, 각 인코딩된 영상파일, 오디오파일을 하나의 컨테이너 파일로 조합합니다.
위의 그림에서의 모래시계는 과정별로 어느 정도의 시간이 소요된 것을 나타냅니다. 서버에서 해상도가 1280 x 720 픽셀이고, 길이가 90초, 초당 프레임수가 30인 동영상을 단일 CPU 코어에서 트랜스코딩하면 ‘비디오 디코딩(decoding) + 비디오 인코딩(encoding) 엔 약 3분 40초, ‘오디오 디코딩 + 오디오 인코딩’ 엔 약 2.5초가 소요됩니다.
refer. https://engineering.linecorp.com/ko/blog/line-transcoding-server-architecture-improvement-1/
동영상 트랜스코딩에서는 비디오 디코딩-인코딩 과정에서 많은 시간이 소요됨을 알 수 있습니다.
그만큼 CPU 자원의 연산 작업이 많이 수행된다는 것을 의미합니다.
우리는 4~5 시간이 넘어가는 라이브 영상을 다시보기로 보고 싶을 때, 몇 시간을 기다리는 경우도 생길 수 있습니다.
방송이 끝난 후 몇시간이 지난 후에 제공되는 다시보기 서비스는 시청자의 관심도를 떨어뜨릴 수 있습니다.
그러면 우리는 동영상을 높은 고해상도로 다양한 포맷으로 트랜스코딩을 진행하고 싶을 때, 좀더 빠르게 트랜스코딩할 수 있는 방법이 없을까?
하나의 서버가 트랜스코딩 작업을 수행하는 것이 오래걸린다면, 우리는 여러 서버가 트랜스코딩을 진행할 수 있도록 작업을 분산해주면 될 것입니다.
영상이 업로드되면, 하나의 영상을 여러개의 영상으로 자른 후, 여러 서버에게 작업을 할당하여 트랜스코딩을 진행 후에 다시 합치는 작업을 거치면 트랜스코딩 속도가 더 향상될 수 있습니다.
💡 하나의 작업을 지시하는 역할과 작업을 진행하는 역할로 나뉘어 수행하는 모델을 Boss-Worker 모델이라고 합니다.
저희는 편의상 Boss 를 Scheduler, Worker를 Worker로 정의하도록 하겠습니다.
위와 같은 방법으로 트랜스코딩을 향상시키는 방법을 분산 트랜스코딩이라하며, 단위별로 작업을 나누도록 하겠습니다.
분산 트랜스코딩 단계별 작업 과정
- 분산트랜스코딩 하고자 하는 영상을 업로드 후, 작업 요청을 받는다.
- 요청받은 영상을 특정 시간 단위별로 자른다.
- 각각 잘린 영상에 대해 트랜스코딩을 할 수 있도록 여러 서버에게 작업을 지시한다.
- 모든 영상파일이 정상적으로 트랜스코딩을 완료하였을 경우 결과 영상들을 합친다.
1. 먼저 스케줄러는 Callback (분산트랜스코딩을 수행해야 하는 작업이 생겼을 때 알림을 받아 이벤트를 동작하는 방식) 방식으로 분산 트랜스코딩 작업을 대기합니다.
2. 주키퍼를 통해 분산트랜스코딩 요청을 받은 영상파일을 시간 단위별로 분할하는 작업을 수행합니다.
3. 각각 작업을 Scheduler 서버가 Worker 서버에게 전달할 수 있도록 Message Queue 를 활용해 프로파일별 트랜스코딩 명령을 전달합니다.
4. 각 Worker 서버에서 트랜스코딩 작업을 완료한 후 완료 결과를 Scheduler 에게 Message Queue 를 활용해 전달합니다.
5. Scheduler 는 모든 영상파일이 완료되었다는 응답을 받으면, 해당 영상파일을 합치는 작업을 진행합니다.
💡 여기서 드는 의문점이 있습니다.
만일, 하나의 파일만 트랜스코딩을 하는 경우, 3개의 서버에게 일을 분업하여 작업을 진행한다면 3개의 서버 모두 일을 하게 되어 작업 시간은 대폭 감소하겠지만,
3개의 파일을 동시에 트랜스코딩 하는 경우, 이미 3개의 서버 모두가 같이 일을 하는 경우일 때에도 분산트랜스코딩 방식의 성능이 더 높을까?
이를 알아보기 위해 실제 아래와 같은 시나리오로 테스트를 진행해보았습니다.
일반 트랜스코딩 VS 분산 트랜스코딩 성능 테스트
테스트 환경
- 서버는 5대로, 각 CPU 의 코어가 다르다.
- 파일은 같은 Spec 의 파일로 테스트를 진행한다.
- File size : 326M
- Codec : avc
- Duration : 14m 15s
- Size : 1920 x 1080
- Bitrate : 3056kbps
테스트 목표 : 일반 트랜스코딩과 분산트랜스코딩의 성능차이
- 1개의 파일 업로드를 진행했을 때
- 5개의 파일을 동시에 업로드를 진행해보았을 때
- 10개의 파일을 동시에 업로드를 진행해보았을 때
1개 파일을 트랜스코딩 시 각 서버별 소요되는 작업시간
Server 정보 CPU Encoding 시간
- 서버 별 CPU Spec 에 따라 트랜스코딩 작업 소요시간이 걸리는 양상을 알 수 있다.
- 어떤 서버에게 Job 을 배분하는지는 현재 서버의 유휴상태 (작업 가능 여부) 따라 배분을 하지만, Server-2 와 Server-5 에 작업을 할당하게 되는 경우에는 최대 21분 정도가 소요될 수 있음을 알 수 있다.
- 하나의 서버가 작업을 진행하게 되면, 다른 서버들은 대기 상태에 놓여지게 된다.
1개 파일을 분산 트랜스코딩 시 걸리는 작업시간
- 1개 파일을 분산 트랜스코딩 시 걸리는 시간은 평균적으로 대략 3분대임을 알 수 있다.
- 파일을 분리하고, 합치는 시간은 각각 대략 5~6초 소요된다.
- 이는 분산트랜스코딩 시에만 생기는 추가 작업소요이다.
- 일반 트랜스코딩과 작업소요시간을 비교해보았을 때 최소 약 4분에서 최대 18분 정도 성능차이를 알 수 있다.
5개 파일을 트랜스코딩 시 각 서버별 소요되는 작업시간
Server 정보 CPU Encoding 시간
- 5개의 파일을 트랜스코딩 시에도 위의 표와 같은 시간이 소요됨을 알 수 있다.
- Server-3 은 7m 40s 로 제일 빨리 트랜스코딩 작업이 완료되었으나, 이후 대기하고 있는 상태이다.
- Server-2 가 21m 40s 를 완료해야 비로소 5개 파일 트랜스코딩 작업이 모두 완료됨을 알 수 있다.
5개 파일을 분산 트랜스코딩 시 걸리는 작업시간
- 5개 파일을 분산 트랜스코딩 시 걸리는 시간은 평균적으로 대략 15분대로 나왔다.
- 파일을 분리하고, 합치는 시간은 각각 대략 5~10초 소요된다.
- 이는 분산트랜스코딩 시에만 생기는 추가 작업소요이다.
이를 그래프로 표현하면 다음과 같다.
10개 파일을 트랜스코딩할 때의 작업 소요시간 그래프
10개 파일을 분산 트랜스코딩할 때의 작업 소요시간 그래프
- 일반 트랜스코딩과 분산 트랜스코딩의 작업소요시간 그래프를 비교해보면 알 수 있다.
- 분산 트랜스코딩은 서버 Spec 과 무관하게 모든 서버의 CPU 자원을 골고루 사용하여 평균적인 작업소요시간을 단축 시킬 수 있는 장점이 있다.
분산 트랜스코더의 장점
- 성능이 정량적으로 증가할 수 있다.
- 서버의 대수가 늘어날 수록 작업속도가 빨라진다.
- 실패에 대한 빠른 결과를 볼 수 있다.
- 4시간 지점의 구간때문에 트랜스코딩이 실패하는 경우
- 단일 트랜스코더인 경우, 5시간 걸리는 트랜스코딩이 4시간 때 에러가 발생하면 그 때 알 수 있음
- 분산트랜스코더인 경우 파일 자체를 분산해서 트랜스코딩하기 때문에 실패를 바로 알 수 있음
- 4시간 지점의 구간때문에 트랜스코딩이 실패하는 경우
분산 트랜스코더의 단점
- 용량이 작은 파일의 경우에는 일반 트랜스코딩보다 더 오래 걸릴 수 있다.
- 파일을 분리하고, 합치는 단계가 추가되기 때문이다.
번외) Video 와 Audio 를 한꺼번에 분산트랜스코딩 한 경우 생기는 문제점
- 오디오와 영상을 한꺼번에 분산 트랜스코딩을 수행하게 되면 짤리는 위치가 생긴다.
- 원본
- 영상 + 오디오 분산 트랜스코딩 한 후 합친 오디오
- 오디오를 분리한 후 트랜스코딩
문제가 되는 (영상 + 오디오) 를 분산 트랜스코딩하게 되면 영상은 문제가 없으나 오디오에서 끊김현상이 발생한다.
확대해보면 위와 같이 검은색 줄이 보이는데, 일정한 주기로 오디오 음량이 줄어드는 끊김 현상을 볼 수 있다.
실제 영상을 시청하게 되면 순간순간 오디오가 끊어지는 것을 알 수 있다.
Reference
- https://m.blog.naver.com/dna2073/221111113511
- https://engineering.linecorp.com/ko/blog/line-transcoding-server-architecture-improvement-1/
- https://itrum.tistory.com/91
- https://d2.naver.com/helloworld/0216497
'Architecture' 카테고리의 다른 글
[Udemy] Apache Kafka 시리즈 - 초보자를 위한 아파치 카프카 강의 v3 (0) | 2024.05.08 |
---|---|
코드스멜을 피하는 방법 Sonarqube (0) | 2023.07.26 |
대규모 채팅 아키텍처는 C10K 문제를 어떻게 해결할까? (1) | 2023.03.11 |