Einbindungsoptionen für NFS unter Linux: bewährte Methoden für Azure NetApp Files
Dieser Artikel enthält Informationen zum besseren Verständnis von Einbindungsoptionen sowie bewährte Methoden für deren Verwendung mit Azure NetApp Files.
Nconnect
Mithilfe der Einbindungsoption nconnect
können Sie die Anzahl der Verbindungen (Netzwerkdatenflüsse) angeben, die zwischen NFS-Client und NFS-Endpunkt bis zum Grenzwert 16 eingerichtet werden sollen. In der Regel verwendet ein NFS-Client eine einzelne Verbindung zwischen sich selbst und dem Endpunkt. Durch Steigern der Anzahl von Netzwerkflows werden die Obergrenzen für E/A und Durchsatz erheblich erhöht. Tests haben ergeben, dass nconnect=8
die beste Leistung liefert.
Wenn Sie eine SAS-GRID-Umgebung mit mehreren Knoten für die Produktion vorbereiten, können Sie eine wiederholbare Verkürzung der Laufzeit um 30 %feststellen, von 8 Stunden auf 5,5 Stunden:
Bereitstellungsoption | Ausführungszeiten des Auftrags |
---|---|
Ohne nconnect |
8 Stunden |
nconnect=8 |
5,5 Stunden |
Bei beiden Testreihen wurden der gleiche virtuelle Computer (E32-8_v4) und RHEL 8.3 verwendet, wobei Read-Ahead auf 15 MiB festgelegt war.
Beachten Sie bei Verwenden von nconnect
die folgenden Regeln:
nconnect
wird von Azure NetApp Files für alle wichtigen Linux-Distributionen unterstützt, allerdings nur für neuere Releases:Linux-Release NFSv3 (Mindestrelease) NFSv4.1 (Mindestrelease) Red Hat Enterprise Linux RHEL 8.3 RHEL 8.3 SUSE SLES 12 SP4 oder SLES 15 SP1 SLES 15 SP2 Ubuntu Ubuntu 18.04 Hinweis
SLES 15S P2 ist das SUSE-Mindestrelease, von dem
nconnect
von Azure NetApp Files für NFSv4.1 unterstützt wird. Alle anderen aufgeführten Releases sind die ersten mit dem Featurenconnect
.Alle Einbindungen über einen einzelnen Endpunkt übernehmen die
nconnect
-Einstellung des ersten eingebundenen Exports, wie in den folgenden Szenarien gezeigt:Szenario 1:
nconnect
wird von der ersten Einbindung verwendet. Daher verwenden alle Einbindungen über denselben Endpunktnconnect=8
.mount 10.10.10.10:/volume1 /mnt/volume1 -o nconnect=8
mount 10.10.10.10:/volume2 /mnt/volume2
mount 10.10.10.10:/volume3 /mnt/volume3
Szenario 2:
nconnect
wird nicht von der ersten Einbindung verwendet. Daher verwenden keine Einbindungen über denselben Endpunktnconnect
, obwohlnconnect
dafür angeben sein kann.mount 10.10.10.10:/volume1 /mnt/volume1
mount 10.10.10.10:/volume2 /mnt/volume2 -o nconnect=8
mount 10.10.10.10:/volume3 /mnt/volume3 -o nconnect=8
Szenario 3:
nconnect
-Einstellungen werden nicht über separate Speicherendpunkte weitergegeben.nconnect
wird von der Einbindung verwendet, die von10.10.10.10
stammt, aber nicht von der von10.12.12.12
stammenden Einbindung.mount 10.10.10.10:/volume1 /mnt/volume1 -o nconnect=8
mount 10.12.12.12:/volume2 /mnt/volume2
nconnect
kann verwendet werden, um Speicherparallelität von einem beliebigen Client zu erhöhen.
Weitere Informationen finden Sie unter Bewährte Methoden für Linux-Parallelität für Azure NetApp Files.
Überlegungen im Zusammenhang mit Nconnect
Es wird nicht empfohlen, die Einbindungsoptionen nconnect
und sec=krb5*
gemeinsam zu verwenden. Leistungsbeeinträchtigungen wurden beobachtet, wenn die beiden Optionen in Kombination verwendet werden.
Die GSS-API (Generic Security Standard Application Programming Interface) bietet Anwendungen eine Möglichkeit zum Schutz von Daten, die an Peeranwendungen gesendet werden. Diese Daten könnten von einem Client auf einem Computer an einen Server auf einem anderen Computer gesendet werden.
Bei Verwendung von nconnect
unter Linux wird der GSS-Sicherheitskontext zwischen allen nconnect
-Verbindungen mit einem bestimmten Server gemeinsam genutzt. TCP ist ein zuverlässiger Transport, der die unsortierte Paketübermittlung (Out-of-Order) unterstützt, um Pakete in falscher Reihenfolge in einem GSS-Stream mit einem Gleitfenster von Sequenznummern zu behandeln. Wenn Pakete empfangen werden, die sich nicht im Sequenzfenster befinden, wird der Sicherheitskontext verworfen, und ein neuer Sicherheitskontext wird ausgehandelt. Alle Nachrichten, die in dem nun verworfenen Kontext gesendet wurden, sind nicht mehr gültig, weshalb die Nachrichten erneut gesendet werden müssen. Eine größere Anzahl von Paketen in einer nconnect
-Einrichtung führt zu häufigen außerhalb des Fensters liegenden Paketen, wodurch das beschriebene Verhalten ausgelöst wird. Für dieses Verhalten können keine spezifischen Beeinträchtigungsprozentsätze angegeben werden.
Rsize
und Wsize
Die Beispiele in diesem Abschnitt geben Aufschluss über die Vorgehensweise bei der Leistungsoptimierung. Möglicherweise müssen Sie Anpassungen vornehmen, um Ihren spezifischen Anwendungsanforderungen gerecht zu werden.
Die Flags rsize
und wsize
legen die maximale Übertragungsgröße eines NFS-Vorgangs fest. Wenn rsize
oder wsize
beim Einbinden nicht angegeben werden, handeln Client und Server die höchste von beiden unterstützte Größe aus. Derzeit unterstützen sowohl Azure NetApp Files als auch moderne Linux-Distributionen Lese- und Schreibgrößen von bis zu 1.048.576 Bytes (1 MiB). Zur Optimierung von Gesamtdurchsatz und Latenz empfiehlt Azure NetApp Files jedoch, sowohl rsize
als auch wsize
auf nicht mehr als 262.144 Bytes (256 KiB) festzulegen. Sie werden feststellen, dass sowohl Latenz als auch Durchsatz sinken, wenn rsize
und wsize
auf mehr als 256 KiB festgelegt sind.
Unter Bereitstellen eines Systems für horizontale SAP HANA-Skalierung mit Standbyknoten auf Azure-VMs mithilfe von Azure NetApp Files unter SUSE Linux Enterprise Server wird beispielsweise der Höchstwert von 256 KiB für rsize
und wsize
wie folgt gezeigt:
sudo vi /etc/fstab
# Add the following entries
10.23.1.5:/HN1-data-mnt00001 /hana/data/HN1/mnt00001 nfs rw,vers=4,minorversion=1,hard,timeo=600,rsize=262144,wsize=262144,noatime,_netdev,sec=sys 0 0
10.23.1.6:/HN1-data-mnt00002 /hana/data/HN1/mnt00002 nfs rw,vers=4,minorversion=1,hard,timeo=600,rsize=262144,wsize=262144,noatime,_netdev,sec=sys 0 0
10.23.1.4:/HN1-log-mnt00001 /hana/log/HN1/mnt00001 nfs rw,vers=4,minorversion=1,hard,timeo=600,rsize=262144,wsize=262144,noatime,_netdev,sec=sys 0 0
10.23.1.6:/HN1-log-mnt00002 /hana/log/HN1/mnt00002 nfs rw,vers=4,minorversion=1,hard,timeo=600,rsize=262144,wsize=262144,noatime,_netdev,sec=sys 0 0
10.23.1.4:/HN1-shared/shared /hana/shared nfs rw,vers=4,minorversion=1,hard,timeo=600,rsize=262144,wsize=262144,noatime,_netdev,sec=sys 0 0
Für SAS Viya wird beispielsweise eine Lese- und Schreibgröße von 256 KiB empfohlen. SAS GRID beschränkt r/wsize
auf 64 KiB, während die Leseleistung durch Erhöhen von Read-Ahead für die NFS-Einbindungen verbessert wird. Ausführliche Informationen finden Sie unter Bewährte Methoden für NFS-Read-Ahead unter Linux für Azure NetApp Files.
Die folgenden Überlegungen gelten für die Verwendung von rsize
und wsize
:
- Zufällige E/A-Vorgangsgrößen sind häufig kleiner als die Einbindungsoptionen
rsize
undwsize
. Daher sind sie keine Einschränkungen. - Bei Verwendung des Dateisystemcaches erfolgen sequenzielle E/A-Vorgänge mit der durch die Einbindungsoptionen
rsize
undwsize
vorgegebenen Größe, es sei denn, die Dateigröße ist kleiner alsrsize
undwsize
. - Vorgänge, die den Dateisystemcache umgehen, sind, obwohl sie immer noch durch die Einbindungsoptionen
rsize
undwsize
eingeschränkt sind, nicht so groß wie der durchrsize
oderwsize
angegebene Höchstwert. Dieser Aspekt ist wichtig, wenn Sie Workload-Generatoren einsetzen, die die Optiondirectio
aufweisen.
Als bewährte Methode für Azure NetApp Files sollten Sie zur Optimierung von Gesamtdurchsatz und Latenz rsize
und wsize
nicht größer als auf 262.144 Bytes festlegen.
Close-to-Open-Konsistenz und Cacheattributtimer
NFS verwendet ein loses Konsistenzmodell. Die Konsistenz ist lose, da die Anwendung nicht jedes Mal auf den gemeinsamen Speicher zugreifen und Daten abrufen muss, um sie zu verwenden – ein Szenario, das enorme Auswirkungen auf die Anwendungsleistung haben würde. Es gibt zwei Mechanismen zum Verwalten dieses Prozesses: Cacheattributtimer und Close-to-Open-Konsistenz.
Wenn der Client im vollständigen Besitz der Daten ist, d. h. sie nicht von mehreren Knoten oder Systemen gemeinsam genutzt werden, ist Konsistenz gewährleistet. In diesem Fall können Sie die getattr
-Zugriffsvorgänge auf den Speicher reduzieren und die Anwendung beschleunigen, indem Sie Close-to-Open-Konsistenz (cto
) deaktivieren (nocto
als Einbindungsoption) und die Timeouts für die Verwaltung des Attributcaches erhöhen (actimeo=600
als Einbindungsoption ändert den Zeitgeber in 10 Minuten gegenüber den Standardeinstellungen acregmin=3,acregmax=30,acdirmin=30,acdirmax=60
). Bei einigen Tests reduziert nocto
etwa 65-70 % der Zugriffsaufrufe für getattr
, und die Anpassung von actimeo
reduziert diese Aufrufe um weitere 20-25 %.
Funktionsweise von Attributcachetimern
Die Attribute acregmin
, acregmax
, acdirmin
und acdirmax
steuern die Kohärenz des Caches. Die beiden vorherigen Attribute steuern, wie lange die Attribute von Dateien als vertrauenswürdig eingestuft werden. Die beiden letztgenannten Attribute steuern, wie lange die Attribute der Verzeichnisdatei selbst vertrauenswürdig sind (Größe, Besitz und Berechtigungen von Verzeichnissen). Die Attribute min
und max
definieren die Mindest- bzw. Höchstdauer, für die Attribute eines Verzeichnisses bzw. einer Datei und der Cacheinhalt einer Datei als vertrauenswürdig eingestuft werden. Zwischen min
und max
wird ein Algorithmus verwendet, um die Zeitspanne zu definieren, für die einem Eintrag im Cache vertraut wird.
Betrachten Sie zum Beispiel die Standardwerte für acregmin
und acregmax
, 3 bzw. 30 Sekunden. Die Attribute werden z. B. für die Dateien in einem Verzeichnis wiederholt ausgewertet. Nach 3 Sekunden wird der NFS-Dienst auf Aktualität abgefragt. Wenn die Attribute als gültig erachtet werden, verdoppelt der Client die vertrauenswürdige Zeitspanne auf 6 Sekunden, 12 Sekunden, 24 Sekunden und übernimmt dann den Höchstwert 30 Sekunden. Von diesem Zeitpunkt an, bis die zwischengespeicherten Attribute als veraltet gelten (dann beginnt der Zyklus von vorne), ist die Zeitspanne der Vertrauenswürdigkeit auf 30 Sekunden festgelegt und entspricht dem von acregmax
angegebenen Wert.
Es gibt andere Fälle, die von ähnlichen Einbindungsoptionen profitieren können, auch wenn die Clients nicht den vollständigen Besitz haben, z. B. wenn die Clients die Daten schreibgeschützt nutzen und die Datenaktualisierung über einen anderen Pfad verwaltet wird. Bei Anwendungen, die Raster mit Clients verwenden, wie z B. EDA, Webhosting und Filmrendering, und relativ statische Datasets haben (EDA-Tools oder -Bibliotheken, Webinhalte, Texturdaten), ist das typische Verhalten, dass der Datensatz weitgehend auf den Clients zwischengespeichert wird. Es gibt nur wenige Lese- und keine Schreibvorgänge. Zahlreiche getattr
-/Zugriffsaufrufe kehren zum Speicher zurück. Diese Datasets werden in der Regel durch einen anderen Client aktualisiert, der die Dateisysteme einbindet und Inhaltsupdates in regelmäßigen Abständen per Push überträgt.
In diesen Fällen gibt es eine bekannte Verzögerung bei der Erfassung neuer Inhalte, weshalb die Anwendung möglicherweise mit veralteten Daten arbeitet. In diesen Fällen können nocto
und actimeo
angegeben werden, um die Zeitspanne zu steuern, in der veraltete Daten verwaltet werden können. Bei EDA-Tools und -Bibliotheken beispielsweise funktioniert actimeo=600
gut, da diese Daten in der Regel nur selten aktualisiert werden. Für das Hosting kleiner Websites, bei dem Datenaktualisierungen auf Clients zeitgerecht angezeigt werden müssen, während sie ihre Websites bearbeiten, dürfte actimeo=10
akzeptabel sein. Für große Websites, deren Inhalte per Push in mehrere Dateisysteme übertragen werden, kann actimeo=60
akzeptabel sein.
Bei diesen Einbindungsoptionen wird die Workload für den Speicher in diesen Fällen erheblich reduziert. (Beispielsweise wurde bei einem kürzlich durchgeführte EDA-Test das IOPS-Volumen des Tools von über 150.000 auf ca. 6.000 reduziert.) Anwendungen können erheblich schneller ausgeführt werden, da sie den Daten im Arbeitsspeicher vertrauen können. (Die Zugriffszeit auf den Arbeitsspeicher beträgt Nanosekunden im Vergleich zu Hunderten von Mikrosekunden für getattr
/Zugriff in einem schnellen Netzwerk.)
Close-to-Open-Konsistenz
Close-to-Open-Konsistenz (die Einbindungsoption cto
) stellt sicher, dass unabhängig vom Zustand des Caches beim Öffnen der Anwendung stets die neuesten Daten für eine Datei präsentiert werden.
- Wenn ein Verzeichnis durchforstet wird (z. B.
ls
,ls -l
), wird ein bestimmter Satz von Remoteprozeduraufrufen (PRC) ausgegeben. Der NFS-Server gibt seine Sicht auf das Dateisystem frei. Solangecto
von allen NFS-Clients verwendet wird, die auf einen bestimmten NFS-Export zugreifen, sehen alle Clients dieselbe Liste der darin enthaltenen Dateien und Verzeichnisse. Die Aktualität der Attribute der Dateien im Verzeichnis wird durch die Attributcachetimer gesteuert. Das heißt, solangecto
verwendet wird, werden Dateien für Remoteclients angezeigt, sobald die Datei erstellt und im Speicher abgelegt wurde. - Wenn eine Datei geöffnet wird, ist der Inhalt der Datei aus Sicht des NFS-Servers garantiert aktuell.
Wenn eine Racebedingung vorliegt, bei der der Inhalt von Computer 1 noch nicht vollständig geleert wurde, sobald eine Datei auf Computer 2 geöffnet wird, erhält Computer 2 nur die Daten, die zum Zeitpunkt des Öffnens auf dem Server vorhanden sind. In diesem Fall ruft Computer 2 keine weiteren Daten aus der Datei ab, bis der Zeitgeber
acreg
erreicht ist und Computer 2 die Kohärenz seines Caches erneut mit dem Server abgleicht. Dieses Szenario kann auf Computer 2 bei Angabe von-f
am Ende beobachtet werden, wenn auf Computer 1 weiter in die Datei geschrieben wird.
Keine Close-to-Open-Konsistenz
Ohne Close-to-Open-Konsistenz (nocto
) vertraut der Client auf die Aktualität seiner aktuellen Sicht auf Datei und Verzeichnis, bis die Cacheattributtimer überschritten worden sind.
Wenn ein Verzeichnis durchforstet wird (z. B.
ls
,ls -l
), wird ein bestimmter Satz von Remoteprozeduraufrufen (PRC) ausgegeben. Der Client ruft den Server nur dann für eine aktuelle Auflistung der Dateien auf, wenn der Zeitgeberwertacdir
des Caches überschritten wurde. In diesem Fall werden zuletzt erstellte Dateien und Verzeichnisse nicht angezeigt. Zuletzt entfernte Dateien und Verzeichnisse werden angezeigt.Beim Öffnen einer Datei wird, solange sich die Datei noch im Cache befindet, ihr zwischengespeicherter Inhalt (falls vorhanden) zurückgegeben, ohne auf Konsistenz mit dem NFS-Server zu prüfen.
Nächste Schritte
- Bewährte Methoden in Bezug auf direkte E/A unter Linux für Azure NetApp Files
- Bewährte Methoden in Bezug auf den Linux-Dateisystemcache für Azure NetApp Files
- Bewährte Methoden für Linux-Parallelität für Azure NetApp Files
- Bewährte Methoden für NFS-Read-Ahead unter Linux
- Bewährte Methoden für SKUs für virtuelle Azure-Computer
- Leistungsbenchmarks für Linux