[IT 심층 분석]
영상 인코딩(HEVC) 시 하드웨어 가속기 발열 분석과 쓰로틀링 방지용 커널 스케줄링 패치
김민준 · IT 시스템 엔지니어|
초고화질 비디오 시대가 도래하며 모바일 환경에서의 8K 해상도 또는 4K 120fps 급의 영상 촬영은 더 이상 환상이 아닌 필수 요구 사항으로 자리 잡았습니다. 이 방대한 데이터를 처리하기 위해 현대의 AP들은 무거운 압축 표준인 H.265 즉 HEVC 코덱을 하드웨어 가속기 블록으로 분리하여 탑재합니다. 그런데 저희 개발 팀의 메인 보드에서 악명 높은 발열 셧다운 이슈가 발생했습니다. 약 10분 이상 고해상도 영상을 촬영하면 AP 칩셋 정중앙의 코어 온도가 100도를 돌파하며 시스템이 비명 행사하듯 쓰로틀링을 넘어서 아예 운영체제 패닉을 일으키고 종료되는 현상이었습니다. 소비자들이 이 제품을 손에 들고 장시간 콘서트장을 촬영한다고 상상하면 이는 끔찍한 브랜드 치명상을 의미했기에 모든 백엔드 역량을 끌어모아 열 역학적 진단과 스케줄링 보정 작업에 착수했습니다.
문제의 원인을 파헤치기 위해 칩셋 내부의 서멀 센서들이 수집하는 온도를 밀리초 단위로 덤프하여 외부 로그 서버로 전송하는 데몬을 띄워 로깅을 시작했습니다. 그 결과 열을 발생시키는 주범은 단순히 영상을 처리하는 HEVC 가속기 블록 그 자체가 아니라 그 블록으로 거대한 데이터를 실어나르기 위해 캐시 일관성을 유지하려 발버둥 치는 CPU L3 캐시 컨트롤러 및 버스 인터페이스 쪽에 몰려 있음을 발견할 수 있었습니다. 특히 인코더 가속기가 완료 인터럽트를 발생시키고 호스트 CPU가 그 압축된 스트림을 받아 mp4 컨테이너로 묶기 위해 수백 메가바이트의 메모리 복사를 수행하는 일련의 흐름에서 메모리 컨트롤러 트래픽이 극한으로 치솟으며 전력 소모의 스파이크가 연쇄적으로 발생했던 것입니다. 스케줄러는 코어 온도가 치솟자 급기야 모든 프로세스의 클록을 바닥으로 쳐박는 폴백 메커니즘을 가동시켜 프레임 드랍과 프리징을 유발했죠.
이러한 지독한 열 폭주 굴레를 끊기 위해서는 운영체제의 서멀 스로틀링(Thermal Throttling) 프레임워크 자체를 영상 처리라는 도메인에 맞게 스마트하게 찢어발겨 리팩토링할 필요가 있었습니다. 기존의 리눅스 커널 서멀 코어 정책은 온도가 임계점에 다다르면 무식하게 전체 CPU 클럭을 반토막 내는 패시브 쿨링(Passive Cooling) 정동 방식을 채택합니다. 저는 여기서 한발 나아가 HEVC 인코딩 태스크가 동작 중일 때에는 애플리케이션 프로세서가 아닌 코프로세서 레벨의 온도를 미리 예측하는 프리딕티브 서멀 주지사(Predictive Thermal Governor) 알고리즘의 패치를 작성해 커널에 이식했습니다. 시스템 전체를 죽이는 대신 열이 집중되는 특정 메모리 버스의 레이턴시를 일부러 미세하게 늘려서 데이터 병목의 병사들이 한 번에 우르르 몰려가는 것을 지능적으로 분산시키는 전술을 취했습니다.
또한 사용자 공간의 레코딩 데몬에도 전력 소모를 극적으로 줄일 수 있는 캐시 라인 바이패스 기법을 코딩해주었습니다. 인코더 칩에서 튕겨져 나온 비트스트림 메모리를 CPU가 명시적으로 캐시에 욱여넣지 못하게 Non-Cacheable 속성의 매핑 공간으로 할당했습니다. 단순히 시스템 콜 파라미터 하나를 수정하여 캐싱을 우회한 것뿐임에도 불구하고 캐시 히트 검사와 이빅션(Eviction) 및 동기화 무효 처리에 들어가던 엄청난 실리콘 전력 소비가 증발해버리면서 전체 칩 다이의 평균 온도는 단번에 12도 가까이 하락하는 기염을 토했습니다. 결국 서멀 스로틀링 개입 없이 8K 영상 연속 1시간 촬영에 성공하는 쾌거를 이루었으며 이는 하드웨어의 무능을 소프트웨어의 치밀한 메모리 버스 지휘로 타개한 자랑스러운 엔지니어링 업적으로 기억되고 있습니다.