본문으로 건너뛰기
최종 수정: 에

대규모 성능 벤치마크

이 문서는 중대규모 및 억 단위 데이터셋에서 Doris ANN Index의 실제 데이터 적재 및 쿼리 성능 벤치마크를 제시합니다. 데이터 규모별 쿼리 성능을 평가하고, 단일 노드 배포에서 분산 배포로 원활하게 확장하는 방법을 이해하는 데 도움이 됩니다.

빠른 탐색​

이 문서를 읽으면 다음 질문에 답할 수 있습니다.

  • 수천만 개의 벡터를 처리할 때 단일 BE 노드로 온라인 검색을 수행할 수 있나요? 어느 정도의 QPS와 지연 시간을 기대할 수 있나요?
  • 수억 개의 벡터를 처리하다가 단일 노드의 메모리가 부족해지면, 여러 BE를 배포하여 벡터 쿼리를 계속 제공하려면 어떻게 해야 하나요?
  • 벡터 차원(768/1536)과 거리 메트릭(inner_product/l2_distance)에 따라 성능이 어떻게 달라지나요?
  • 이 테스트 결과를 어떻게 재현할 수 있나요?

테스트 환경 및 데이터셋​

배포 토폴로지​

배포 모드BE 노드 수노드별 사양적합한 데이터 규모
단일 노드116C64GB수천만 단위
분산316C64GB수억 단위

FE와 BE는 별도로 배포합니다. 모든 테스트는 VectorDBBench 도구를 사용합니다.

데이터셋 개요​

데이터셋데이터량벡터 차원거리 메트릭배포 토폴로지
Performance768D10M10M768inner_product단일 노드
Performance1536D5M5M1536inner_product단일 노드
Performance768D100M100M768l2_distance분산

단일 노드 벤치마크 (16C64GB)​

단일 노드 결과는 중대규모 데이터셋의 ANN 쿼리 성능을 평가하는 기준을 제공합니다.

데이터 적재 성능​

두 데이터셋의 데이터 적재 지표는 다음과 같습니다.

항목Performance768D10MPerformance1536D5M
벡터 차원7681536
metric_typeinner_productinner_product
데이터량10M행5M행
데이터 적재 배치 매개변수NUM_PER_BATCH=500000
--stream-load-rows-per-batch 500000
NUM_PER_BATCH=250000
--stream-load-rows-per-batch 250000
데이터 적재 시간76m41s41m
show data all56.498 GB (25.354 GB + 31.145 GB)55.223 GB (25.346 GB + 29.878 GB)

CPU 사용률:

  • Performance768D10M의 데이터 적재 중 CPU 사용률은 전반적으로 비교적 안정적이었습니다.

    Performance768D10M 데이터 적재 CPU

  • Performance1536D5M은 데이터량과 배치 크기가 더 작아 데이터 적재 단계에서 CPU 사용률이 더 자주 변동합니다.

    Performance1536D5M 데이터 적재 CPU

쿼리 성능​

단일 노드 배포는 높은 재현율을 유지하면서 수백 QPS에 도달하고 쿼리 지연 시간을 낮게 유지할 수 있습니다.

요약 지표​

데이터셋BestQPSRecall@100
Performance768D10M481.93560.9207
Performance1536D5M414.73420.9677

Performance768D10M 상세 결과 (inner_product, 10M행)​

동시 실행 수QPSP95 지연 시간P99 지연 시간평균 지연 시간
10116.20000.09320.09330.0861
40455.94850.11020.12250.0877
80481.93560.23310.26740.1658

Performance1536D5M 상세 결과 (inner_product, 5M행)​

동시 실행 수QPSP95 지연 시간P99 지연 시간평균 지연 시간
10144.32210.07640.08000.0693
40401.97320.12710.14040.0994
80414.73420.27720.32220.1925

CPU 모니터링​

콜드 쿼리 단계에서는 인덱스를 메모리에 불러와야 하므로 CPU 사용률이 비교적 낮고, 시스템은 주로 IO를 기다립니다. 핫 쿼리 단계에 진입하면 CPU 사용률이 크게 상승하여 100%에 가까워집니다.

Performance768D10M 쿼리 CPU

분산 벤치마크 (3 x 16C64GB)​

데이터 규모가 단일 16C64GB 노드의 적정 메모리 용량을 초과하면 여러 BE를 배포하여 수평 확장할 수 있습니다. 이 절에서는 Performance768D100M 데이터셋(100M행, 768차원)을 사용하여 Doris가 100M 규모에서도 온라인 벡터 쿼리 기능을 제공할 수 있음을 보여 줍니다.

팁

이 테스트는 소규모 단일 노드 테스트와 절대 수치를 일대일로 비교하기 위한 것이 아닙니다. 데이터 크기에 따라 성능이 어떻게 달라지는지 살펴보는 데 더 적합합니다.

데이터 적재 및 인덱스 구축​

노드당 메모리 한도가 64GB이므로 이 테스트에서는 벡터 양자화 압축을 사용하여 메모리 사용량을 줄입니다.

항목값
데이터셋Performance768D100M
데이터량100M행
벡터 차원768
배치 매개변수NUM_PER_BATCH=500000
--stream-load-rows-per-batch 500000
인덱스 매개변수"dim"="768", "index_type"="hnsw", "metric_type"="l2_distance", "pq_m"="384", "pq_nbits"="8", "quantizer"="pq"
인덱스 구축 시간4h5min
show data all198.809 GB (137.259 GB + 61.550 GB)

인덱스 구축 후 데이터 분포:

  • 총 3개의 버킷
  • 각 버킷에는 34개의 rowset이 있으며, 각 rowset의 크기는 약 1.99 GB
  • 각 rowset에는 6개의 segment가 포함됨

CPU 사용률: 인덱스 구축 중 CPU 사용률은 전반적으로 50% 내외에서 안정적으로 유지되었습니다. CPU가 장시간 최대 부하 상태로 동작하지 않아 리소스에 어느 정도 여유가 있었습니다.

Performance768D100M 데이터 적재 CPU

쿼리 성능​

요약 지표​

지표값
BestQPS77.6247
Recall@1000.9294

상세 결과 (l2_distance, 100M행)​

동시 실행 수QPSP95 지연 시간P99 지연 시간평균 지연 시간
1046.58360.26280.27910.2145
2075.35790.32510.35410.2651
3077.62470.52220.57660.3860
4076.63130.70890.78540.5212

CPU 모니터링​

쿼리 단계에서는 각 노드의 CPU 사용률이 높은 수준으로 유지됩니다. 이는 쿼리 워크로드가 분산 컴퓨팅 리소스를 효과적으로 활용하고 있음을 보여 줍니다.

Performance768D100M 쿼리 CPU

주요 결론​

  • 단일 노드에서 수천만 단위 처리: 수천만 개의 벡터 데이터 규모에서 Doris 단일 노드 배포는 높은 재현율(>=0.92)을 유지하면서 ANN 쿼리에 수백 QPS를 제공할 수 있습니다.
  • 분산 환경에서 수억 단위 처리: 100M 벡터 데이터셋에서는 여러 BE를 배포하고 벡터 양자화 압축을 함께 사용하여 온라인 벡터 쿼리 기능을 계속 제공할 수 있습니다(BestQPS 약 77, Recall@100 약 0.93).
  • 수평 확장성: 데이터 규모가 단일 노드의 메모리 용량을 초과하면, 분산 배포를 통해 온라인 검색 기능을 유지할 수 있습니다.

테스트 참고 사항​

이 결과를 살펴볼 때는 다음 사항을 고려하세요.

  • 거리 메트릭의 차이: 단일 노드 테스트는 inner_product를 사용하고, 분산 테스트는 l2_distance를 사용합니다. 절대 수치를 나란히 놓고 직접 비교하는 것은 권장하지 않습니다.
  • 데이터 규모 및 인덱스 매개변수의 차이: 테스트 그룹마다 데이터 규모와 인덱스 매개변수(예: 양자화 사용 여부)가 다릅니다. 이 결과는 데이터 크기에 따라 성능이 어떻게 달라지는지 살펴보는 데 더 적합합니다.
  • 콜드 쿼리 영향 보정: 단일 노드 Performance768D10M 테스트에서는 콜드 쿼리의 영향을 제거한 후 동시 실행 수 10의 결과를 보정했습니다.

재현 방법​

테스트는 VectorDBBench 도구로 실행합니다.

단일 노드 환경에서 재현​

# Performance768D10M
export NUM_PER_BATCH=500000
vectordbbench doris ... --case-type Performance768D10M --stream-load-rows-per-batch 500000

# Performance1536D5M
export NUM_PER_BATCH=250000
vectordbbench doris ... --case-type Performance1536D5M --stream-load-rows-per-batch 250000

분산 3BE 환경에서 재현​

export NUM_PER_BATCH=500000
vectordbbench doris ... --case-type Performance768D100M --stream-load-rows-per-batch 500000

자주 묻는 질문​

Q1: 단일 16C64GB 노드는 벡터를 최대 몇 개까지 저장할 수 있나요?

벡터 차원, 양자화 사용 여부, 인덱스 매개변수에 따라 달라집니다. 이 문서에서는 768차원 10M행(약 56 GB)을 단일 16C64GB 노드에서 안정적으로 처리합니다. 데이터 규모가 더 커지거나 차원이 더 높아지면 벡터 양자화를 사용하거나 여러 BE로 구성된 분산 배포를 사용하세요.

Q2: 분산 테스트의 QPS가 단일 노드 테스트보다 낮은 이유는 무엇인가요?

두 테스트 그룹은 거리 메트릭, 데이터 규모, 인덱스 매개변수가 다르므로(분산 테스트에서는 PQ 양자화 사용) 절대 수치를 직접 비교할 수 없습니다. 분산 테스트의 목적은 QPS를 극대화하는 것이 아니라 대규모 데이터에서의 확장성을 검증하는 것입니다.

Q3: 100M 데이터셋에서 양자화가 필요한 이유는 무엇인가요?

노드당 메모리 한도는 64GB이며, 100M개의 768차원 벡터는 원본 크기만으로도 이 용량을 초과합니다. PQ 양자화(pq_m=384, pq_nbits=8)는 메모리 사용량을 크게 줄여 대규모 온라인 검색을 가능하게 합니다.

Q4: 데이터 적재 시간에 인덱스 구축 시간이 포함되나요?

단일 노드 테스트에서 "데이터 적재 시간"은 전체 쓰기 시간을 의미합니다. 인덱스는 쓰기 중 또는 백그라운드 compaction 단계에서 구축됩니다. 분산 테스트에서는 대규모 환경의 인덱스 구축 비용을 평가할 수 있도록 build index time을 별도로 표시합니다.