
스레드 고갈부터 무서운 OOM 장애까지, OpenSearch KNN 소스코드 분석과 마트료시카 임베딩 차원 축소로 극복한 이야기
포스타입 백엔드 팀이 실시간 개인화 추천 시스템을 구축한 이후 마주친 극심한 성능 저하와 클러스터 마비 현상을 해결한 백엔드 인프라 개선기입니다. 무거운 HNSW 기반 KNN 검색 쿼리를 가볍게 다듬고, 인프라 격리 및 샤드 튜닝을 통해 안정성을 극대화한 실무적인 엔지니어링 과정을 소개합니다. 특히 1024차원 임베딩 벡터를 정보 손실 없이 512차원으로 절반 가까이 축소해 메모리 부하를 파격적으로 극감시킨 과정은 대규모 데이터를 다루는 개발자에게 놀라운 인사이트를 제공합니다.
OpenSearch 혹은 Elasticsearch를 통해 실시간 벡터 추천 및 검색 엔진을 실무에 도입해 운영 중인 아키텍트와 백엔드 엔지니어들에게 권장합니다. 메모리 릭 수준의 OOM 이슈나 KNN 캐시 무효화 등의 까다로운 트러블슈팅 사례가 매우 실질적으로 잘 녹아 있어 인프라 안정화 작업 계획 시 필수 체크리스트로 유용합니다.
OpenSearch 기반의 고차원 벡터 KNN 추천 시스템 도입 이후, 피크 시간대의 무거운 쿼리로 인해 검색 스레드가 고갈되어 전체 검색 서비스의 장애를 유발했습니다. 또한, 특정 노드로 KNN 그래프가 쏠리는 샤드 불균형 문제와 캐시 웜업 단계에서 물리 RAM 한계를 초과하여 발생하는 노드 OOM(Out of Memory) 현상이 발생하여 추천 시스템의 안정성이 위협받았습니다.
쿼리 최적화를 위해 Painless 스크립트 기반 코사인 유사도 연산 대신 HNSW 그래프 기반 선검색을 적용하였고, 불필요한 전체 소스 로드를 방지하기 위해 필요한 필드만 가져오도록 필터링했습니다. 더불어 cancel_after_time_interval을 적용해 타임아웃 이후 스레드를 즉시 반환하도록 유도했으며, 노드 배수 기준의 샤드 재분배와 추천 전용 클러스터 구축을 진행했습니다. 최종적으로는 Matryoshka Representation Learning(MRL) 기술을 지원하는 임베딩 모델 특성을 활용해 벡터의 앞쪽 512차원만 잘라내어 차원을 축소했습니다.
샤드 리밸런싱을 통해 특정 노드 쏠림이 해소되어 가장 부하가 심했던 노드의 평균 쿼리 레이턴시가 32.2ms에서 6.06ms로 약 81% 개선되었습니다. 또한 임베딩 벡터의 차원을 1024차원에서 512차원으로 절반 축소함으로써 그래프 메모리 점유율을 노드당 78%에서 34%로 대폭 줄였으며, 저장 용량도 44% 절약하면서도 평균 레이턴시 10ms 수준의 매우 안정적인 추천 서비스를 유지하게 되었습니다.
Trade-off
성능 튜닝 중 ef_search 파라미터를 실시간으로 축소하려 시도했으나, 사용 중이던 OpenSearch k-NN 플러그인(v2.19)의 설계적 문제로 캐시 재구축이 강제 트리거되어 약 2분간 클러스터가 Yellow 상태로 전환되고 전체 사이트 레이턴시가 지연되는 부작용을 겪었습니다. 또한 차원을 1024차원에서 512차원으로 축소하면서 완벽한 전체 차원 비교 대비 추천 정밀도 측면에서 아주 미세한 수준의 손실이 수반되었을 것으로 추정되나, 실무 관점의 유의미한 수치 하락은 본문에 언급되지 않았습니다.
고차원 공간 내에서 최근접 벡터를 고속으로 근사 탐색하기 위해 데이터를 계층 그래프 구조로 연결해 나가는 대중적인 벡터 색인 알고리즘입니다.
OpenSearch에서 디스크 공간 상에 원본 JSON을 통째로 압축해 갖고 있는 source 필드를 읽는 단계로, 조회 과정에서 빈번한 디스크 읽기와 압축 해제 연산을 수반합니다.
마트료시카 인형처럼 정보의 중요도를 임베딩 벡터의 앞부분부터 순서대로 고밀도로 압축 학습해 두는 인공지능 임베딩 정렬 기법입니다.




