DevLog

엔지니어링 블로그를 한 곳에서 탐색하고, 최근 발행 흐름을 빠르게 파악할 수 있는 서비스 입니다.

Quick Links

  • Latest Feed
  • Engineering Directory

Support

  • 소개
  • 개인정보처리방침

Contribute

  • 원하는 블로그 추가 (준비 중)
  • Feedback

© 2026 DevLog Inc. All rights reserved.

본 사이트는 공개 RSS 피드를 통해 콘텐츠를 수집하며, 모든 콘텐츠의 저작권은 원저작자에게 있습니다.

Back to Feed
Read Original

Contents

Continue Reading

  • More from 포스타입
  • Related reads#OpenSearch
#Backend

포스타입이 개인화 추천을 하는 방법 2부

포스타입이 개인화 추천을 하는 방법 2부
01

Summary

피크 시간대 장애 해결! 포스타입의 대규모 OpenSearch 벡터 검색 최적화 분투기

스레드 고갈부터 무서운 OOM 장애까지, OpenSearch KNN 소스코드 분석과 마트료시카 임베딩 차원 축소로 극복한 이야기

포스타입 백엔드 팀이 실시간 개인화 추천 시스템을 구축한 이후 마주친 극심한 성능 저하와 클러스터 마비 현상을 해결한 백엔드 인프라 개선기입니다. 무거운 HNSW 기반 KNN 검색 쿼리를 가볍게 다듬고, 인프라 격리 및 샤드 튜닝을 통해 안정성을 극대화한 실무적인 엔지니어링 과정을 소개합니다. 특히 1024차원 임베딩 벡터를 정보 손실 없이 512차원으로 절반 가까이 축소해 메모리 부하를 파격적으로 극감시킨 과정은 대규모 데이터를 다루는 개발자에게 놀라운 인사이트를 제공합니다.

  • 01Painless 무차별 대입 연산에서 HNSW 그래프 선검색 방식으로 최적화하여 쿼리 계산 비용 급감
  • 02Fetch 단계의 stored field(source) 디스크 IO 비용을 제거하고 필요한 필드(ID)만 부분 스캔하도록 유도
  • 03cancel_after_time_interval을 활용한 실질적이고 강제적인 쿼리 스레드 반환 구현
  • 04실시간 ef_search 런타임 변경 시 OpenSearch KNN 플러그인의 내장 캐시가 통째로 무효화되는 버그 분석 및 규명
  • 05Amazon Titan 임베딩의 MRL 특성을 이용해 1024차원을 512차원으로 줄이고 메모리 점유율을 78%에서 34%로 해결

+RECOMMENDATION

OpenSearch 혹은 Elasticsearch를 통해 실시간 벡터 추천 및 검색 엔진을 실무에 도입해 운영 중인 아키텍트와 백엔드 엔지니어들에게 권장합니다. 메모리 릭 수준의 OOM 이슈나 KNN 캐시 무효화 등의 까다로운 트러블슈팅 사례가 매우 실질적으로 잘 녹아 있어 인프라 안정화 작업 계획 시 필수 체크리스트로 유용합니다.

The Problem

OpenSearch 기반의 고차원 벡터 KNN 추천 시스템 도입 이후, 피크 시간대의 무거운 쿼리로 인해 검색 스레드가 고갈되어 전체 검색 서비스의 장애를 유발했습니다. 또한, 특정 노드로 KNN 그래프가 쏠리는 샤드 불균형 문제와 캐시 웜업 단계에서 물리 RAM 한계를 초과하여 발생하는 노드 OOM(Out of Memory) 현상이 발생하여 추천 시스템의 안정성이 위협받았습니다.

The Solution

쿼리 최적화를 위해 Painless 스크립트 기반 코사인 유사도 연산 대신 HNSW 그래프 기반 선검색을 적용하였고, 불필요한 전체 소스 로드를 방지하기 위해 필요한 필드만 가져오도록 필터링했습니다. 더불어 cancel_after_time_interval을 적용해 타임아웃 이후 스레드를 즉시 반환하도록 유도했으며, 노드 배수 기준의 샤드 재분배와 추천 전용 클러스터 구축을 진행했습니다. 최종적으로는 Matryoshka Representation Learning(MRL) 기술을 지원하는 임베딩 모델 특성을 활용해 벡터의 앞쪽 512차원만 잘라내어 차원을 축소했습니다.

The Result

샤드 리밸런싱을 통해 특정 노드 쏠림이 해소되어 가장 부하가 심했던 노드의 평균 쿼리 레이턴시가 32.2ms에서 6.06ms로 약 81% 개선되었습니다. 또한 임베딩 벡터의 차원을 1024차원에서 512차원으로 절반 축소함으로써 그래프 메모리 점유율을 노드당 78%에서 34%로 대폭 줄였으며, 저장 용량도 44% 절약하면서도 평균 레이턴시 10ms 수준의 매우 안정적인 추천 서비스를 유지하게 되었습니다.

Trade-off

성능 튜닝 중 ef_search 파라미터를 실시간으로 축소하려 시도했으나, 사용 중이던 OpenSearch k-NN 플러그인(v2.19)의 설계적 문제로 캐시 재구축이 강제 트리거되어 약 2분간 클러스터가 Yellow 상태로 전환되고 전체 사이트 레이턴시가 지연되는 부작용을 겪었습니다. 또한 차원을 1024차원에서 512차원으로 축소하면서 완벽한 전체 차원 비교 대비 추천 정밀도 측면에서 아주 미세한 수준의 손실이 수반되었을 것으로 추정되나, 실무 관점의 유의미한 수치 하락은 본문에 언급되지 않았습니다.

03

Key Concepts

Concept · 01

HNSW (Hierarchical Navigable Small World)

고차원 공간 내에서 최근접 벡터를 고속으로 근사 탐색하기 위해 데이터를 계층 그래프 구조로 연결해 나가는 대중적인 벡터 색인 알고리즘입니다.

  • 기존 Painless 스크립트를 통한 무차별 전수 비교 방식 대신 그래프 탐색을 최우선으로 돌게 하여 후보군을 압축하는 graph-first 방식으로 쿼리 비용을 낮췄습니다.
Concept · 02

Stored Fields & Source Filtering

OpenSearch에서 디스크 공간 상에 원본 JSON을 통째로 압축해 갖고 있는 source 필드를 읽는 단계로, 조회 과정에서 빈번한 디스크 읽기와 압축 해제 연산을 수반합니다.

  • 추천 최종 처리 과정에 포스트 ID만 필요하다는 사실을 식별하고 불필요한 stored field의 _source 압축을 푸는 연산을 스킵하도록 필터를 걸어 Hot thread 비용을 제거했습니다.
Concept · 03

MRL (Matryoshka Representation Learning)

마트료시카 인형처럼 정보의 중요도를 임베딩 벡터의 앞부분부터 순서대로 고밀도로 압축 학습해 두는 인공지능 임베딩 정렬 기법입니다.

  • Amazon Titan Text Embeddings V2가 지원하는 MRL 기법을 이용해 기존 1024차원의 절반인 앞쪽 512차원만 잘라 사용하는 방식으로 디스크 공간 및 메모리를 비약적으로 세이브했습니다.
Continue reading · same source

포스타입More from 포스타입

View all posts from 포스타입
  • "이번 달 얼마 남았지?"를 없애는 방법

    Chrome ExtensionAI AssistantPrototyping
    2주 전
  • 포스타입이 개인화 추천을 하는 방법 1부

    OpenSearchVector SearchHNSW
    3주 전
  • AI 코드 리뷰, 3번 갈아엎고 배운 것

    Claude CodeGitHub ActionsCode Review
    1개월 전
  • 10년 된 에디터 코어를 Froala에서 Lexical로 교체하기

    LexicalFroalaWYSIWYG
    1개월 전
  • 좋은 아이디어보다 더 중요한 질문

    Product DesignUX UIROI
    1개월 전

Related reads#OpenSearch

Explore #OpenSearch
라인

일본어 상품 검색 정확도 높이기: Elasticsearch + Kuromoji에서 OpenSearch + Sudachi로

#OpenSearch1주 전
포스타입

포스타입이 개인화 추천을 하는 방법 1부

#OpenSearch3주 전
미리디

AI 스타일 검색 2편 : 듀얼 벡터 검색과 OpenSearch 3.3 버전업

#OpenSearch2개월 전
우아한형제들·AWS Bedrock

우아한공방의 새로운 동료, 시스템 맥락을 가진 챗봇서비스 개발기(feat. RAG)

#OpenSearch3개월 전
라인·Kafka

기획서 없이 내재화하기: 검증 로직으로 동일함을 증명하다

#OpenSearch5개월 전

Source

포스타입
포스타입
Engineering Blog

Published · August 5, 2026

Topics

OpenSearchKNNHNSWVector SearchMatryoshka Representation