支援 MMap 的資料儲存
在 Milvus 中,記憶體映射檔案允許直接將檔案內容映射到記憶體中。此功能增強了記憶體效率,特別是在可用記憶體稀少但完整資料載入不可行的情況下。此最佳化機制可增加資料容量,同時在一定限度內確保效能;但當資料量超出記憶體太多時,搜尋和查詢效能可能會嚴重下降,因此請視情況選擇開啟或關閉此功能。
配置記憶體映射
從 Milvus 2.4 開始,您可以靈活調整靜態配置檔,在部署前為整個集群配置預設的記憶體映射設定。此外,您也可以選擇動態變更參數,在群集和索引層級微調記憶體映射設定。展望未來,未來的更新將擴展記憶體對應功能,以包含欄位層級的設定。
群集部署前:全局配置
在部署群集之前,群集層級設定會在整個群集套用記憶體對應。這可確保所有新物件都會自動遵循這些組態。值得注意的是,修改這些設定需要重新啟動群集才能生效。
若要調整群集的記憶體映射設定,請編輯configs/milvus.yaml
檔案。在此檔案中,您可以指定是否預設啟用記憶體映射,並決定儲存記憶體映射檔案的目錄路徑。如果未指定路徑 (mmapDirPath
),系統預設會將記憶體映射檔案儲存於{localStorage.path}/mmap
。如需詳細資訊,請參閱本機儲存相關組態。
# 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;
# 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
....
此外,只有向量索引和向量資料的 mmap 可以單獨為一個集合開啟或關閉,其他集合則無法開啟或關閉。
相容性:如果原始配置queryNode.mmap.mmapEnabled
設定為true
,此時新加入的配置將設定為true
。如果queryNode.mmap.mmapEnabled
設定為false
,如果新增的組態設定為true
,最終值將是true
。
群集運行期間:動態配置
在群集運行期間,您可以在集合或索引層級動態調整記憶體映射設定。
在集合層級,記憶體對應會套用至集合內所有未索引的原始資料,但不包括主索引鍵、時間戳記和行 ID。這種方法特別適用於大型資料集的全面管理。
若要動態調整資料集中的記憶體映射設定,請使用set_properties()
方法。在此,您可以根據需要在True
或False
之間切換mmap.enabled
。
# 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
方法來調整資料集中的記憶體對應設定。在此,您可以根據需要在True
或False
之間切換mmap_enabled
。
schema = MilvusClient.create_schema()
schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, mmap_enabled=True)
對於索引層級設定,記憶體映射可特別套用至向量索引,而不會影響其他資料類型。此功能對於需要優化向量搜尋效能的資料集來說非常寶貴。
若要啟用或停用集合內索引的記憶體映射,請呼叫alter_index()
方法,在index_name
中指定目標索引名稱,並將mmap.enabled
設為True
或False
。
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:
# 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:
# patch.yaml
spec:
config:
queryNode:
mmap:
mmapEnabled: true
mmapDirPath: any/valid/path
kubectl patch milvus <milvus-name> --patch-file patch.yaml
- 適用於使用 Docker 安裝的 Milvus:
# A new installation script is provided to enable mmap-related settings.
限制
記憶體映射無法針對已載入的集合啟用,請在啟用記憶體映射前確認該集合已釋放。
DiskANN 或 GPU 類索引不支援記憶體映射。
常見問題
建議在哪些情況下啟用記憶體映射?啟用此功能後會有哪些取捨?
當記憶體有限或效能需求適中時,建議啟用記憶體映射。啟用此功能可增加資料載入的容量。例如,在 2 個 CPU 和 8 GB 記憶體的組態下,啟用記憶體映射可讓載入的資料比未啟用多 4 倍。對效能的影響各有不同:
在記憶體充足的情況下,預期效能與僅使用記憶體的效能相似。
記憶體不足時,預期效能可能會降低。
集合層級和索引層級配置之間的關係是什麼?
集合層級和索引層級不是包含的關係,集合層級控制原始資料是否啟用 mmap,而索引層級只適用於向量索引。
有沒有任何適用於記憶體映射的推薦索引類型?
有,建議使用 HNSW 來啟用 mmap。我們之前測試過 HNSW、IVF_FLAT、IVF_PQ/SQ 系列索引,IVF 系列索引的效能下降很嚴重,而 HNSW 索引開啟 mmap 後效能下降仍在預期範圍內。
記憶體映射需要什麼樣的本機儲存空間?
高品質的磁碟可提升效能,NVMe 硬碟是首選。
標量資料可以進行記憶體映射嗎?
記憶體映射可應用於標量資料,但不適用於建立在標量欄位上的索引。
不同層級的記憶體映射配置的優先順序如何決定?
在 Milvus 中,當記憶體映射配置在多個層級中明確定義時,索引層級和集合層級配置共享最高優先級,然後是群集層級配置。
如果我從 Milvus 2.3 升級,並配置了記憶體映射目錄路徑,會發生什麼?
如果您從 Milvus 2.3 升級,並已配置記憶體映射目錄路徑 (
mmapDirPath
),您的配置將被保留,啟用記憶體映射的預設設定 (mmapEnabled
) 將為true
。遷移元資料以同步您現有記憶體映射檔案的設定是很重要的。如需詳細資訊,請參閱遷移元資料。