NFS schlechte Schreibleistung

20

Ich habe zwei Maschinen mit 10 Gbit Ethernet verbunden. Einer von ihnen sei der NFS-Server und ein anderer der NFs-Client.

Das Testen der Netzwerkgeschwindigkeit über TCP mit einem iperfDurchsatz von ~ 9,8 Gbit / s in beide Richtungen zeigt, dass das Netzwerk in Ordnung ist.

Testen der Festplattenleistung des NFS-Servers:

dd if=/dev/zero of=/mnt/test/rnd2 count=1000000

Das Ergebnis ist ~ 150 MByte / s, sodass die Festplatte zum Schreiben einwandfrei funktioniert.

Server /etc/exportsist:

/mnt/test 192.168.1.0/24(rw,no_root_squash,insecure,sync,no_subtree_check)

Der Client stellt diese Freigabe lokal /mnt/testmit folgenden Optionen bereit:

node02:~ # mount | grep nfs
192.168.1.101:/mnt/test on /mnt/test type nfs4 (rw,relatime,sync,vers=4.0,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.102,local_lock=none,addr=192.168.1.101)

Wenn ich versuche, eine große Datei (~ 5 GB) von der NFS-Freigabe auf den Client-Computer herunterzuladen, erhalte ich eine Leistung von ~ 130-140 MB / s, was der Leistung der lokalen Festplatte des Servers nahekommt.

Wenn ich jedoch versuche, eine große Datei auf die NFS-Freigabe hochzuladen, beginnt der Upload bei ~ 1,5 MB / s, steigt langsam auf 18-20 MB / s an und hört auf zuzunehmen. Manchmal "hängt" die Freigabe für ein paar Minuten, bevor der Upload tatsächlich beginnt, dh der Datenverkehr zwischen den Hosts nähert sich Null, und wenn ich ihn ausführe ls /mnt/test, kehrt er innerhalb von ein oder zwei Minuten nicht zurück. Dann lskehrt der Befehl zurück und der Upload beginnt mit der anfänglichen Geschwindigkeit von 1,5 Mbit / s.

Wenn die Upload-Geschwindigkeit das Maximum erreicht (18-20 Mbytes / s), starte ich iptraf-ngund es zeigt ~ 190 Mbit / s Verkehr auf der Netzwerkschnittstelle, so dass das Netzwerk hier kein Engpass ist, ebenso wie die Festplatte des Servers.

Was ich versucht habe:

1. Richten Sie einen NFS-Server auf einem dritten Host ein, der nur mit einer 100-Mbit-Ethernet-Netzwerkkarte verbunden war. Die Ergebnisse sind analog: DL zeigt eine gute Leistung und eine fast vollständige 100-Mbit-Netzwerkauslastung. Der Upload erfolgt nicht schneller als Hunderte von Kilobyte pro Sekunde, sodass die Netzwerkauslastung sehr niedrig ist (laut Angaben 2,5 Mbit / s iptraf-ng).

2. Ich habe versucht, einige NFS-Parameter zu optimieren:

  • sync oder async

  • noatime

  • Nein hard

  • rsizeund wsizesind in meinen Beispielen maximal, deshalb habe ich versucht, sie in mehreren Schritten auf 8192 zu verringern

3. Ich habe versucht, zwischen Client- und Servermaschinen zu wechseln (NFS-Server auf dem früheren Client einrichten und umgekehrt). Darüber hinaus gibt es sechs weitere Server mit derselben Konfiguration. Daher habe ich versucht, sie in verschiedenen Variationen aneinander zu montieren. Gleiches Ergebnis.

4. MTU = 9000, MTU = 9000 und 802.3ad Link Aggregation, Link Aggregation mit MTU = 1500.

5. System-Tuning:

node01:~ # cat /etc/sysctl.conf 
net.core.wmem_max=16777216
net.core.rmem_max=16777216
net.ipv4.tcp_rmem= 10240 873800 16777216
net.ipv4.tcp_wmem= 10240 873800 16777216
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.core.netdev_max_backlog = 5000

Gleiches Ergebnis.

6. Mount von localhost:

node01:~ # cat /etc/exports
/mnt/test *(rw,no_root_squash,insecure,sync,no_subtree_check)
node01:~ # mount -t nfs -o sync localhost:/mnt/test /mnt/testmount/

Und hier erhalte ich das gleiche Ergebnis: Download von /mnt/testmount/ist schnell, Upload nach /mnt/testmount/ist sehr langsam, nicht schneller als 22 MByte / s und es gibt eine kleine Verzögerung, bevor die Übertragung tatsächlich beginnt. Bedeutet dies, dass der Netzwerkstapel fehlerfrei funktioniert und das Problem in NFS liegt?

All dies hat nicht geholfen, die Ergebnisse unterschieden sich nicht wesentlich von der Standardkonfiguration. echo 3 > /proc/sys/vm/drop_cacheswurde vor allen Tests ausgeführt.

Die MTU aller NICS auf allen 3 Hosts beträgt 1500, es wird keine nicht standardmäßige Netzwerkoptimierung durchgeführt. Der Ethernet-Switch ist Dell MXL 10 / 40Gbe.

Betriebssystem ist CentOS 7.

node01:/mnt/test # uname -a
Linux node01 3.10.0-123.20.1.el7.x86_64 #1 SMP Thu Jan 29 18:05:33 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

Welche Einstellungen fehle ich? Wie kann man NFS schnell und ohne Hänge schreiben lassen?

Sergey
quelle
1
Sie haben einen ziemlich abgerundeten Testfall, aber ich würde versuchen, ihn auf dem Server selbst zu mounten und von dort aus zu schreiben. Auf diese Weise können Sie herausfinden, ob der NFS-Stack oder der Netzwerk-Stack fehlerhaft ist. Versuchen Sie auch, den Server und den Client zu wechseln (vom Client exportieren, auf den Server laden) und einen anderen Client zu verwenden. Das Verfolgen der Server / Client-Prozesse hat nichts ergeben?
Dalibor Karlović
@ DaliborKarlović Ich habe alle außer strace ausprobiert und der Frage Informationen hinzugefügt. Das Mounten von localhost funktioniert langsam, sodass der Netzwerkstack und der Switch anscheinend nicht fehlerhaft sind. Ich verwende Kernel-Space-NFS und Operation not permittedversuche, eine Verbindung zum NFS-Prozess herzustellen.
Sergey
Ich gehe davon aus, dass dies bedeutet, dass Sie den Netzwerkstapel vollständig ausschließen können (aber Sie müssen eine Strace daran anhängen, um dies sicherzustellen). Sie sollten in der Lage sein, jeden Prozess als Root-Benutzer zu verfolgen, wenn er nicht von einem bestimmten Fehler betroffen ist .
Dalibor Karlović
@ DaliborKarlović Sicher versuche ich strace als root. Ich kann an jeden Userspace-Prozess anhängen, aber nicht an jeden Kernelspace-Prozess. Aber welche Informationen kann ich aus der Ausgabe erhalten? Ich nehme an, es wird Hunderttausende von Zeilen ausgeben, wenn ich es an NFS anhänge und mit dem Hochladen beginne. Sollte ich Rückgabewerte ungleich Null beachten?
Sergey
Sie haben Recht, ich habe nicht daran gedacht, dass es sich um einen Nicht-Userland-Prozess handelt. Ich würde erwarten zu sehen, was es tat, während es zu Beginn der Übertragung "hängt", es könnte etwas Triviales wie eine falsch konfigurierte Reverse-DNS-Suche sein.
Dalibor Karlović

Antworten:

3

Sie verwenden die Synchronisierungsoption in Ihrer Exportanweisung. Dies bedeutet, dass der Server Schreibvorgänge erst bestätigt, nachdem sie tatsächlich auf die Festplatte geschrieben wurden. Wenn Sie eine sich drehende Festplatte haben (dh keine SSD), erfordert dies durchschnittlich mindestens eine halbe Umdrehung der Festplatte pro Schreibvorgang, was die Ursache für die Verlangsamung ist.

Mit der Einstellung Async bestätigt der Server den Schreibvorgang sofort an den Client, wenn er verarbeitet, aber noch nicht auf die Festplatte geschrieben wird. Dies ist etwas unzuverlässiger, z. B. bei einem Stromausfall, wenn der Client eine Bestätigung für eine nicht durchgeführte Operation erhalten hat. Es bietet jedoch eine enorme Steigerung der Schreibleistung.

(edit) Ich habe gerade gesehen, dass Sie die Optionen async vs sync bereits getestet haben. Ich bin mir jedoch fast sicher, dass dies die Ursache für Ihr Leistungsminderungsproblem ist - ich hatte einmal genau die gleiche Anzeige mit einem identischen Setup. Vielleicht testest du es nochmal. Haben Sie bei der export-Anweisung des Servers UND bei der mount-Operation auf dem Client gleichzeitig die async-Option angegeben?

Bernd Gloss
quelle
+1 Die wahrscheinlichste Erklärung ist, dass die Synchronisierung nicht korrekt deaktiviert wurde.
David Schwartz
2

Dies kann ein Problem im Zusammenhang mit der Paketgröße und der Latenz sein. Versuche Folgendes:

Der Bericht zurück Ihre Ergebnisse.

Shodanshok
quelle
Ich habe Jumbo Frames mit MTU = 9000 ausprobiert, aber die Ergebnisse waren die gleichen. Ich habe auch versucht, Link Aggregation mit 802.3ad, wieder keine Änderungen. Daher habe ich alle diese Einstellungen zurückgesetzt, um dem Standardzustand so nahe wie möglich zu kommen. Ich habe auch versucht, das net.core.*und die net.ipv4.*Systeme abzustimmen, aber vielleicht habe ich zu wenig Experimente gemacht. OK, ich mache noch ein paar Tests und melde mich.
Sergey
Ich habe noch einmal versucht, sysctls sowohl auf dem Server als auch auf dem Client zu optimieren, aber das hat nicht geholfen.
Sergey
Hast du es mit UDP als Transportprotokoll versucht?
Shodanshok
Ich habe UDP ausprobiert (proto = udp in mount options), aber es funktioniert sogar 1-2 MByte / s langsamer als TCP. Ergebnis war das gleiche Mounten von localhost und von remote host.
Sergey
2

http://veerapen.blogspot.com/2011/09/tuning-redhat-enterprise-linux-rhel-54.html

Das Konfigurieren des Linux-Schedulers auf Systemen mit Hardware-RAID und das Ändern der Standardeinstellung von [cfq] in [noop] verbessert die E / A.

Verwenden Sie den Befehl nfsstat, um den Prozentsatz der Lese- / Schreibvorgänge zu berechnen. Stellen Sie das RAID-Controller-Cache-Verhältnis so ein, dass es übereinstimmt.

Bei hoher Auslastung müssen Sie die Anzahl der NFS-Server-Threads erhöhen.

Konfigurieren Sie die nfs-Threads mit der Option no_delay so, dass sie ohne Verzögerung auf die Festplatte schreiben.

Weisen Sie den Linux-Kernel an, so schnell wie möglich zu löschen, damit die Schreibvorgänge so gering wie möglich gehalten werden. Im Linux-Kernel kann die Häufigkeit des Zurückschreibens fehlerhafter Seiten durch zwei Parameter gesteuert werden.

Verwenden Sie für schnellere Festplattenschreibvorgänge die Option data = journal des Dateisystems und verhindern Sie Aktualisierungen der Dateizugriffszeiten, wodurch zusätzliche Daten auf die Festplatte geschrieben werden. Dieser Modus ist am schnellsten, wenn Daten gleichzeitig von der Festplatte gelesen und auf die Festplatte geschrieben werden müssen, und übertrifft alle anderen Modi

Vasco V.
quelle