본문 바로가기
WIKI 기술 지식 베이스

성능 FAQ (Performance FAQ)

원문 보기 위키 갱신

Milvus 사용 중 자주 묻는 성능 관련 질문들을 모아서 답변해 드리는 문서예요. IVF 인덱스의 nlist/nprobe 설정부터 데이터 삽입과 검색을 동시에 할 때의 영향, VARCHAR 필드 인덱싱 효과까지 다뤄요.

출처: Milvus 문서

본문

IVF 인덱스에서 nlist와 nprobe는 어떻게 설정하나요?

nlist 설정은 시나리오에 따라 달라져요. 경험상 권장하는 nlist 값은 4 × sqrt(n)인데, 여기서 n은 세그먼트 안의 총 엔티티 수예요.

각 세그먼트의 크기는 datacoord.segment.maxSize 파라미터로 결정되는데, 기본값은 512 MB예요. 세그먼트 안의 총 엔티티 수 n은 datacoord.segment.maxSize를 엔티티 하나의 크기로 나눠 대략 계산할 수 있어요.

nprobe 설정은 데이터셋과 시나리오에 따라 달라지고, 정확도와 쿼리 성능 사이의 트레이드오프가 있어요. 반복 실험을 통해 이상적인 값을 찾는 것을 권장해요.

아래 차트는 sift50m 데이터셋과 IVF_SQ8 인덱스에서 실행한 테스트 결과로, 서로 다른 nlist/nprobe 조합의 리콜과 쿼리 성능을 비교한 거예요.

Accuracy test Performance test

작은 데이터셋에서 쿼리가 더 오래 걸리는 이유는 무엇인가요?

쿼리 연산은 세그먼트 단위로 수행돼요. 인덱스는 세그먼트를 쿼리하는 데 걸리는 시간을 줄여 줘요. 만약 세그먼트가 인덱싱되지 않았다면 Milvus는 원본 데이터에 대해 brute-force 검색을 수행하게 되고, 쿼리 시간이 급격히 늘어나요.

그래서 작은 데이터셋(컬렉션)은 인덱스가 구축되지 않았기 때문에 보통 쿼리하는 데 더 오래 걸려요. 세그먼트의 크기가 rootCoord.minSegmentSizeToEnableindex가 정한 인덱스 구축 임계값에 도달하지 못했기 때문이에요. create_index()를 호출하면 임계값에 도달했지만 아직 자동 인덱싱되지 않은 세그먼트를 강제로 인덱싱해서 쿼리 성능을 크게 개선할 수 있어요.

CPU 사용량에 영향을 주는 요인은 무엇인가요?

Milvus가 인덱스를 구축하거나 쿼리를 실행할 때 CPU 사용량이 증가해요. 일반적으로 인덱스 구축은 CPU 집약적이지만, 예외적으로 Annoy는 단일 스레드에서 실행돼요.

쿼리를 실행할 때 CPU 사용량은 nq와 nprobe의 영향을 받아요. nq와 nprobe가 작으면 동시성이 낮아져 CPU 사용량도 낮게 유지돼요.

데이터 삽입과 검색을 동시에 하면 쿼리 성능에 영향이 있나요?

삽입 연산은 CPU 집약적이지 않아요. 하지만 새 세그먼트가 인덱스 구축 임계값에 도달하지 못했을 수 있어서 Milvus는 brute-force 검색을 수행하게 되고, 쿼리 성능에 큰 영향을 줄 수 있어요.

rootcoord.minSegmentSizeToEnableIndex 파라미터가 세그먼트의 인덱스 구축 임계값을 결정하며 기본값은 1024행이에요. 자세한 내용은 System Configuration을 참고하세요.

VARCHAR 필드를 인덱싱하면 삭제 속도를 높일 수 있나요?

VARCHAR 필드를 인덱싱하면 "Delete By Expression" 연산을 빠르게 할 수 있지만, 특정 조건에서만 그래요.

  • INVERTED Index: 비기본 키 VARCHAR 필드의 IN 또는 == 표현식에 도움이 돼요.
  • Trie Index: 비기본 VARCHAR 필드의 접두사 쿼리(예: LIKE prefix%)에 도움이 돼요.

하지만 VARCHAR 필드를 인덱싱해도 다음 경우에는 속도가 빨라지지 않아요.

  • ID로 삭제: VARCHAR 필드가 기본 키인 경우
  • 관련 없는 표현식: VARCHAR 필드가 삭제 표현식에 포함되지 않은 경우

아직도 질문이 있다면?

다음을 활용할 수 있어요.

  • Milvus GitHub에서 질문하고 아이디어를 공유하고 다른 사람을 도와주세요.
  • Discord 커뮤니티에 참여해 지원을 받고 오픈소스 커뮤니티와 교류해 보세요.

더 알아보기 (Learn more)