驅逐Compatible with Milvus 2.6.4+
Eviction 管理 Milvus 中每個 QueryNode 的快取資源。啟用後,一旦達到資源臨界值,它會自動移除快取資料,以確保穩定的效能,並防止記憶體或磁碟耗盡。
驅逐使用最近最少使用 (LRU)政策來回收快取空間。元資料永遠都會被快取而不會被驅逐,因為元資料對於查詢規劃來說是不可或缺的,而且通常都很小。
驅逐必須明確啟用。如果沒有設定,快取資料會繼續累積,直到資源耗盡為止。
遷出類型
Milvus 支援兩種互補的驅逐模式(sync和async),兩種模式共同作用,以達到最佳的資源管理:
方面 |
同步驅逐 |
同步驅逐 |
|---|---|---|
觸發 |
在查詢或搜尋期間,當記憶體或磁碟使用量超過內部限制時發生。 |
當使用量超過高水準或快取資料達到其生存時間 (TTL) 時,由背景線程觸發。 |
行為 |
查詢或搜尋作業在 QueryNode 回收快取記憶體空間時暫停。驅逐會繼續,直到使用量降到低水準以下或發生超時。如果達到超時且無法回收足夠的資料,查詢或搜尋可能會失敗。 |
定期在背景執行,當使用量超過高水準或資料根據 TTL 過期時,主動驅逐快取資料。驅逐會持續,直到使用量降到低水準以下為止。不會攔截查詢。 |
最適合 |
可容忍高峰使用期間短暫延遲或暫停的工作負載。當異步驅逐無法快速回收空間時非常有用。 |
對延遲敏感的工作負載,需要流暢且可預測的查詢效能。適用於主動式資源管理。 |
注意事項 |
如果可驅逐的資料不足,可能會導致短暫的查詢延遲或逾時。 |
需要適當調整高低水印和 TTL 設定。來自背景線程的輕微開銷。 |
設定 |
透過 |
透過 |
建議設定:
兩種驅逐模式都可同時啟用,以達到最佳平衡,前提是您的工作負載可受惠於分層儲存,並能忍受與驅逐相關的擷取延遲。
對於效能測試或延遲關鍵的情境,可考慮完全停用驅逐,以避免驅逐後的網路擷取開銷。
對於可驅逐的欄位和索引,驅逐單元與載入粒度相匹配 - 標量/向量欄位會按小塊驅逐,而標量/向量索引則會按區段驅逐。
啟用驅逐
在milvus.yaml 的queryNode.segcore.tieredStorage 下設定驅逐:
queryNode:
segcore:
tieredStorage:
evictionEnabled: true # Enables synchronous eviction
backgroundEvictionEnabled: true # Enables background (asynchronous) eviction
參數 |
類型 |
值 |
說明 |
建議用例 |
|---|---|---|---|---|
|
bool |
|
驅逐策略的主開關。預設為 |
在分層儲存中永遠設定為 |
|
bool |
|
在背景中異步執行驅逐。需要 |
使用 |
設定水印
水印定義記憶體和磁碟的快取驅逐開始和結束的時間。每種資源類型有兩個臨界值:
高水準:當使用量超過此值時開始驅逐。
低水印:驅逐持續,直到使用量低於此值為止。
只有啟用驅逐時,此設定才會生效。
範例 YAML:
queryNode:
segcore:
tieredStorage:
# Memory watermarks
memoryLowWatermarkRatio: 0.75 # Eviction stops below 75% memory usage
memoryHighWatermarkRatio: 0.8 # Eviction starts above 80% memory usage
# Disk watermarks
diskLowWatermarkRatio: 0.75 # Eviction stops below 75% disk usage
diskHighWatermarkRatio: 0.8 # Eviction starts above 80% disk usage
參數 |
類型 |
範圍 |
說明 |
建議用例 |
|---|---|---|---|---|
|
浮動 |
(0.0, 1.0] |
停止驅逐的記憶體使用量。 |
從 |
|
浮點數 |
(0.0, 1.0] |
非同步驅逐開始時的記憶體使用量。 |
從 |
|
浮動 |
(0.0, 1.0] |
停止驅逐的磁碟使用量。 |
從 |
|
浮動 |
(0.0, 1.0] |
啟動同步驅逐的磁碟使用量。 |
從 |
最佳做法:
請勿設定高水準或低水準超過 ~0.80,以便為 QueryNode 的靜態使用和查詢時間突發留出空間。
避免高、低水印之間有大的間隙;大間隙會延長每次驅逐週期,並增加延遲。
設定快取記憶體 TTL
快取存活時間 (TTL)會在設定的持續時間後自動移除快取資料,即使未達到資源臨界值。它與 LRU 驅逐一起工作,以防止陳舊資料無限期地佔用快取記憶體。
Cache TTL 需要backgroundEvictionEnabled: true ,因為它在同一個背景線程上執行。
YAML 示例:
queryNode:
segcore:
tieredStorage:
evictionEnabled: true
backgroundEvictionEnabled: true
# Set the cache expiration time to 604,800 seconds (7 days),
# and expired caches will be cleaned up by a background thread.
cacheTtl: 604800
參數 |
類型 |
單位 |
說明 |
建議用例 |
|---|---|---|---|---|
|
整數 |
秒 |
快取資料過期前的持續時間。過期的項目會在背景中移除。 |
對於高度動態的資料,請使用較短的 TTL (小時);對於穩定的資料集,請使用較長的 TTL (天)。設定 0 可停用以時間為基礎的過期。 |