故障诊断
概述
该页面主要描述使用 Milvus 时会遇到的常见问题。这些问题主要分为以下几类:
服务启动问题
服务启动时发生的故障,通常会导致服务无法正常启动。您可以通过以下命令来查看相关错误信息:
$ docker logs <milvus container id>
服务运行问题
服务运行期间发生的故障有可能导致服务瘫痪。遇到此类故障时,请先检查系统版本和所使用的客户端版本是否兼容,然后再查询相关错误信息。服务运行的错误信息将被记录在
/home/$USER/milvus/logs
文件中。API 问题
通过 API 使用 Milvus 时发生的故障。这类错误信息将实时返回给客户端。
对于您无法自己解决的问题,您可以:
加入我们的 Slack 社区,提问并与 Milvus 团队及其它社区成员交流讨论。
在 GitHub 上 创建 issue,详细描述您的问题。
向量搜索故障诊断
有多种 Milvus 操作都会对向量搜索造成影响。如果您在向量搜索操作中遇到运行阻塞或性能下降等问题,请检查是不是下面的一种或多种操作对搜索操作造成了影响:
Insert
操作
- 对于同一客户端,插入操作是阻塞操作,只有当插入操作完成后才能调用搜索接口。
- 对于多客户端,假设客户端 A 频繁进行插入操作,客户端 B 同时执行搜索操作,Milvus 服务处理这些插入数据时会消耗部分 CPU 资源,因此会影响客户端 B 的搜索性能。
- 插入数据后为了保证数据落盘,有时会调用
flush
操作,该操作是阻塞操作,会产生少量的 CPU 消耗以及磁盘 IO,对其他客户端搜索的性能影响较小。 - 对于插入操作引起的后台建索引行为也会严重影响搜索操作。
索引建立操作
索引建立方式
Milvus 包括两种索引建立方式:
后台自动建索引:
- 调用
create_collection
建立一个空 collection; - 调用
create_index
给该 collection 指定一种索引(除 IDMAP 之外的任意一种索引); - 多次调用
insert
插入数据,每当累计插入数据量达到index_file_size
设定的大小,后台就会自动给新增的index_file_size
大小的数据块建立索引。
- 调用
手动调用
create_index
建索引:- 调用
create_collection
建立一个空 collection; - 多次调用
insert
插入数据,这时由于没有给 collection 指定索引,所以不会在后台自动建立索引; - 手动调用
create_index
对整个 collection 的全部数据块建立索引,就算数据块的大小没有达到index_file_size
设定的值,也会强制建索引。
- 调用
自动建立索引
- (仅支持 CPU 的 Milvus) 建索引和搜索都需要全部占用 CPU 资源,因此在后台建索引的时候,搜索任务会等待索引完成后才能执行。
- (支持 GPU 的 Milvus) 如果您使用 GPU 建索引,其他的 GPU 或者 CPU 仍能执行搜索任务,因此建立索引和搜索可以异步进行。
手动建立索引
- (仅支持 CPU 的 Milvus) 由于
create_index
是阻塞操作,同一个客户端上要等该操作完成后才能搜索。如果使用多客户端,另一个客户端可以执行搜索,但由于建索引和搜索都需要全部占用 CPU 资源,因此在 Milvus 在运行建索引的时候,搜索任务会等待索引完成后才能执行。 - (支持 GPU 的 Milvus) 由于
create_index
是阻塞操作,同一个客户端上要等该操作完成后才能搜索,建索引任务只使用一个 GPU。如果使用多客户端,另一个客户端可以使用其他的 GPU 或者 CPU 执行搜索任务,因此建立索引和搜索可以异步进行。
compact
操作
delete_by_id
操作只是记录了一个被删向量的 id 列表,并没有真正从数据文件里把向量数据删除,为了清理掉被删向量,需要调用 compact
操作。compact
操作是很消耗资源的操作。compact
操作从原数据文件中提取出未被删除的向量数据,重新生成一份数据文件,如果该数据文件已经建好了索引,则把该索引文件删除,并重建一个新的索引文件。compact
是阻塞操作,由于既有大量磁盘 I/O 也可能连带有建索引的操作,因此会严重影响其他客户端的搜索性能。
preload_collection
操作
preload_collection
是把 collection 的数据预加载到缓存里,其功能相当于 server_config.yaml
里的 preload_table
参数。Milvus 启动时,如果没有预加载 collection 的数据,那么对这个 collection 进行搜索之前,必须先将数据从磁盘读入缓存。对于大数据量的 collection 来说会非常慢。因此在搜索之前调用 preload_table
可以把数据先加载进磁盘,虽然总的耗时不变,但在第一次搜索时会有较好的性能。
delete_by_id
操作
该操作一般要连带调用 flush
以使得删除向量的操作生效,会产生少量的 CPU 消耗和磁盘 I/O,对其他客户端搜索的性能影响较小。
获取信息的操作
获取信息的接口包括:describe_collection
, describe_index
, get_vector_ids
, get_vector_by_id
,collection_info
等等。这些接口都是从 meta 里获取信息返回客户端,或者读取某些记录向量信息的小文件,因此比较轻量,对其他客户端搜索性能的影响很小。