13518219792

建站动态

根据您的个性需求进行定制 先人一步 抢占小程序红利时代

Milvus探究与压测分析

Milvus探究与压测分析

作者:linggong 2022-11-25 18:49:11

云计算

云原生 通过压测,我们发现某场景下存在milvus的性能提升不上去的问题,并给出基于该场景的解决方案,社区反馈给milvus官方。以下为milvus的设计与压测中遇到的一些问题与解决或跟进方案。

1、背景

最近用到了向量搜索,所以要对milvus进行压测。同时为了更加深入分析压测中遇到的问题,也对milvus的部分源码与文档进行了走读。其中遇到了一些问题与疑惑,我们也直接与milvus社区或开源贡献者沟通。

通过压测,我们发现某场景下存在milvus的性能提升不上去的问题,并给出基于该场景的解决方案,社区反馈给milvus官方。

以下为milvus的设计与压测中遇到的一些问题与解决或跟进方案。

2、向量搜索与milvus

2.1 向量搜索

向量搜索简称ANNS,英文全名:Approximate Nearest Neighbor Search 。大致概念是从一堆向量中找出与某个目标向量距离最近的N个向量。最简单粗暴的搜索方式是暴力搜索,但是可以通过扩增索引的方式加快搜索速度,提升大规模查询的QPS。

当前的向量索引可以分为四大类:基于树的索引、基于图的索引、基于哈希的索引、基于量化的索引。其中图思路由于较高的召回率、较好的性能和较多的后期优化思路,脱颖而出。

2.2 milvus

milvus(主要针对2.0以上版本)是一款元原生向量数据库,支持向量的插入,ANNS搜索等。Milvus能够很好地应对海量向量数据,它集成了目前在向量相似性计算领域比较知名的几个开源库(Faiss, SPTAG等),通过对数据和硬件算力的合理调度,以获得最优的搜索性能。

官网:https://milvus.io/

3、milvus架构介绍

3.1 milvus的数据集概念

数据集概念:

官网给出数据集读取写入例子:https://milvus.io/docs/v2.1.x/example_code.md

数据集查询工具:https://github.com/milvus-io/birdwatcher

以下利用birdwatcher展示collection与segment信息:

以上输出结果,对该工具进行了改造。

具体一个segment在etcd中所有的信息:

3.2 milvus架构图

milvus官网给出的架构图如下:

按照分组又可以分为以下几大类别:

简单介绍下以上各个微服务的功能:

以上可以看出微服务比较多,微服务之间的通信方式主要有以下几种:

4、milvus向量写入与读取链路

4.1 milvus向量写入路径

3.2 milvus向量搜索路径

以下当前最新版本2.1.4的读流程 ,与网上的读流程版本链路不同,应该是做了改造。

5、milvus压测中的问题分析

压测版本:milvus-2.1.4

数据维度:512dim

索引:

5.1 压测结果

向量个数

索引

规格

QPS

99%耗时

十万*512dim

FLAT

2*(8cpu*16Gi)

880

82ms

十万*512dim

FLAT

2*(16cpu*16Gi)

1489

62ms

百万*512dim

FLAT

2*(16cpu*16Gi)

240

200ms

千万*512dim

FLAT

2*(16CPU*32Gi)

20

1.98s

5.2  压测中遇到的问题与分析

QPS与CPU使用率压不上去,CPU很难超过50%。(已经优化)
现象描述:
压测过程中,发现QPS始终压不上去,仔细排查发现查询节点的cpu使用率上不去,导致qps也上不去。

规格

scheduler.cpuRation

qps

2*(8cpu*16Gi)

20

385

2*(8cpu*16Gi)

100

768

2*(8cpu*16Gi)

120

913

2*(8cpu*16Gi)

140

880

该参数主要用来评估一个search task的cpu使用情况,该参数越高,预示该task使用cpu越多,调度的时候,多个task去查询的并行数量就会少一些。现在怀疑并行task太多,并不会达到很高的QPS。

milvus并没有公开该参数配置,已经通过issue/enhancement提给milvus社区中了,后续版本应该会有所优化。

扩容查询节点后,短时间内segments没有自动均衡(怀疑,跟进中)
现象描述:
持续大规模写了很久后,会导致大量growing segment,导致查询性能下降(跟进中)。

跟milvus社区维护人员咨询过该问题,后续还要持续跟进,找出原因并改进。

版本升级后,原有数据不兼容(已有方案)。

版本升级后,原有数据不兼容(已有方案)。
千万级别数据,压测QPS不能达到预期(跟进中)

比如以下是使用两个 32核 16G:

不要通过deployment扩容缩容,尽量通过helm去操作

所以官网也给出建议尽量通过helm去平滑扩容。

6、总结

经过压测,milvus是可以满足我们当前业务场景的。以上压测中的一些遗留问题,我们还在跟进中,比如:大量growing segment问题,节点扩增等问题。这些问题并不是100%出现的,有些是在我们极端测试条件下才出现的。后续我们还会持续测试,定位原因,并反馈给社区进一步优化。以上压测的索引采用的是FLAT,官方建议我们采用图索引可以取得更高性能。由于我们当前的业务场景要用到FLAT索引,所以当前先基于FLAT索引去压测。后续会用到图索引,也会进行压测。

通过对milvus的压测,顺便了解并学习下milvus的设计。总体来说milvus是一款优秀的云原生向量数据库,它的一些设计理念还是比较先进的,把向量搜索与k8s结合在一起,通过简单的查询节点扩增便可以线性提升向量搜索的性能。对于一款分布式数据库,它实现了读写分离,存算分离。官网给出的文档也比较丰富,工具也比较多,比如:attu,birdwatcher等。


网站栏目:Milvus探究与压测分析
分享网址:http://cdbrznjsb.com/article/dppgjdg.html

其他资讯

让你的专属顾问为你服务