跳到主要内容
版本:v2.4.x

支持 MMap 的数据存储

在 Milvus 中,内存映射文件允许将文件内容直接映射到内存中。这一功能提高了内存效率,尤其是在可用内存稀缺但完全加载数据不可行的情况下。这种优化机制可以增加数据容量,同时在一定限度内确保性能;但当数据量超出内存太多时,搜索和查询性能可能会严重下降,因此请根据情况选择打开或关闭此功能。

配置内存映射

从 Milvus 2.4 开始,您可以灵活调整静态配置文件,在部署前为整个集群配置默认内存映射设置。此外,您还可以动态更改参数,以微调集群和索引级别的内存映射设置。展望未来,未来的更新将把内存映射功能扩展到字段级配置。

集群部署前:全局配置

在部署集群之前,集群级 设置会在整个集群中应用内存映射。这将确保所有新对象自动遵循这些配置。需要注意的是,修改这些设置需要重新启动集群才能生效。

要调整集群的内存映射设置,请编辑 configs/milvus.yaml 文件。在该文件中,你可以指定是否默认启用内存映射,并确定存储内存映射文件的目录路径。如果未指定路径(mmapDirPath),系统默认将内存映射文件存储在 {localStorage.path}/mmap 中。更多信息,请参阅 本地存储相关配置

YAML
# This parameter was set in configs/milvus.yaml
...
queryNode:
mmap:
# Set memory mapping property for whole cluster
mmapEnabled: false | true
# Set memory-mapped directory path, if you leave mmapDirPath unspecified, the memory-mapped files will be stored in {localStorage.path}/ mmap by default.
mmapDirPath: any/valid/path
....

2.4.10 之后,配置 queryNode.mmap.mmapEnabled 分成以下四个独立字段,所有默认值均为 false

  • queryNode.mmap.vectorField, 控制向量数据是否为 mmap;
  • queryNode.mmap.vectorIndex 控制向量索引是否为 mmap;
  • queryNode.mmap.scalarField 控制标量数据是否为 mmap;
  • queryNode.mmap.scalarIndex 控制标量索引是否为 mmap;
YAML
# This parameter was set in configs/milvus.yaml
...
queryNode:
mmap:
vectorField: false # Enable mmap for loading vector data
vectorIndex: false # Enable mmap for loading vector index
scalarField: false # Enable mmap for loading scalar data
scalarIndex: false # Enable mmap for loading scalar index
....

此外,只能单独为某个 Collection 打开或关闭向量索引和向量数据 mmap,而不能为其他 Collection 打开或关闭。

兼容性:如果原始配置 queryNode.mmap.mmapEnabled 设置为 true,则此时新添加的配置将设置为 true。如果 queryNode.mmap.mmapEnabled 设置为 false,如果新配置设置为 true,则最终值将为 true

集群运行期间:动态配置

在集群运行期间,可以在 Collection 或索引级别动态调整内存映射设置。

Collection 层级,内存映射会应用到 Collection 内所有未索引的原始数据,不包括主键、时间戳和行 ID。这种方法特别适用于大型数据集的综合管理。

若要动态调整 Collection 中的内存映射设置,可使用 set_properties() 方法。在这里,可以根据需要在 TrueFalse 之间切换 mmap.enabled

Python
# Get existing collection
collection = Collection("test_collection") # Replace with your collection name

# Set memory mapping property to True or Flase
collection.set_properties({'mmap.enabled': True})

2.4.10 之后,可以使用 add_field 方法调整 Collection 中的内存映射设置。在这里,可以根据需要在 TrueFalse 之间切换 mmap_enabled

Python
schema = MilvusClient.create_schema()

schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)

对于 索引级 设置,内存映射可专门应用于向量索引,而不会影响其他数据类型。对于需要优化向量搜索性能的 Collection 来说,这一功能非常宝贵。

要为 Collection 中的某个索引启用或禁用内存映射,可调用 alter_index() 方法,在 index_name 中指定目标索引名称,并将 mmap.enabled 设置为 TrueFalse

Python
collection.alter_index(
index_name="vector_index", # Replace with your vector index name
extra_params={"mmap.enabled": True} # Enable memory mapping for index
)

在不同部署中自定义存储路径

内存映射文件默认存放在 localStorage.path 中的 /mmap 目录中。以下是在不同部署方法中自定义此设置的方法:

  • 对于使用 Helm Chart 安装的 Milvus:
Shell
# new-values.yaml
extraConfigFiles:
user.yaml: |+
queryNode:
mmap:
mmapEnabled: true
mmapDirPath: any/valid/path

helm upgrade <milvus-release> --reuse-values -f new-values.yaml milvus/milvus
  • 对于使用 Milvus Operator 安装的 Milvus:
Shell
# patch.yaml
spec:
config:
queryNode:
mmap:
mmapEnabled: true
mmapDirPath: any/valid/path

kubectl patch milvus <milvus-name> --patch-file patch.yaml
  • 对于使用 Docker 安装的 Milvus:
Shell
# A new installation script is provided to enable mmap-related settings.

限制

  • 无法为已加载的 Collection 启用内存映射,请确保在启用内存映射前已释放 Collection。

  • DiskANN 或 GPU 级索引不支持内存映射。

常见问题

  • 建议在哪些情况下启用内存映射?启用此功能后有哪些权衡?

内存有限或性能要求适中时,建议使用内存映射。启用此功能可提高数据加载能力。例如,在配置 2 个 CPU 和 8 GB 内存的情况下,启用内存映射可使加载的数据量比不启用内存映射多 4 倍。对性能的影响各不相同:

  • 在内存充足的情况下,预期性能与只使用内存的情况类似。

  • 如果内存不足,预期性能可能会下降。

  • Collection-level 和 Index-level 配置之间的关系是什么?

Collection-level 和 index-level 并不是包含关系,Collection-level 控制原始数据是否启用 mmap,而 index-level 仅适用于向量索引。

  • 有没有推荐用于内存映射的索引类型?

有,建议使用 HNSW 启用 mmap。我们曾测试过 HNSW、IVF_FLAT、IVF_PQ/SQ 系列索引,IVF 系列索引的性能下降严重,而 HNSW 索引启用 mmap 后的性能下降仍在预期之内。

  • 内存映射需要什么样的本地存储?

高质量的磁盘可以提高性能,NVMe 驱动器是首选。

  • 标量数据能否进行内存映射?

内存映射可应用于标量数据,但不适用于建立在标量字段上的索引。

  • 如何确定不同级别内存映射配置的优先级?

在 Milvus 中,当跨多个级别明确定义内存映射配置时,索引级和 Collect 级配置共享最高优先级,然后是集群级配置。

  • 如果我从 Milvus 2.3 升级,并配置了内存映射目录路径,会发生什么情况?

如果从 Milvus 2.3 升级并配置了内存映射目录路径 (mmapDirPath),您的配置将被保留,启用内存映射的默认设置 (mmapEnabled) 将是 true。迁移元数据对同步现有内存映射文件的配置很重要。更多详情,请参阅 迁移元数据