
스칼라 루프를 SIMD 기반 행렬 연산으로 재설계하여 대규모 추천 시스템의 성능 병목을 해결한 엔지니어링 사례
넷플릭스 기술 블로그에서 공유한 이 아티클은 추천 시스템의 핵심인 벡터 연산을 최적화하기 위한 여정을 담고 있습니다. 단순한 알고리즘 개선을 넘어 메모리 레이아웃과 최신 JVM API를 결합하여 실제 운영 환경에서 유의미한 비용 절감을 이끌어낸 과정을 상세히 설명합니다.
대규모 데이터셋에 대해 수학적 연산을 반복적으로 수행하는 자바 백엔드 개발자에게 필독을 권하며, 특히 머신러닝 임베딩 연산이나 고성능 데이터 처리가 필요한 서비스에 즉시 적용 가능한 최적화 패턴입니다.
넷플릭스의 Ranker 서비스에서 비디오 의외성 점수(serendipity scoring)를 계산할 때 발생하는 O(M×N) 구조의 순차적 연산과 비효율적인 메모리 접근으로 인해 전체 노드 CPU의 7.5%가 소모되는 성능 병목 현상이 발생했습니다.
단일 연산을 배치 형태의 매트릭스 곱셈으로 전환하고, Flat Buffer와 ThreadLocal을 활용해 메모리 레이아웃을 최적화했으며, JNI 오버헤드 없이 SIMD 가속을 제공하는 JDK Vector API를 도입하여 연산 효율을 극대화했습니다.
전체 CPU 사용률 7% 감소, 평균 지연 시간 12% 개선, RPS당 CPU 소모량 10% 절감이라는 성과를 거두었으며, 특히 해당 기능의 CPU 점유율이 7.5%에서 약 1% 수준으로 대폭 하락했습니다.
Trade-off
JDK Vector API는 현재 인큐베이팅 단계로 별도의 런타임 플래그가 필수적이며, ThreadLocal 기반 버퍼 재사용 전략으로 인해 메모리 사용량이 증가할 수 있고 버퍼가 자동으로 축소되지 않는 한계가 존재합니다.
네이티브 코드나 JNI 호출 없이 자바 언어만으로 CPU의 SIMD 기능을 직접 활용할 수 있도록 지원하는 인큐베이팅 API입니다.
하나의 명령어로 여러 개의 데이터를 동시에 병렬 처리하는 하드웨어 가속 기술입니다.
메모리 파편화를 방지하기 위해 데이터를 연속된 배열 형태(Flat)로 배치하고, 쓰레드별로 할당된 버퍼를 재사용하는 전략입니다.




