POOOLING FOREST
C로 구현한 Fast CVVDP: 성능 최적화, 어디까지 해보셨나요? - C로 구현한 fcvvdp 프로젝트를 통해 성능 최적화의 중요성과 효율적인 구조 설계가 인프라 비용 및 서비스
Engineering & Tech

C로 구현한 Fast CVVDP: 성능 최적화, 어디까지 해보셨나요?

C로 구현한 fcvvdp 프로젝트를 통해 성능 최적화의 중요성과 효율적인 구조 설계가 인프라 비용 및 서비스 성능에 미치는 영향에 대해 알아봅니다.

김영태

테크리드

안녕하세요. 풀링포레스트에서 백엔드와 인프라를 담당하고 있는 8년 차 개발자 김영태입니다.

개발자라면 누구나 '최적화'라는 단어에 가슴 한구석이 뜨거워지거나, 혹은 서늘해지는 경험이 있을 겁니다. 저 역시 그랬습니다. 서비스 초기에는 그저 "돌아가기만 하면 된다"라며 기능 구현에 급급했었죠. 하지만 트래픽이 늘어나고 서버 비용 명세서를 받아보는 순간, 최적화는 선택이 아닌 생존의 문제가 되더군요.

오늘은 최근 GitHub에서 발견한 흥미로운 프로젝트 하나를 소개하며, 우리가 성능 최적화를 대할 때 어떤 관점을 가져야 할지 이야기해보려 합니다. 바로 fcvvdp라는 프로젝트입니다.

1. 성능 지표의 함정, 그리고 돌파구

영상이나 이미지를 다루는 서비스에서 화질 평가(Quality Metric)는 필수적입니다. 단순히 파일 크기를 줄리는 것만이 능사가 아니라, 사용자가 눈으로 볼 때 화질 저하가 없는지 판단해야 하니까요. 이때 자주 쓰이는 지표 중 하나가 CVVDP(Color Video Visual Difference Predictor)입니다. 케임브리지 대학에서 연구한 아주 정교한 모델이죠.

문제는 이 CVVDP 계산이 꽤 무겁다는 점입니다. 정확도가 높은 만큼 CPU를 많이 잡아먹고 메모리도 펑펑 씁니다. 저희 팀도 비슷한 무거운 연산 작업을 백엔드에서 처리하다가 EC2 인스턴스 사양을 계속 올렸던 뼈아픈 기억이 있습니다. "돈으로 해결하자"는 생각이었지만, 결국엔 한계에 부딪혔죠.

그런데 최근 공개된 fcvvdp는 이 무거운 CVVDP를 C언어로 재구현하여 놀라운 성과를 보여줍니다.

2. 압도적인 효율성의 비밀

이 프로젝트의 벤치마크 결과를 보면 정말 입이 딱 벌어집니다. 기존 cvvdp 구현체와 비교했을 때 어떤 차이가 있을까요?

  • 실행 시간(Wall time): 약 18% 더 빠릅니다.

  • 메모리 사용량(Peak RSS): 무려 91% 감소했습니다. (1GB → 86MB)

  • CPU 사이클:89% 감소했습니다.

여기서 정말 충격적인 부분은 fcvvdp는 싱글 스레드(Single-threaded)로 동작하는데도, 멀티 스레드를 사용하는 기존 cvvdp보다 빠르다는 점입니다. 보통 성능을 높이려면 "병렬 처리를 늘려야지!"라고 생각하기 쉽습니다. 저 역시 주니어 시절, 성능이 안 나오면 무조건 스레드 풀 사이즈부터 늘리곤 했으니까요. 하지만 이 프로젝트는 알고리즘 자체의 효율성과 언어(C/Zig)의 특성을 극한으로 활용해 근본적인 체급 차이를 극복했습니다.

사용자 시간(User time) 기준으로 따지면 효율성이 약 15배나 더 좋다고 합니다. 이는 클라우드 환경에서 비용을 1/15로 줄일 수도 있다는 뜻입니다. 정말 솔깃하지 않나요?

3. 우리가 배워야 할 점: '기본'으로 돌아가기

사실 현업에서 비즈니스 로직 짜기도 바쁜데, C나 Zig 같은 로우 레벨 언어로 모든 것을 재작성할 수는 없습니다. 하지만 fcvvdp가 주는 교훈은 명확합니다.

"무작정 리소스를 쏟아붓기 전에, 비효율적인 구조가 없는지 먼저 살펴보자."

저희 팀에서도 최근 비슷한 경험을 했습니다. 대용량 로그 처리 시스템이 느려져서 처음에는 단순히 Kafka 파티션과 컨슈머만 늘렸습니다. 하지만 병목은 다른 곳에 있었죠. 불필요한 객체 생성과 과도한 GC(Garbage Collection)가 원인이었습니다. 결국 로직을 단순화하고 메모리 할당을 최소화하는 방식으로 리팩토링했더니, 인프라 비용을 절반으로 줄일 수 있었습니다.

fcvvdp도 마찬가지입니다. 무거운 라이브러리에 의존하는 대신, 필요한 연산만 최적화하여 구현했기에 이런 퍼포먼스가 가능했을 겁니다. (참고로 이 프로젝트는 빌드 시스템으로 Zig를 사용하고 있습니다. C와 Zig의 조합이라니, 최신 트렌드를 잘 반영했네요.)

4. 마치며: 최적화는 결국 '관심'입니다

개발자로서 우리는 종종 편리함에 취해 무거운 프레임워크나 라이브러리를 고민 없이 사용하곤 합니다. 물론 생산성 측면에서는 훌륭한 선택입니다. 하지만 서비스가 성장하고 규모가 커질수록, 한 줄의 코드, 한 번의 메모리 할당이 시스템 전체에 미치는 영향은 기하급수적으로 커집니다.

혹시 지금 운영 중인 서비스 어딘가에서 메모리가 줄줄 새고 있거나, CPU가 비명을 지르고 있진 않나요? 이번 주에는 팀원들과 함께 모니터링 대시보드를 켜놓고, 우리 시스템의 '군살'은 어디인지 한번 찾아보는 건 어떨까요? fcvvdp처럼 90%의 다이어트는 힘들더라도, 10%의 개선만으로도 쾌적한 밤을 보낼 수 있을지 모릅니다.

저도 오늘은 미뤄뒀던 레거시 코드의 프로파일링을 좀 돌려봐야겠습니다. 읽어주셔서 감사합니다.


참고: fcvvdp는 Apache 2.0 라이선스로 공개되어 있으며, 자세한 빌드 방법과 사용법은 GitHub 리포지토리에서 확인할 수 있습니다. 영상 처리나 품질 측정에 관심 있는 분들이라면 꼭 한번 살펴보시길 추천합니다.

지금 읽으신 내용, 귀사에 적용해보고 싶으신가요?

상황과 목표를 알려주시면 가능한 옵션과 현실적인 도입 경로를 제안해드립니다.