In dieser Anleitung erfahren Sie, wie Sie die Leistung des Cloud Storage FUSE-CSI-Treibers in Google Kubernetes Engine (GKE) optimieren. Eine vereinfachte, automatisierte Möglichkeit zur Optimierung der Cloud Storage FUSE-Leistung für KI/ML-Arbeitslasten finden Sie unter Leistungsoptimierung mit Cloud Storage FUSE-Profilen automatisieren. Die manuellen Schritte in diesem Dokument sind für fortgeschrittene Nutzer oder für benutzerdefinierte Anforderungen gedacht, die nicht von den Profilen abgedeckt werden.
Cloud Storage FUSE bietet zwar Flexibilität und Skalierbarkeit, aber eine sorgfältige Konfiguration und Optimierung sind entscheidend, um eine optimale Leistung zu erzielen. Die Leistung von Cloud Storage FUSE kann sich in Bezug auf Latenz, Durchsatz und Konsistenz von einem POSIX-Dateisystem unterscheiden. Ziel der Optimierung ist es, den Aufwand für Metadatenvorgänge zu minimieren und die Effizienz des Datenzugriffs zu maximieren. Wenn Sie KI-/ML-Anwendungen ausführen, die Daten in Cloud Storage-Buckets verwenden, kann die Optimierung des CSI-Treibers zu schnelleren Trainings- und Inferenzzeiten für Ihre KI-/ML-Anwendungen führen.
Dieser Leitfaden richtet sich an Entwickler und Machine-Learning-Ingenieure, die die Leistung ihrer Anwendungen verbessern möchten, die auf Daten zugreifen, die in Cloud Storage-Buckets gespeichert sind.
Bevor Sie diese Seite lesen, sollten Sie sich mit den Grundlagen von Cloud Storage, Kubernetes und dem CSI-Treiber für Cloud Storage FUSE vertraut machen. Prüfen Sie auch die GKE-Versionsanforderungen für bestimmte Funktionen, die Sie verwenden möchten.
Bereitstellungsoptionen konfigurieren
Der Cloud Storage FUSE CSI-Treiber unterstützt Bereitstellungsoptionen, um zu konfigurieren, wie Cloud Storage-Buckets in Ihrem lokalen Dateisystem bereitgestellt werden.
Je nach Art des verwendeten Volumes können Sie die Bereitstellungsoptionen auf folgende Weise angeben:
Sitzungsspezifisches CSI-Volume
Wenn Sie sitzungsspezifische CSI-Volumes verwenden, geben Sie die Bereitstellungsoptionen im Feld spec.volumes[n].csi.volumeAttributes.mountOptions Ihres Pod-Manifests an.
Sie müssen die Mount-Optionen als String angeben, wobei die Flags durch Kommas getrennt und ohne Leerzeichen angegeben werden müssen. Beispiel:
mountOptions: "implicit-dirs,file-cache:enable-parallel-downloads:true,file-cache:download-chunk-size-mb:3"
Nichtflüchtiges Volume
Wenn Sie nichtflüchtige Volumes verwenden, geben Sie die Bereitstellungsoptionen im Feld spec.mountOptions in Ihrem PersistentVolume-Manifest an.
Sie müssen die Mount-Optionen als Liste angeben. Beispiel:
mountOptions:
- implicit-dirs
- file-cache:enable-parallel-downloads:true
- file-cache:download-chunk-size-mb:3
Überlegungen zur Montage
Beachten Sie beim Konfigurieren von Bereitstellungen mit dem CSI-Treiber die folgenden Hinweise:
Allgemeines
- Die folgenden Flags sind nicht zulässig:
app-name,temp-dir,foreground,log-file,log-format,key-file,token-urlundreuse-token-from-url. - Cloud Storage FUSE macht die impliziten Verzeichnisse nicht standardmäßig sichtbar.
- Wenn Sie nur ein Verzeichnis im Bucket und nicht den gesamten Bucket bereitstellen möchten, übergeben Sie das Verzeichnis mit dem relativen Pfad mit dem Flag
only-dir=relative/path/to/the/bucket/root.
Sicherheit und Berechtigungen
- Wenn Sie einen Sicherheitskontext für Ihren Pod oder Container verwenden oder wenn Ihr Container-Image einen Nicht-Root-Nutzer oder eine Gruppe verwendet, müssen Sie die Bereitstellungs-Flags
uidundgidfestlegen. Außerdem müssen Sie die Bereitstellungs-Flagsfile-modeunddir-modeverwenden, um die Dateisystemberechtigungen festzulegen. Beachten Sie, dass Sie die Befehlechmod,chownoderchgrpnicht für ein Cloud Storage FUSE-Dateisystem ausführen können. Verwenden Sie daher die Bereitstellungs-Flagsuid,gid,file-modeunddir-mode, um Zugriff für einen Nutzer oder eine Gruppe von Root-Nutzern zu gewähren.
Bereitstellungsoptionen für den Linux-Kernel
- Wenn Sie die Linux-Kernel-Bereitstellungsoptionen konfigurieren müssen, können Sie die Optionen über das Flag
oübergeben. Wenn Sie beispielsweise keine direkte Ausführung von Binärdateien im bereitgestellten Dateisystem zulassen, legen Sie das Flago=noexecfest. Für jede Option ist ein separates Flag erforderlich, z. B.o=noexec,o=noatime. Nur die folgenden Optionen sind zulässig:exec,noexec,atime,noatime,sync,asyncunddirsync.
Caching konfigurieren
In diesem Abschnitt finden Sie einen Überblick über die Caching-Optionen, die mit dem CSI-Treiber für Cloud Storage FUSE verfügbar sind, um die Leistung zu verbessern.
Datei-Caching
Sie können den Cloud Storage FUSE-CSI-Treiber mit Datei-Caching verwenden, um die Leseleistung von Anwendungen zu verbessern, die kleine Dateien aus Cloud Storage-Buckets verarbeiten. Das Datei-Cache-Feature von Cloud Storage FUSE ist ein clientbasierter Lese-Cache, mit dem Dateilesevorgänge wiederholt werden können, um sie schneller von einem Cache-Speicher Ihrer Wahl bereitzustellen.
Je nach Ihren Preis-Leistungs-Anforderungen können Sie aus einer Reihe von Speicheroptionen für den Lese-Cache auswählen, darunter lokale SSD, langlebiger Blockspeicher wie Google Cloud Hyperdisk oder Persistent Disk und RAM-Laufwerk (Arbeitsspeicher).
Datei-Caching aktivieren und verwenden
Standardmäßig ist das Datei-Caching in GKE deaktiviert. Sie müssen das Datei-Caching-Opt-in mit dem CSI-Treiber für Cloud Storage FUSE auswählen.
Um das Datei-Caching zu aktivieren und zu steuern, legen Sie das Volume-Attribut
fileCacheCapacity fest oder verwenden Sie die Mount-Option file-cache:max-size-mb.
GKE verwendet standardmäßig ein emptyDir-Volume für das Dateicaching von Cloud Storage FUSE, das durch den auf dem Knoten konfigurierten sitzungsspezifischen Speicher unterstützt wird. Das kann das Bootlaufwerk sein, das an den Knoten angehängt ist, oder eine lokale SSD auf dem Knoten. Wenn Sie Lokale SSD auf dem Knoten aktivieren, verwendet GKE die lokale SSD zur Unterstützung des emptyDir-Volumes.
Sie können ein benutzerdefiniertes Lese-Cache-Volume für den Sidecar-Container konfigurieren, um das Standard-Volume emptyDir für das Datei-Caching bei Lesevorgängen zu ersetzen.
Weitere Informationen zu Best Practices für das Datei-Caching finden Sie unter Cloud Storage FUSE-Leistung.
Speicher zum Sichern des Dateicaches auswählen
Beachten Sie bei der Auswahl des Speichers für das Sichern Ihres Dateicaches Folgendes:
Für GPU- und CPU-VM-Familien, die lokale SSD unterstützen (z. B. A3-VMs), empfehlen wir die Verwendung lokaler SSDs.
- Bei A3+-VMs richtet GKE automatisch lokale SSDs ein, die von Ihren Pods verwendet werden können.
- Wenn Ihre VM-Familie keine lokalen SSDs unterstützt, verwendet GKE das Bootlaufwerk für das Caching. Der Standardlaufwerkstyp für das Bootlaufwerk in GKE ist
pd-balanced. Wenn Ihre VM-Familie lokale SSDs unterstützt, der sitzungsspezifische Speicher auf lokalen SSDs aber nicht standardmäßig aktiviert ist, können Sie lokale SSDs in Ihrem Knotenpool aktivieren. Dies gilt für Maschinenfamilien der ersten und zweiten Generation wie N1- und N2-Maschinen. Weitere Informationen finden Sie unter Cluster mit lokaler SSD erstellen.
Führen Sie den folgenden Befehl aus, um zu prüfen, ob auf Ihrem Knoten sitzungsspezifischer Speicher auf lokaler SSD aktiviert ist:
kubectl describe node <code><var>NODE_NAME</var></code> | grep "cloud.google.com/gke-ephemeral-storage-local-ssd"
Für TPU-VM-Familien, insbesondere v6+, empfehlen wir, RAM als Dateicache zu verwenden, um die beste Leistung zu erzielen, da diese VM-Instanzen über einen größeren RAM verfügen.
- Achten Sie bei der Verwendung von RAM auf Fehler aufgrund von unzureichendem Arbeitsspeicher, da diese zu Pod-Unterbrechungen führen. Cloud Storage FUSE verbraucht Arbeitsspeicher. Wenn Sie also einen Dateicache einrichten, der den Sidecar-Container nutzt, kann dies zu OOM-Fehlern führen. Um solche Szenarien zu vermeiden, passen Sie das Feld
file-cache:max-size-mbin der Konfiguration des Dateicaches auf einen kleineren Wert an. - Für andere TPU-Familien empfehlen wir die Verwendung von
pd-balancedoderpd-ssd. Der Standardlaufwerkstyp für das Bootlaufwerk in GKE istpd-balanced.
- Achten Sie bei der Verwendung von RAM auf Fehler aufgrund von unzureichendem Arbeitsspeicher, da diese zu Pod-Unterbrechungen führen. Cloud Storage FUSE verbraucht Arbeitsspeicher. Wenn Sie also einen Dateicache einrichten, der den Sidecar-Container nutzt, kann dies zu OOM-Fehlern führen. Um solche Szenarien zu vermeiden, passen Sie das Feld
Vermeiden Sie die Verwendung des Bootlaufwerks für das Caching, da dies zu einer geringeren Leistung und unerwarteten Beendigungen führen kann. Verwenden Sie stattdessen ein PersistentVolume, das auf langlebigem Blockspeicher basiert.
RAM-Laufwerkbasiertes Datei-Caching verwenden
Sie können eine RAM-Disk für das Zwischenspeichern von Dateien oder für parallele Downloads verwenden, um den Overhead der Verwendung eines Bootlaufwerks zu reduzieren, wenn Sie eine TPU-VM mit ausreichend großem RAM verwenden.
Wenn Sie eine RAM-Festplatte mit dem Cloud Storage FUSE-CSI-Treiber verwenden möchten, fügen Sie Ihrem Manifest Folgendes hinzu:
volumes:
- name: gke-gcsfuse-cache
emptyDir:
medium: Memory
Statistik-Cache
Der CSI-Treiber von Cloud Storage FUSE verbessert die Leistung durch das Caching von Dateimetadaten wie Größe und Änderungszeit. Der CSI-Treiber aktiviert diesen Stat-Cache standardmäßig und reduziert die Latenz, indem er Informationen lokal speichert, anstatt sie wiederholt von Cloud Storage anzufordern. Sie können die maximale Größe (Standard: 32 MB) und die Dauer, für die die Daten im Cache verbleiben (Standard: 60 Sekunden), konfigurieren. Durch die Feinabstimmung des Metadatencaches können Sie API-Aufrufe an Cloud Storage reduzieren und so die Anwendungsleistung und ‑effizienz verbessern, indem Sie Netzwerkverkehr und Latenz minimieren.
Weitere Informationen zu Best Practices für das Statistik-Caching finden Sie in der Übersicht zum Cloud Storage FUSE-Caching.
Metadaten-Prefetching verwenden, um den Metadaten-Cache vorab zu füllen
Mit der Funktion zum Vorabrufen von Metadaten kann der CSI-Treiber für Cloud Storage FUSE proaktiv relevante Metadaten zu den Objekten in Ihrem Cloud Storage-Bucket in Cloud Storage FUSE-Caches laden. Dieser Ansatz reduziert die Aufrufe von Cloud Storage und ist besonders vorteilhaft für Anwendungen, die auf große Datasets mit vielen Dateien zugreifen, z. B. KI-/ML-Trainingsarbeitslasten.
Für dieses Feature ist die GKE-Version 1.32.1-gke.1357001 oder höher erforderlich. Diese Funktion wird nicht für die dynamische Bereitstellung unterstützt, bei der Sie einen Unterstrich (_) angeben, um alle Buckets bereitzustellen, auf die das Kubernetes-Dienstkonto zugreifen kann. Wenn Sie dynamisches Einbinden verwenden, wird kein Metadaten-Prefetching durchgeführt.
Damit Sie von der Vorabruf-Funktion für Metadaten profitieren, müssen Sie den TTL-Wert (Time to Live, Gültigkeitsdauer) von Metadaten-Cache-Elementen auf „unbegrenzt“ festlegen. Normalerweise wird durch das Festlegen einer TTL verhindert, dass zwischengespeicherte Inhalte veralten. Wenn Sie die TTL auf „unbegrenzt“ festlegen, müssen Sie darauf achten, dass der Inhalt des Buckets nicht außerhalb des Bandes geändert wird. Das bedeutet, dass keine andere Arbeitslast oder kein anderer Akteur die Arbeitslast ändern darf. Out-of-Band-Änderungen sind lokal nicht sichtbar und können zu Inkonsistenzen führen.
Wenn Sie den Metadaten-Prefetch aktivieren möchten, nehmen Sie die folgenden Änderungen an der Konfiguration vor. Wir empfehlen, diese Funktion für Volumes zu aktivieren, die häufig gelesen werden.
- Stelle das Attribut „volume“ (Lautstärke)
gcsfuseMetadataPrefetchOnMount: trueein. - Aktualisieren Sie die folgenden Mount-Optionen:
metadata-cache:stat-cache-max-size-mb:-1, um das Kapazitätslimit für den Statistik-Cache aufzuheben.metadata-cache:type-cache-max-size-mb:-1, um das Kapazitätslimit für den Typ-Cache aufzuheben.file-system:kernel-list-cache-ttl-secs:-1, um zu verhindern, dass Cache-Elemente der Kernelliste ablaufen.metadata-cache:ttl-secs:-1, um zu verhindern, dass im Cache gespeicherte Metadatenelemente ablaufen.
- Um Unterbrechungen der Arbeitslast zu vermeiden, sollten Sie das Arbeitsspeicherlimit des
gke-gcsfuse-metadata-prefetch-Sidecars erhöhen.- Erhöhen Sie die Limits, indem Sie die Pod-Annotation
gke-gcsfuse/metadata-prefetch-memory-limitauf"512Mi"oder höher festlegen. Weitere Informationen finden Sie unter Ressourcen für Sidecar-Container konfigurieren. - Alternativ können Sie das Arbeitsspeicherlimit aufheben, indem Sie die Pod-Annotation
gke-gcsfuse/metadata-prefetch-memory-limitauf"0"festlegen (wird nur für Standardcluster unterstützt).
- Erhöhen Sie die Limits, indem Sie die Pod-Annotation
Ein Beispiel finden Sie im Codebeispiel unter Leseleistung großer Dateien mit parallelen Downloads verbessern.
Cache auflisten
Um die Verzeichnisauflistung für Anwendungen zu beschleunigen, können Sie das Listen-Caching aktivieren. Bei dieser Funktion werden Verzeichnislisten im Arbeitsspeicher gespeichert, damit wiederholte Anfragen schneller beantwortet werden können. Der Listen-Cache ist standardmäßig deaktiviert. Sie können ihn aktivieren, indem Sie den Parameter kernel-list-cache-ttl-secs in Ihren Mount-Optionen festlegen. Damit wird festgelegt, wie lange Einträge im Cache gespeichert werden.
Sequenzielle Lesevorgänge großer Dateien durch Verwendung von gepuffertem Lesen verbessern
Gepufferte Lesevorgänge können die Leistung bei sequenziellen Lesevorgängen für große Dateien verbessern, indem Teile eines Cloud Storage-Objekts asynchron in einen Arbeitsspeicherpuffer vorgeholt werden. Durch das Puffern können nachfolgende Lesevorgänge aus dem Puffer bedient werden, ohne dass Netzwerkaufrufe erforderlich sind.
Beachten Sie Folgendes, bevor Sie gepufferte Lesevorgänge aktivieren:
Gepufferte Lesevorgänge sind nicht mit dem Dateicaching kompatibel. Wenn sowohl gepufferte Lesevorgänge als auch das Zwischenspeichern von Dateien aktiviert sind, hat das Zwischenspeichern von Dateien Vorrang und gepufferte Lesevorgänge werden ignoriert.
Gepufferte Lesevorgänge können erhebliche Speicher- und Rechenressourcen beanspruchen.
Wenn Sie gepufferte Lesevorgänge aktivieren möchten, konfigurieren Sie diese zusätzliche Einstellung in Ihrem Manifest mit Bereitstellungsoptionen: enable-buffered-read.
Wir empfehlen, die Mount-Optionen read-global-max-blocks zu verwenden, um die maximale Anzahl an Blöcken anzugeben, die für gepufferte Lesevorgänge für alle Datei-Handles verfügbar sind.
Leseleistung großer Dateien mit parallelen Downloads verbessern
Mit dem parallelen Download von Cloud Storage FUSE können Sie das Lesen großer Dateien aus Cloud Storage für Downloads mit mehreren Threads beschleunigen. Der parallele Download mit Cloud Storage FUSE kann sich besonders bei Anwendungsfällen mit Lesevorgängen von mehr als 1 GB auszahlen.
Für parallele Downloads muss der Dateicache aktiviert sein. Ab GKE-Version 1.32.0-gke.1795000 erzwingt Cloud Storage FUSE diese Anforderung strikt und gibt den folgenden Fehler aus, wenn Sie versuchen, parallele Downloads ohne den Datei-Cache zu verwenden, wodurch verhindert wird, dass Ihr Pod gestartet wird: MountVolume.SetUp failed for volume "gcs-fuse-csi-pv" : rpc error: code = Internal desc = gcsfuse failed with error: Error: error while parsing config: error parsing parallel download config: file cache should be enabled for parallel download support.
Beispiele:
- Modellbereitstellung, bei der ein großer Prefetch-Zwischenspeicher erforderlich ist, um den Modelldownload beim Starten der Instanz zu beschleunigen.
- Prüfpunktwiederherstellungen, bei denen Sie einen schreibgeschützten Datencache benötigen, um den einmaligen Zugriff auf mehrere große Dateien zu verbessern.
Verwenden Sie parallele Downloads für Anwendungen, die große Dateien mit nur einem Thread lesen. Bei Anwendungen mit hoher Leseparallelität (mit mehr als acht Threads) kann es bei Verwendung dieser Funktion zu einer geringeren Leistung kommen.
So verwenden Sie den parallelen Download mit dem Cloud Storage FUSE CSI-Treiber:
Erstellen Sie einen Cluster mit aktiviertem Datei-Caching, wie unter Datei-Caching aktivieren und verwenden beschrieben.
Konfigurieren Sie in Ihrem Manifest diese zusätzlichen Einstellungen mit mount options, um den parallelen Download zu aktivieren:
- Legen Sie
file-cache:enable-parallel-downloads:truefest. - Passen Sie
file-cache:parallel-downloads-per-file,file-cache:parallel-downloads-per-file,file-cache:max-parallel-downloadsundfile-cache:download-chunk-size-mbnach Bedarf an.
- Legen Sie
Optional: Passen Sie bei Bedarf die folgenden Lautstärkeattribute an:
file-cache:cache-file-for-range-readfür zufällige oder teilweise Lesevorgänge.metadata-cache:stat-cache-max-size-mbundmetadata-cache:type-cache-max-size-mbfür Trainingsarbeitslasten.
Kontingentverbrauch durch Zugriffssteuerungsprüfungen reduzieren
Standardmäßig führt der CSI-Treiber Zugriffssteuerungsprüfungen durch, um sicherzustellen, dass das Dienstkonto des Pods Zugriff auf Ihre Cloud Storage-Buckets hat. Dies führt zu zusätzlichem Overhead in Form von Kubernetes Service API-, Security Token Service- und IAM-Aufrufen. Ab der GKE-Version 1.29.9-gke.1251000 können Sie das Volume-Attribut skipCSIBucketAccessCheck verwenden, um solche redundanten Prüfungen zu überspringen und die Kontingentnutzung zu reduzieren.
Beispiel für die Inferenzbereitstellung
Das folgende Beispiel zeigt, wie Sie den parallelen Download für die Inferenzbereitstellung aktivieren:
Erstellen Sie ein Manifest für PersistentVolume und PersistentVolumeClaim mit der folgenden Spezifikation:
apiVersion: v1 kind: PersistentVolume metadata: name: serving-bucket-pv spec: accessModes: - ReadWriteMany capacity: storage: 64Gi persistentVolumeReclaimPolicy: Retain storageClassName: example-storage-class claimRef: namespace: NAMESPACE name: serving-bucket-pvc mountOptions: - implicit-dirs #avoid if list cache enabled and doing metadata prefetch - metadata-cache:ttl-secs:-1 - metadata-cache:stat-cache-max-size-mb:-1 - metadata-cache:type-cache-max-size-mb:-1 - file-cache:max-size-mb:-1 - file-cache:cache-file-for-range-read:true - file-system:kernel-list-cache-ttl-secs:-1 - file-cache:enable-parallel-downloads:true - read_ahead_kb=1024 csi: driver: gcsfuse.csi.storage.gke.io volumeHandle: BUCKET_NAME volumeAttributes: skipCSIBucketAccessCheck: "true" gcsfuseMetadataPrefetchOnMount: "true" --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: serving-bucket-pvc namespace: NAMESPACE spec: accessModes: - ReadWriteMany resources: requests: storage: 64Gi volumeName: serving-bucket-pv storageClassName: example-storage-classErsetzen Sie die folgenden Werte:
NAMESPACE: der Kubernetes-Namespace, in dem Sie Ihren Pod bereitstellen möchten.BUCKET_NAME: Der Name des Cloud Storage-Bucket, den Sie beim Konfigurieren des Zugriffs auf die Cloud Storage-Buckets angegeben haben. Sie können einen Unterstrich (_) angeben, um alle Buckets bereitzustellen, auf die das Kubernetes-Dienstkonto zugreifen kann. Weitere Informationen finden Sie unter Dynamische Bereitstellung in der Dokumentation zu Cloud Storage FUSE.
Wenden Sie das Manifest auf den Cluster an:
kubectl apply -f PV_FILE_PATHErsetzen Sie
PV_FILE_PATHdurch den Pfad zu Ihrer YAML-Datei.Erstellen Sie ein Pod-Manifest mit der folgenden Spezifikation, um den PersistentVolumeClaim zu nutzen. Das hängt davon ab, ob Sie Dateicaching mit lokalen SSDs oder mit RAM-Laufwerken verwenden:
Lokale SSD
apiVersion: v1 kind: Pod metadata: name: gcs-fuse-csi-example-pod namespace: NAMESPACE annotations: gke-gcsfuse/volumes: "true" gke-gcsfuse/cpu-limit: "0" gke-gcsfuse/memory-limit: "0" gke-gcsfuse/ephemeral-storage-limit: "0" spec: containers: # Your workload container spec ... volumeMounts: - name: serving-bucket-vol mountPath: /serving-data readOnly: true serviceAccountName: KSA_NAME volumes: - name: serving-bucket-vol persistentVolumeClaim: claimName: serving-bucket-pvcRAM-Laufwerk
apiVersion: v1 kind: Pod metadata: name: gcs-fuse-csi-example-pod namespace: NAMESPACE annotations: gke-gcsfuse/volumes: "true" gke-gcsfuse/cpu-limit: "0" gke-gcsfuse/memory-limit: "0" gke-gcsfuse/ephemeral-storage-limit: "0" spec: containers: # Your workload container spec ... volumeMounts: - name: serving-bucket-vol mountPath: /serving-data readOnly: true serviceAccountName: KSA_NAME volumes: - name: gke-gcsfuse-cache # gcsfuse file cache backed by RAM Disk emptyDir: medium: Memory - name: serving-bucket-vol persistentVolumeClaim: claimName: serving-bucket-pvcWenden Sie das Manifest auf den Cluster an:
kubectl apply -f POD_FILE_PATHErsetzen Sie
POD_FILE_PATHdurch den Pfad zu Ihrer YAML-Datei.
DNS-Lookups mit NodeLocal DNSCache in GKE optimieren
In GKE-Versionen vor 1.34.1-gke.3899000 kann die häufige Herstellung neuer Verbindungen zu einer großen Anzahl von DNS-Lookups führen, wenn Sie Cloud Storage FUSE mit dem HTTP/1.1-Protokoll verwenden. Dieses Verhalten kann sich auf die Leistung auswirken, insbesondere in GKE-Umgebungen.
Um DNS-Lookups zu optimieren und die Latenz in früheren GKE-Versionen zu reduzieren, sollten Sie NodeLocal DNSCache bereitstellen.
Standard-Pods: Wenn Sie NodeLocal DNSCache bereitstellen, werden DNS-Lookups für die meisten Standard-Pods in Ihrem Cluster automatisch optimiert.
Hostnetzwerk-Pods: Für Pods, die die Einstellung
hostNetwork: trueverwenden, ist eine zusätzliche Konfigurationsänderung erforderlich, um den NodeLocal DNSCache zu verwenden. Sie müssendnsPolicyin der Spezifikation des Pods explizit aufClusterFirstWithHostNetüberschreiben.
In den folgenden Szenarien ist in der Regel kein separater DNS-Cache erforderlich, da das Caching intern erfolgt:
Compute Engine-VMs: Der Betriebssystemkernel der VM speichert DNS-Lookups in der Regel effektiv im Cache, sodass keine zusätzliche Caching-Ebene erforderlich ist.
GKE 1.34.1-gke.3899000 und höher: Cloud Storage FUSE, das mit diesen Versionen ausgeliefert wird, bietet einen integrierten DNS-Cache, der das Problem mit der hohen Lookup-Frequenz intern behebt.
Volume-Attribute konfigurieren
Mit Volume-Attributen können Sie das spezifische Verhalten des CSI-Treibers für Cloud Storage FUSE konfigurieren.
Mit dem Cloud Storage FUSE CSI-Treiber können Sie die Cloud Storage FUSE-Konfigurationsdatei nicht direkt angeben. Sie können einige der Felder in der Konfigurationsdatei mit den Cloud Storage FUSE CSI-Volume-Attributen konfigurieren. Der CSI-Treiber übersetzt die Werte der Volume-Attribute in die Felder der Konfigurationsdatei.
Eine vollständige Liste der unterstützten Lautstärkeattribute finden Sie in der Referenz zu Lautstärkeattributen.
Sie können die Volume-Attribute auf folgende Weise angeben:
- Im Feld
spec.csi.volumeAttributesfür ein PersistentVolume-Manifest, wenn Sie PersistentVolumes verwenden. - Im Feld
spec.volumes[n].csi.volumeAttributes, wenn Sie sitzungsspezifische CSI-Volumes verwenden.
Im Manifest können die Lautstärkeattribute als Schlüssel/Wert-Paare angegeben werden. Beispiel:
volumeAttributes:
mountOptions: "implicit-dirs"
fileCacheCapacity: "-1"
gcsfuseLoggingSeverity: warning
Cloud Storage FUSE-Messwerte
Die folgenden Cloud Storage FUSE-Messwerte sind jetzt über die GKE Monitoring API verfügbar. Details zu Cloud Storage FUSE-Messwerten wie Labels, Typ und Einheit finden Sie unter GKE-Systemmesswerte. Diese Messwerte sind für jeden Pod verfügbar, der Cloud Storage FUSE verwendet. Sie können sie verwenden, um Statistiken pro Volume und Bucket zu konfigurieren.
Messwerte sind ab der GKE-Version 1.33.0-gke.2248000 oder höher standardmäßig aktiviert. Wenn Sie sie deaktivieren möchten, setzen Sie das Volume-Attribut
disableMetrics auf „true“.
Dateisystemmesswerte
Dateisystemmesswerte geben Aufschluss über die Leistung und den Zustand Ihres Dateisystems, einschließlich der Anzahl der Vorgänge, Fehler und der Geschwindigkeit von Vorgängen. Mithilfe dieser Messwerte können Sie Engpässe identifizieren und die Leistung optimieren.
gcsfusecsi/fs_ops_countgcsfusecsi/fs_ops_error_countgcsfusecsi/fs_ops_latency
Cloud Storage-Messwerte
Sie können Cloud Storage-Messwerte wie Datenvolumen, Geschwindigkeit und Anfrageaktivität im Blick behalten, um zu sehen, wie Ihre Anwendungen mit Cloud Storage-Buckets interagieren. Anhand dieser Daten können Sie Bereiche für die Optimierung identifizieren, z. B. Lesemuster verbessern oder die Anzahl der Anfragen reduzieren.
gcsfusecsi/gcs_download_bytes_countgcsfusecsi/gcs_read_countgcsfusecsi/gcs_read_bytes_countgcsfusecsi/gcs_reader_countgcsfusecsi/gcs_request_countgcsfusecsi/gcs_request_latencies
Messwerte für den Dateicache
Sie können Messwerte für den Dateicache überwachen, z. B. das gelesene Datenvolumen, die Geschwindigkeit und die Cache-Trefferrate, um die Leistung von Cloud Storage FUSE und Anwendungen zu optimieren. Anhand dieser Messwerte können Sie Ihre Caching-Strategie optimieren und die Anzahl der Cache-Treffer maximieren.
gcsfusecsi/file_cache_read_bytes_countgcsfusecsi/file_cache_read_latenciesgcsfusecsi/file_cache_read_count
Standardeinstellungen für die Leistung von Cloud Storage FUSE aktivieren
Ab Version 1.33.2-gke.4655000 aktiviert GKE automatisch eine Reihe von Leistungsstandardeinstellungen für Cloud Storage FUSE, das auf Knoten ausgeführt wird, die von leistungsstarken Maschinentypen unterstützt werden. Diese Leistungsstandardeinstellungen werden aufgrund eines bekannten Problems nicht in den Versionen 1.34.1-gke.1431000 bis 1.34.1-gke.3403001 unterstützt.
Bei der Volume-Bereitstellung ruft der Cloud Storage FUSE CSI-Treiber den Knoteninstanztyp des Ziels ab und übergibt ihn über eine neue Bereitstellungsoption machine-type an Cloud Storage FUSE.
Wenn ein leistungsstarker Maschinentyp übergeben wird, legt Cloud Storage FUSE automatisch die folgenden Standardbereitstellungsoptionen fest:
metadata-cache:negative-ttl-secs:0metadata-cache:ttl-secs:-1metadata-cache:stat-cache-max-size-mb:1024metadata-cache:type-cache-max-size-mb:128implicit-dirs:truefile-system:rename-dir-limit:200000write:global-max-blocks:1600
Wenn eine dieser Mount-Optionen explizit angegeben wird, wird sie nicht durch die automatischen Standardeinstellungen überschrieben.
Sie können die Funktion deaktivieren, indem Sie disable-autoconfig in die Bereitstellungsoptionen einfügen. Beispiel:
mountOptions: "implicit-dirs,disable-autoconfig"
Best Practices für die Leistungsoptimierung
In diesem Abschnitt werden einige empfohlene Techniken zur Leistungsoptimierung und -abstimmung für den Cloud Storage FUSE-CSI-Treiber aufgeführt.
Buckets mit hierarchischem Namespace (HNS) nutzen:Wählen Sie HNS-Buckets aus, um die anfänglichen Abfragen pro Sekunde (Queries Per Second, QPS) um das Achtfache zu steigern. Diese Auswahl erleichtert auch schnelle und atomare Verzeichnisumbenennungen, eine wichtige Voraussetzung für effizientes Checkpointing mit Cloud Storage FUSE. HNS-Buckets bieten eine bessere Dateinutzung, da sie 40.000 Lesevorgänge und 8.000 Schreibvorgänge pro Sekunde unterstützen. Das ist eine deutliche Verbesserung gegenüber den 8.000 Lesevorgängen und 1.000 Schreibvorgängen pro Sekunde, die von Flat-Buckets unterstützt werden.
Nach Möglichkeit bestimmte Verzeichnisse bereitstellen:Wenn Ihre Arbeitslast den Zugriff auf ein bestimmtes Verzeichnis in einem Bucket umfasst, verwenden Sie beim Bereitstellen das Flag
--only-dir. Dieser fokussierte Ansatz beschleunigt Listenaufrufe, da er den Umfang vonLookUpInode-Aufrufen einschränkt, die einenlist+stat-Aufruf für jede Datei oder jedes Verzeichnis im angegebenen Pfad umfassen. Wenn Sie den Mount auf das erforderliche Unterverzeichnis beschränken, minimieren Sie diese Aufrufe und erzielen so eine bessere Leistung.Metadaten-Caching optimieren:Konfigurieren Sie Ihre Metadaten-Caches so, dass ihre Kapazität maximiert wird, und legen Sie eine unendliche Gültigkeitsdauer (TTL) fest. Dadurch werden alle aufgerufenen Metadaten für die Dauer Ihres Jobs im Cache gespeichert. So werden Metadatenzugriffsanfragen an Cloud Storage minimiert. Diese Konfiguration ist besonders für schreibgeschützte Volumes von Vorteil, da sie wiederholte Cloud Storage-Metadaten-Lookups überflüssig macht. Prüfen Sie jedoch, ob der mit diesen großen Metadatencaches verbundene Speicherverbrauch den Möglichkeiten Ihres Systems entspricht.
GKE-Sidecar-Ressourcen maximieren:Cloud Storage FUSE wird in einem Sidecar-Container in einer GKE-Umgebung ausgeführt. Entfernen Sie Einschränkungen für den CPU- und Arbeitsspeicherverbrauch des Sidecar-Containers, um Ressourcenengpässe zu vermeiden. So kann Cloud Storage FUSE die Ressourcennutzung basierend auf den Anforderungen der Arbeitslast skalieren und Drosselung verhindern, was zu einem optimalen Durchsatz beiträgt.
Metadaten-Cache proaktiv füllen:Aktivieren Sie das Vorabrufen von Metadaten für den CSI-Treiber. Dadurch werden die Metadaten- und Listencaches effizient gefüllt, wodurch Metadatenaufrufe an Cloud Storage minimiert und die erste Ausführung beschleunigt werden. Viele ML-Frameworks führen diesen Schritt automatisch aus. Bei benutzerdefiniertem Trainingscode ist es jedoch wichtig, dass Sie ihn selbst ausführen. Weitere Informationen finden Sie unter Metadaten-Prefetch verwenden, um den Metadaten-Cache vorab zu füllen.
Dateicache und parallele Downloads verwenden:Aktivieren Sie die Dateicache-Funktion, insbesondere für Trainingsarbeitslasten mit mehreren Epochen, bei denen Daten wiederholt gelesen werden. Im Datei-Cache werden Daten mit häufigen Zugriffen im lokalen Speicher (SSD bei A3-Maschinen) gespeichert, wodurch die Leseleistung verbessert wird. Ergänzen Sie dies mit der Funktion für parallele Downloads, insbesondere für Bereitstellungsarbeitslasten, um das Herunterladen großer Dateien zu beschleunigen, indem Sie sie in kleinere Blöcke aufteilen und gleichzeitig herunterladen.
Gepufferte Lesevorgänge aktivieren:Gepufferte Lesevorgänge können die Leistung sequenzieller Lesevorgänge für große Dateien verbessern, indem Teile eines Cloud Storage-Objekts asynchron in einen Arbeitsspeicherpuffer vorgeholt werden. Durch das Puffern können nachfolgende Lesevorgänge aus dem Puffer bedient werden, ohne dass Netzwerkaufrufe erforderlich sind. Weitere Informationen finden Sie unter Sequenzielle Lesevorgänge großer Dateien mit gepuffertem Lesen verbessern.
Checkpoints optimieren:Für Checkpointing mit Cloud Storage FUSE empfehlen wir dringend, einen HNS-Bucket zu verwenden. Wenn Sie einen Bucket verwenden, der nicht HNS-fähig ist, legen Sie den Parameter
rename-dir-limitauf einen hohen Wert fest, um die Verzeichnisumbenennungen zu berücksichtigen, die von ML-Frameworks häufig während der Prüfpunkterstellung verwendet werden. Beachten Sie jedoch, dass das Umbenennen von Verzeichnissen in Nicht-HNS-Buckets möglicherweise nicht atomar ist und länger dauern kann.Listen-Caching aktivieren:Aktivieren Sie das Listen-Caching mit dem Flag
--kernel-list-cache-ttl-secs, um die Leistung weiter zu verbessern. Bei dieser Funktion werden Verzeichnis- und Dateilisten im Cache gespeichert, wodurch die Geschwindigkeit vonls-Vorgängen verbessert wird. Das Caching von Listen ist besonders nützlich für Arbeitslasten, die im Rahmen der Ausführung vollständige Verzeichniseinträge wiederholen, z. B. KI/ML-Trainingsläufe. Es empfiehlt sich, das Listen-Caching mit schreibgeschützten Bereitstellungen zu verwenden, um die Datenkonsistenz aufrechtzuerhalten.Kernel-Read-Ahead erhöhen:Bei Arbeitslasten, die hauptsächlich sequenzielle Lesevorgänge großer Dateien umfassen, z. B. Bereitstellung und Prüfpunktwiederherstellung, kann eine Erhöhung der Read-Ahead-Größe die Leistung erheblich verbessern. Wenn Sie den Cloud Storage FUSE-Read-Ahead-Wert erhöhen möchten, geben Sie das Flag
read_ahead_kbinmountOptionsan und legen Sie es auf 1 MB fest (z.B.read_ahead_kb=1024). Für diese Funktion ist die GKE-Version 1.32.2-gke.1297001 oder höher erforderlich. Bei zonalen Buckets wird der Kernelparameterread_ahead_kbin GKE-Version 1.35.0-gke.3047001 oder höher automatisch von Cloud Storage FUSE verwaltet. Daher ist die Mount-Optionread_ahead_kbnicht anwendbar und jeder dafür angegebene Wert wird ignoriert.Streaming-Schreibvorgänge aktivieren:Streaming-Schreibvorgänge sind ein neuer Schreibpfad, bei dem Daten während des Schreibens direkt in Cloud Storage hochgeladen werden. Dieser Ansatz unterscheidet sich von der standardmäßigen Schreibmethode, bei der der gesamte Schreibvorgang vorübergehend in einem lokalen Verzeichnis bereitgestellt und dann bei einem
close- oderfsync-Vorgang in Cloud Storage hochgeladen wird. Streaming-Schreibvorgänge reduzieren sowohl die Latenz als auch die Festplattenspeichernutzung. Das ist besonders bei großen, sequenziellen Schreibvorgängen wie Checkpoints von Vorteil. Geben Sie das Befehlszeilen-Flagenable-streaming-writesinmountOptionsan, um Streaming-Schreibvorgänge zu aktivieren.
Probleme beheben
Weitere Informationen zur Fehlerbehebung finden Sie hier:
- Cloud Storage FUSE-Ereignisse vom Typ „Out of Memory“ (OOM) mit Cloud Profiler beheben
- Die Anleitung zur Fehlerbehebung in der Dokumentation zum GitHub-Projekt.
Nächste Schritte
- Weitere Beispiele für die Verwendung des CSI-Treibers auf GitHub
- Weitere Informationen zu Cloud Storage FUSE