Optimieren des NFS-Client / Server-Stacks


10

Ich habe einen CentOS 5 VMWare-Server, der über NFS eine Verbindung zu einem OpenSolaris 2009.06-Computer herstellt, auf dem sich die Disk-Images befinden. Meine virtuellen Maschinen scheinen an langsame E / A gebunden zu sein, daher möchte ich alles tun, um die Verbindung zu optimieren.

Ich bin mir nicht sicher, wie ich den Durchsatz auf einem Produktionssystem am besten messen kann, aber einige unwissenschaftliche Tests mit dd bs=1024k count=400OpenSolaris-Schreibvorgängen (OpenSolaris) von ~ 1,6 GB / s und Remote-Schreibvorgängen (CentOS) mit ~ 50 MB / s. Ich stelle mir vor, dass diese niedriger sind als das, was ich tatsächlich bekomme, da derzeit 7 VMs über die Verbindung laufen.

Derzeit sind die beiden Maschinen direkt mit gigE verbunden, wobei auf beiden Netzwerkkarten Jumbo-Frames aktiviert sind (MTU = 9000). Ansonsten wurden keine Optimierungen vorgenommen. NFS-Mount / Export verwendet Standardeinstellungen.

Wo soll ich anfangen, Knöpfe zu drehen, um die Leistung zu verbessern?


Der Durchsatz sollte nicht zu wichtig sein. Was ist die zugrunde liegende Hardwarespezifikation auf dem System, auf dem OpenSolaris ausgeführt wird? Wie viele Scheiben / Spindeln haben Sie? Wie viel RAM?
ewwhite

12 Festplatten verteilt auf 2 raidz1-Pools auf einem Controller mit 4 GB RAM. Wenn der Durchsatz keine Rolle spielt, auf welche Metrik sollte ich achten?
Sysadminicus

Was bedeutet cat / proc / mounts? grep solaris_server auf dem Linux-Client sagen? Verschiedene Linux-Versionen haben unterschiedliche Standard-Mount-Optionen :(
James

10.10.1.1:/tank/vm / vm nfs rw, vers = 3, rsize = 1048576, wsize = 1048576, hart, proto = tcp, timeo = 600, retrans = 2, sec = sys, addr = 10.10.1.1 0 0
Sysadminicus

Bei einigen Editionen von Solaris 10 war nfs3 instabil. Wenn Sie zu nfs4 wechseln können, sehen Sie möglicherweise einige Verbesserungen. Aber, wie andere Kommentatoren gesagt haben, 50MB Sehen / s über einen GigE - Link ist in der Nähe der höchst Sie können sehen
warren

Antworten:


2

Um dies zu verdeutlichen, erhalten Sie mit NFS 50 MB / s über eine einzelne Gb-Ethernet-Verbindung?

Auf dem Host-Server wird CentOS mit installiertem VMware-Server ausgeführt, auf dem wiederum die 7 VMs ausgeführt werden. Gibt es einen bestimmten Grund, warum Sie sich für CentOS und VMware Server entschieden haben, anstatt für VMware ESXi, eine leistungsstärkere Lösung?

Die 50 MB / s sind nicht großartig, aber sie liegen nicht viel unter dem, was Sie von einem einzelnen Gbit-Netzwerkkabel erwarten würden. Sobald Sie die oben erwähnten NFS-Optimierungen vorgenommen haben, werden Sie sich vielleicht 70 ansehen. 80 MB / s Optionen entlang der Linie von:

"ro, hard, intr, retrans = 2, rsize = 32768, wsize = 32768, nfsvers = 3, tcp"

sind wahrscheinlich für Sie an beiden Enden des Systems vernünftig.

Um darüber hinauszukommen, müssen Sie die Netzwerkkarten paarweise zusammenfassen, was Ihren Durchsatz um etwa 90% erhöhen sollte. Möglicherweise benötigen Sie einen Switch, der 802.3ad unterstützt, um die beste Leistung bei der Link-Aggregation zu erzielen .

Eine Sache, die ich jedoch vorschlagen würde, ist, dass Ihr E / A-Durchsatz auf der OpenSolaris-Box verdächtig hoch klingt, 12 Festplatten wahrscheinlich keinen Durchsatz von 1,6 GB / s unterstützen und dies möglicherweise von Solaris + ZFS stark zwischengespeichert wird.


Wir verwenden CentOS + VMWare Server, weil es kostenlos ist. Zuletzt habe ich überprüft, ob ESXi ziemlich teuer ist. Laut / proc / mounts beträgt die Größe von rsize / wsize derzeit 1048576. Nur um dies zu bestätigen, denken Sie, dass eine Reduzierung auf 32 KB zur Erhöhung der Geschwindigkeit beitragen wird? Ich werde die Link-Aggregation überprüfen. Würde ich dies an beiden Enden der Verbindung tun oder nur an einem? Ich denke, Sie haben Recht damit, dass das E / A zwischengespeichert wird. Wenn Sie meine DVDs auf über 512 MB erhöhen, sinkt die Übertragungsrate erheblich (zwischen 50 und 120 MB / s).
Sysadminicus

Ich habe in der Benutzeroberfläche nicht mehr die Möglichkeit, eine Antwort auf diese Frage zu akzeptieren, aber ich habe dies positiv bewertet, da die Link-Aggregation anscheinend meine beste Wahl sein wird.
Sysadminicus

Entschuldigen Sie die verspätete Antwort. ESXi ist jetzt in seiner Grundform kostenlos und bietet Ihnen eine Leistungssteigerung. Es verfügt jedoch nur über eingeschränkte Funktionen und ist daher möglicherweise nicht für Sie geeignet. Sie müssen die Link-Aggregation an beiden Enden der Netzwerkverbindung durchführen, um eine wesentliche Verbesserung zu erzielen. Hoffe, es funktioniert für Sie
Ewan Leith

1

Für unsere RHEL / CentOS 5-Maschinen verwenden wir die folgenden Mount-Flags

nfsvers = 3, tcp, timeo = 600, retrans = 2, rsize = 32768, wsize = 32768, hard, intr, noatime

Neuere Linux-Kernel-Versionen unterstützen noch größere rsize / wsize-Parameter, aber 32k ist das Maximum für den 2.6.18-Kernel in EL5.

Auf den NFS-Servern hilft no_wdelay zumindest für Linux angeblich, wenn Sie einen Festplattencontroller mit BBWC haben. Wenn Sie das Noatime-Flag auf den Clients verwenden, ist es wahrscheinlich sinnvoll, die Dateisysteme auch mit Noatime auf den Servern bereitzustellen.

Und wie bereits erwähnt, kümmern Sie sich nicht um UDP. Bei Netzwerken mit höherer Geschwindigkeit (1 GbE +) besteht eine geringe Wahrscheinlichkeit, dass eine Umgehung der Sequenznummer zu einer Beschädigung der Daten führt, jedoch nicht Null. Wenn die Möglichkeit eines Paketverlusts besteht, ist TCP leistungsfähiger als UDP.

Wenn Sie sich nicht so viele Sorgen um die Datenintegrität machen, kann die Exportoption "Async" eine erhebliche Leistungsverbesserung darstellen (das Problem bei Async besteht darin, dass Sie möglicherweise Daten verlieren, wenn der Server abstürzt).

Zumindest für Linux-Server müssen Sie außerdem sicherstellen, dass genügend NFS-Server-Threads ausgeführt werden. Die Standardeinstellung 8 ist einfach viel zu niedrig.


1

Ich habe einmal einen Test mit einem Dell R710, 1 CPU, 4 GB RAM, 6 SATA-Festplatte mit RAID-10 durchgeführt. Der Client war ein sun x2100, sowohl mit CentOS 5.3 als auch mit den oben genannten nfs-Parametern

"ro, hard, intr, retrans = 2, rsize = 32768, wsize = 32768, nfsvers = 3, tcp"

beidseitig mittags montiert.

Ich habe auch auf nfsds bis 256 gestoßen und den Noop-Scheduler für den Perc6-Raid-Controller verwendet. Eine andere Sache, die ich tat, war, die Partitionen an der 64K-Streifengröße des RAID-Controllers auszurichten.

dann habe ich die nfs-leistung mit dd gemessen - für lesungen konnte ich die gigE-rohr füllen, aber für schreibvorgänge konnte ich nur geringfügig bessere ergebnisse erzielen als du. Bei aktiviertem Async konnte ich 70 bis 80 MB / s erreichen, aber Async war für mich keine Option.

Vielleicht können Sie mit nfs über einen gigE-Link nicht mehr erreichen?


1

Versuchen Sie Folgendes: Deaktivieren Sie das ZFS Intent Log (ZIL) vorübergehend auf dem OpenSolaris NFS-Server mit den folgenden zwei Schritten

  1. echo zil_disable/W0t1 | mdb -kw
  2. Hängen Sie die Testpartition erneut ein

Dann erneut testen. Sie können zilstat verwenden , um sicherzustellen, dass der ZIL wirklich keine E / A mehr enthält. Wenn der Test schneller ausgeführt wird, wissen Sie, dass das Leistungsproblem etwas mit der ZIL zu tun hat. Wenn es immer noch langsam läuft, wissen Sie, dass der ZIL nicht der Schuldige ist und dass die Verwendung einer SSD für den ZIL auch nicht hilft. Weitere Informationen zum ZIL finden Sie im ZFS Evil Tuning Guide .

Eine andere Möglichkeit wäre, den Netzwerkverkehr (z. B. mit Wireshark) zu erfassen und festzustellen, ob Probleme auftreten, z. B. mit den Jumbo-Frames. Stellen Sie sicher, dass die Pakete auf dem Kabel so aussehen, wie Sie es von Ihrer Konfiguration erwarten. Gibt es eine schlechte Fragmentierung? Gibt es erneute Übertragungen?


0

Das Erhöhen der Nutzlastgrößen für Lesen und Schreiben kann hilfreich sein. Besonders in Verbindung mit Jumbo-Frames.

Ich finde 32k optimal.

rsize=32768,wsize=32768

Die Umstellung auf UDP-Transport ist natürlich schneller als TCP, da dadurch der Aufwand für die Übertragungssteuerung gespart wird. Dies gilt jedoch nur für zuverlässige Netzwerke, in denen NFSv4 nicht verwendet wird.


Es sieht so aus, als würde CentOS eine Verbindung mit NFSv3 herstellen. Gibt es in NFSv4 einen Wert für unseren Anwendungsfall? Ich würde sagen, das Netzwerk ist ziemlich zuverlässig, da es nur ein Crossover-Kabel zwischen den beiden Netzwerkkarten gibt.
Sysadminicus

2
UDP ist den Aufwand nicht wert. Halten Sie sich an TCP. Ich würde nicht empfehlen, NFSv4 zu testen, bis v3 ordnungsgemäß funktioniert.
James

0

Die NFS-Leistung unter ZFS wird durch die Verwendung einer SSD für das ZFS-Absichtsprotokoll (ZIL) erheblich verbessert, da dies die Latenz von Vorgängen verringert. Dieser Thread zu VMWare NFS zur ZFS-Leistung in den OpenSolaris NFS- und ZFS-Mailinglisten enthält weitere Informationen, einschließlich eines Benchmark-Tools, um festzustellen, ob die ZIL-Leistung der Engpass ist.


0

Zu Ihrer Information, der Befehl dd schreibt in den Cache und keine Festplatte. Dies kann zu verrückten Zahlen wie 1,6 G / s führen, da Sie unter Solaris in den RAM und nicht in die Festplatte schreiben. Mit "-oflag = sync" können Sie Schreibvorgänge auf die Festplatte erzwingen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.