MMap-aktivierte Datenspeicherung
In Milvus ermöglichen memory-mapped Dateien die direkte Zuordnung von Dateiinhalten zum Speicher. Diese Funktion erhöht die Speichereffizienz, insbesondere in Situationen, in denen der verfügbare Speicher knapp, das vollständige Laden von Daten aber nicht möglich ist. Dieser Optimierungsmechanismus kann die Datenkapazität erhöhen und gleichzeitig die Leistung bis zu einer bestimmten Grenze sicherstellen; wenn die Datenmenge jedoch den Speicherplatz zu sehr übersteigt, kann die Such- und Abfrageleistung ernsthaft beeinträchtigt werden, daher sollten Sie diese Funktion je nach Bedarf ein- oder ausschalten.
Konfigurieren Sie die Speicherzuordnung
Ab Milvus 2.4 haben Sie die Möglichkeit, die statische Konfigurationsdatei anzupassen, um die Standardeinstellungen für die Speicherzuordnung des gesamten Clusters vor der Bereitstellung zu konfigurieren. Darüber hinaus haben Sie die Möglichkeit, Parameter dynamisch zu ändern, um die Speicherzuordnungseinstellungen sowohl auf Cluster- als auch auf Indexebene fein abzustimmen. Zukünftige Updates werden die Speichermapping-Funktionen um Konfigurationen auf Feldebene erweitern.
Vor dem Cluster-Einsatz: globale Konfiguration
Bevor Sie einen Cluster bereitstellen, wird mit den Einstellungen auf Clusterebene das Memory Mapping auf Ihren gesamten Cluster angewendet. Dadurch wird sichergestellt, dass alle neuen Objekte automatisch mit diesen Konfigurationen übereinstimmen. Es ist wichtig zu beachten, dass eine Änderung dieser Einstellungen einen Neustart des Clusters erfordert, um wirksam zu werden.
Um die Einstellungen für das Memory Mapping Ihres Clusters anzupassen, bearbeiten Sie die Datei configs/milvus.yaml
. In dieser Datei können Sie angeben, ob das Memory Mapping standardmäßig aktiviert werden soll, und den Verzeichnispfad für die Speicherung der Memory-Mapping-Dateien festlegen. Wenn der Pfad (mmapDirPath
) nicht angegeben wird, speichert das System speicherzugeordnete Dateien standardmäßig in {localStorage.path}/mmap
. Weitere Informationen finden Sie unter Konfigurationen für den lokalen Speicher.
# 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
....
Während des Clusterbetriebs: dynamische Konfiguration
Während der Cluster-Laufzeit können Sie die Einstellungen für das Memory Mapping entweder auf der Ebene der Sammlung oder des Index dynamisch anpassen.
Auf der Sammlungsebene wird das Memory Mapping auf alle nicht indizierten Rohdaten innerhalb einer Sammlung angewendet, mit Ausnahme von Primärschlüsseln, Zeitstempeln und Zeilen-IDs. Dieser Ansatz eignet sich besonders für die umfassende Verwaltung großer Datensätze.
Für dynamische Anpassungen der Speicherzuordnungseinstellungen innerhalb einer Sammlung verwenden Sie die Methode set_properties()
. Hier können Sie mmap.enabled
je nach Bedarf zwischen True
oder False
hin- und herschalten.
# 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})
Bei Einstellungen auf Indexebene kann die Speicherzuordnung speziell auf Vektorindizes angewendet werden, ohne andere Datentypen zu beeinträchtigen. Diese Funktion ist von unschätzbarem Wert für Sammlungen, die eine optimierte Leistung für Vektorsuchen erfordern.
Um das Memory Mapping für einen Index innerhalb einer Sammlung zu aktivieren oder zu deaktivieren, rufen Sie die Methode alter_index()
auf, geben den Namen des Zielindex in index_name
an und setzen mmap.enabled
auf True
oder False
.
collection.alter_index(
index_name="vector_index", # Replace with your vector index name
extra_params={"mmap.enabled": True} # Enable memory mapping for index
)
Anpassen des Speicherpfads in verschiedenen Bereitstellungen
Memory-mapped Dateien werden standardmäßig im Verzeichnis /mmap
innerhalb von localStorage.path
abgelegt. Hier erfahren Sie, wie Sie diese Einstellung für verschiedene Bereitstellungsmethoden anpassen können:
- Für Milvus, das mit Helm Chart installiert wurde:
# 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
- Für Milvus, das mit Milvus Operator installiert wurde:
# patch.yaml
spec:
config:
queryNode:
mmap:
mmapEnabled: true
mmapDirPath: any/valid/path
kubectl patch milvus <milvus-name> --patch-file patch.yaml
- Für Milvus, das mit Docker installiert wurde:
# A new installation script is provided to enable mmap-related settings.
Limits
Memory Mapping kann nicht für eine geladene Sammlung aktiviert werden. Stellen Sie sicher, dass die Sammlung freigegeben wurde, bevor Sie Memory Mapping aktivieren.
Memory Mapping wird für DiskANN- oder GPU-Klasse-Indizes nicht unterstützt.
FAQ
In welchen Szenarien ist es empfehlenswert, Memory Mapping zu aktivieren? Was sind die Nachteile nach der Aktivierung dieser Funktion?
Memory Mapping wird empfohlen, wenn der Speicher begrenzt ist oder wenn die Leistungsanforderungen moderat sind. Die Aktivierung dieser Funktion erhöht die Kapazität für das Laden von Daten. Bei einer Konfiguration mit 2 CPUs und 8 GB Arbeitsspeicher können durch die Aktivierung des Memory Mappings beispielsweise bis zu viermal mehr Daten geladen werden, als wenn die Funktion nicht aktiviert ist. Die Auswirkungen auf die Leistung sind unterschiedlich:
Bei ausreichendem Arbeitsspeicher ist die erwartete Leistung ähnlich wie bei der Verwendung von reinem Arbeitsspeicher.
Bei unzureichendem Speicher kann sich die erwartete Leistung verschlechtern.
Welche Beziehung besteht zwischen Konfigurationen auf Sammlungs- und Indexebene?
Collection-Level und Index-Level sind keine allumfassenden Beziehungen. Collection-Level steuert, ob die Originaldaten mmap-fähig sind oder nicht, während Index-Level nur für Vektorindizes gilt.
Gibt es einen empfohlenen Indextyp für Memory Mapping?
Ja, HNSW wird für die Aktivierung von mmap empfohlen. Wir haben HNSW-, IVF_FLAT- und IVF_PQ/SQ-Indizes getestet. Die Leistung der IVF-Indizes ist stark gesunken, während der Leistungsabfall durch die Aktivierung von mmap für HNSW-Indizes noch im Rahmen der Erwartungen liegt.
Welche Art von lokalem Speicher ist für das Memory Mapping erforderlich?
Eine hochwertige Festplatte erhöht die Leistung, wobei NVMe-Laufwerke die bevorzugte Option sind.
Können skalare Daten einem Speicher-Mapping unterzogen werden?
Memory Mapping kann auf skalare Daten angewendet werden, nicht aber auf Indizes, die auf skalaren Feldern aufbauen.
Wie wird die Priorität für Speicherzuordnungskonfigurationen über verschiedene Ebenen hinweg bestimmt?
Wenn in Milvus explizit Speicher-Mapping-Konfigurationen über mehrere Ebenen hinweg definiert werden, haben Konfigurationen auf Index- und Sammlungsebene die höchste Priorität, gefolgt von Konfigurationen auf Clusterebene.
Was passiert, wenn ich ein Upgrade von Milvus 2.3 durchführe und den Verzeichnispfad für das Memory Mapping konfiguriert habe?
Wenn Sie ein Upgrade von Milvus 2.3 durchführen und den Speicherabbildungsverzeichnispfad (
mmapDirPath
) konfiguriert haben, wird Ihre Konfiguration beibehalten, und die Standardeinstellung für aktiviertes Speicherabbild (mmapEnabled
) lautettrue
. Es ist wichtig, die Metadaten zu migrieren, um die Konfiguration Ihrer bestehenden Memory-Mapping-Dateien zu synchronisieren. Weitere Einzelheiten finden Sie unter Migrieren der Metadaten.