在亿级向量规模下,传统内存索引如 HNSW 面临内存爆炸问题,而 Milvus 的 DiskANN 索引通过磁盘驻留 Vamana 图结构,仅需原始数据 1/4 内存,即可实现高召回 ANN 搜索,QPS 达数千,延迟控制在 10ms 级。这得益于其 PQ 码表内存缓存 + 磁盘邻接表设计,适用于资源受限的云原生生产环境。
DiskANN 核心是基于 Vamana 图的近似最近邻算法:构建时采样生成 PQ Pivots,对原始 float 向量(推荐 dim 16-1024)进行压缩,内存中建图后持久化磁盘(占用原始数据 1.5-2 倍)。搜索阶段,从 entry point BFS 扩展 search_list(默认 100),beamwidth 控制并发 I/O,每步 PQ 近似距离排序,取 topK。Milvus 集成时,IndexNode 从 MinIO 拉取 segment 数据(默认 2GB)本地建索引,QueryNode 加载 PQ + cache(1/8 数据)执行查询。
关键参数落地:索引构建无需额外 params,直接指定 index_type="DISKANN",metric 支持 L2/IP/COSINE。配置文件 milvus.yaml 下 diskIndex 节点调优:
maxDegree: 56(节点出度,[1,512],增大召回但索引大)searchListSize: 100(候选集,增大精度但慢)pqCodeBudgetGBRatio: 0.125(PQ 内存占比,(0,0.25])searchCacheBudgetGBRatio: 0.125(缓存占比,[0,0.3))beamWidthRatio: 4.0(I/O 并行,[1,128/CPU 核心])
前提:NVMe SSD 挂载 /var/lib/milvus/data,Ubuntu 18+,queryNode.enableDisk: true。Build 需 segment 原始数据 1.7x 内存,避免分块合并损失性能。
Hybrid 多向量过滤是 DiskANN 生产杀手锏:结合 ANN + 标量 filter(如 status=="active" and price < 100),expr 语法支持 JSON / 数组。Multi-vector 示例:Collection 定义多 float_vector 字段(如 text_emb、img_emb,dim=768),搜索时 multi_vector_search([text_q, img_q], ["text_emb", "img_emb"], weights=[0.7,0.3]),自动融合分数。过滤加速:用 partition_key(如时间 / 用户)隔离,load([partition]),仅载相关 segment,内存节省 50% 以上。动态分片:Kubernetes 部署,DataCoord 按负载 auto-shard,scale QueryNode 至 10+ pod,低延迟 serving(P99<50ms)。
低延迟工程参数清单:
- Segment 调大:
dataCoord.segment.diskSegmentMaxSize: 4GB,图算法随规模 latency 稳定。 - 搜索 params:
search_list=16+topk,nprobe=10(若 IVF 预备),batch_size=100。 - Warmup/Cache:QueryNode 启动 preload,Prometheus 监控
query_latency_p99、io_wait_time。 - GPU 加速:若需,配 GPU_CAGRA 备选,但 DiskANN CPU 优化已足(SIMD/AVX512)。
- 一致性:
consistency_level="Bounded",平衡强一致与性能。 - 回滚策略:索引失败 fallback FLAT,监控
index_build_fail_rate >0.1告警。
监控要点:
- Metrics:
milvus_query_throughput、disk_io_utilization(<80%)、cache_hit_rate >90%。 - Tools:Prometheus + Grafana dashboard,Kubernetes HPA 基于 CPU 80%/QPS auto-scale。
- 风险:高维 (>1024) I/O 增,filter 复杂降速 → 预分区 + 索引 scalar 字段。
实际部署:Helm chart milvus-operator,资源 req: CPU 4c/16GiB per QueryNode(10 亿向量)。测试:pymilvus insert 1e9 vectors,hybrid query QPS 2k,recall@10=0.95。相比 HNSW,内存降 75%,成本优化显著。
资料来源:Milvus 官方文档(milvus.io/docs/disk_index.md),DiskANN 在 Milvus 中的集成详解,以及 GitHub 仓库(github.com/milvus-io/milvus)。[1]