it-swarm.com.de

NFS schlechte Schreibleistung

Ich habe zwei Maschinen mit 10-Gbit-Ethernet verbunden. Lassen Sie einen von ihnen NFS-Server und ein anderer NFs-Client sein.

Das Testen der Netzwerkgeschwindigkeit über TCP mit iperf zeigt einen Durchsatz von ~ 9,8 Gbit/s in beide Richtungen, sodass 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.

Der /etc/exports des Servers lautet:

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

Der Client stellt diese Freigabe mit den folgenden Optionen auf dem lokalen /mnt/test 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 Clientcomputer herunterzuladen, erhalte ich eine Leistung von ~ 130-140 MByte/s, die der Leistung der lokalen Festplatte des Servers nahe kommt, sodass sie zufriedenstellend ist.

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 bis 20 MB/s an und hört auf zu steigen. Manchmal "hängt" die Freigabe einige Minuten lang, bevor der Upload tatsächlich beginnt, d. H. Der Datenverkehr zwischen Hosts wird nahe Null, und wenn ich ls /mnt/test ausführe, wird er innerhalb von ein oder zwei Minuten nicht zurückgegeben. Dann kehrt der Befehl ls 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 MB/s), führe ich iptraf-ng aus und es wird ~ 190 Mbit/s Datenverkehr auf der Netzwerkschnittstelle angezeigt, sodass 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 nahezu vollständige 100-Mbit-Netzwerkauslastung. Der Upload erfolgt nicht schneller als Hunderte von Kilobyte pro Sekunde, sodass die Netzwerkauslastung sehr gering ist (2,5 Mbit/s gemäß iptraf-ng). .

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

  • sync oder async

  • noatime

  • nein hard

  • rsize und wsize sind in meinen Beispielen maximal, daher habe ich versucht, sie in mehreren Schritten auf 8192 zu verringern

. Ich habe versucht, Client- und Servercomputer zu wechseln (NFS-Server auf früheren Clients einrichten und umgekehrt). Darüber hinaus gibt es sechs weitere Server mit derselben Konfiguration, sodass ich versucht habe, sie in verschiedenen Varianten aneinander zu mounten. Gleiches Ergebnis.

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

5. sysctl 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 bekomme ich das gleiche Ergebnis: Der Download von /mnt/testmount/ ist schnell, der Upload zu /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 einwandfrei 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_caches wurde 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 fehlen mir? Wie kann man NFS schnell und ohne Probleme zum Schreiben bringen?

21
Sergey

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 (d. H. Keine SSD), erfordert dies durchschnittlich mindestens eine halbe Umdrehung der Festplatte pro Schreibvorgang, was die Ursache für die Verlangsamung ist.

Bei Verwendung der asynchronen Einstellung bestätigt der Server den Schreibvorgang sofort an den Client, wenn er verarbeitet, aber noch nicht auf die Festplatte geschrieben wurde. Dies ist etwas unzuverlässiger, z. B. im Falle eines Stromausfalls, wenn der Client eine Bestätigung für eine Operation erhalten hat, die nicht stattgefunden hat. Es bietet jedoch eine enorme Steigerung der Schreibleistung.

(bearbeiten) 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 Problem mit der Leistungsverschlechterung ist. Ich hatte einmal genau die gleiche Anzeige mit einem identischen Setup. Vielleicht testest du es noch einmal. Haben Sie die asynchrone Option bei der Exportanweisung des Servers UND bei der Mount-Operation auf dem Client gleichzeitig angegeben?

4
Bernd Gloss

Dies kann ein Problem in Bezug auf Paketgröße und Latenz sein. Versuche Folgendes:

Der Bericht unterstützt Ihre Ergebnisse.

2
shodanshok

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] führt zu E/A-Verbesserungen.

Verwenden Sie den Befehl nfsstat, um den Prozentsatz der Lese-/Schreibvorgänge zu berechnen. Stellen Sie das Cache-Verhältnis des RAID-Controllers entsprechend ein.

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

Konfigurieren Sie die NFS-Threads so, dass sie mit der Option no_delay unverzüglich auf die Festplatte schreiben.

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

Verwenden Sie für schnellere Schreibvorgänge auf der Festplatte die Option Dateisystemdaten = Journal und verhindern Sie Aktualisierungen der Dateizugriffszeiten, die an sich dazu führen, dass zusätzliche Daten auf die Festplatte geschrieben werden. Dieser Modus ist der schnellste, wenn Daten gleichzeitig von der Festplatte gelesen und auf die Festplatte geschrieben werden müssen, wo er alle anderen Modi übertrifft

2
Vasco V.