性能 FAQ(performance_faq)

性能常见问题

如何为IVF索引设置nlistnprobe

设置nlist取决于具体情况。一般而言,建议将nlist的值设置为4×sqrt(n),其中n是一个段中实体的总数。

每个分段的大小由datacoord.segment.maxSize参数确定,默认设置为512 MB。一个分段中的实体总数可以通过将datacoord.segment.maxSize除以每个实体的大小来估计。

设置nprobe是特定数据集和场景的,需要在准确性和查询性能之间进行权衡。我们建议通过反复实验找到理想值。

以下图表是在sift50m数据集和IVF_SQ8索引上运行的测试结果,比较了不同的nlist/nprobe对的召回率和查询性能。

Accuracy test (opens in a new tab)

Accuracy test.

Performance test (opens in a new tab)

Performance test.

为什么有时查询较小的数据集需要更长时间?

查询操作是在段上进行的,索引可减少查询段所需的时间。如果某个段尚未被索引,Milvus将在原始数据上进行暴力搜索,从而大大增加查询时间。

因此,通常在小数据集(集合)上查询需要更长时间,因为它尚未构建索引,其段的大小尚未达到rootCoord.minSegmentSizeToEnableindex设置的索引构建阈值。调用create_index()来强制Milvus索引已达到阈值但尚未自动索引的段,从而显著提高查询性能。

What factors impact CPU usage?

CPU的使用率会在建立索引或运行查询时增加。一般来说,除了使用Annoy(只运行在单个线程上),索引构建是CPU密集型的。

运行查询时,CPU使用率受nqnprobe的影响。当nqnprobe较小时,并发性较低,CPU使用率保持较低。

同时插入数据和搜索会影响查询性能吗?

插入操作并不占用CPU资源。但是,由于新的段可能尚未达到索引构建的阈值,Milvus会采用暴力搜索——这会显著影响查询性能。

rootcoord.minSegmentSizeToEnableIndex参数确定了段的索引构建阈值,默认设置为1024行。请参阅系统配置获取更多信息。

还有问题吗?

你可以: