milvus-logo
LFAI
Home
  • Leitfaden für die Verwaltung
    • Optimierung der Speicherung

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 jedoch die Datenmenge den Speicherplatz zu sehr übersteigt, kann die Such- und Abfrageleistung ernsthaft beeinträchtigt werden, weshalb Sie diese Funktion je nach Bedarf ein- oder ausschalten sollten.

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 
....

Nach 2.4.10 teilt sich die Konfiguration queryNode.mmap.mmapEnabled in die folgenden vier separaten Felder auf, und alle Voreinstellungen sind false:

  • queryNode.mmap.vectorField, steuert, ob Vektordaten mmap sind;
  • queryNode.mmap.vectorIndex, steuert, ob der Vektorindex mmap ist;
  • queryNode.mmap.scalarField, steuert, ob skalare Daten mmap sind;
  • queryNode.mmap.scalarIndex, steuert, ob der Skalarindex mmap ist;
# 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
....

Darüber hinaus können nur Vektorindex und Vektordaten mmap für eine einzelne Sammlung ein- und ausgeschaltet werden, nicht aber für andere.

Kompatibilität: Wenn die ursprüngliche Konfiguration queryNode.mmap.mmapEnabled auf true eingestellt ist, wird die neu hinzugefügte Konfiguration zu diesem Zeitpunkt auf true eingestellt. Wenn queryNode.mmap.mmapEnabled auf false eingestellt ist, wird die neue Konfiguration auf true eingestellt, der endgültige Wert ist true.

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})

Nach 2.4.10 verwenden Sie für die Speicherzuordnungseinstellungen innerhalb einer Sammlung die Methode add_field. Hier können Sie mmap_enabled je nach Bedarf zwischen True oder False hin- und herschalten.

schema = MilvusClient.create_schema()

schema.add_field(field_name="embedding", datatype=DataType.FLOAT_VECTOR, dim=768, 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 basieren.

  • 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 das aktivierte Speicherabbild (mmapEnabled) lautet true. 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.

Übersetzt vonDeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

War diese Seite hilfreich?