NFS Performance revisited

h^2

hat ne Keule +1
Also, ich hatte ja früher schno Probleme mit NFS und nachdem jetzt Server und Client beide auf FreeBSD9.1 sind und auch beide das neue NFS standardmäßig verwenden, habe ich mich entschieden ein paar "Benchmarks".

Zunächst geht es um die nackte NFS-Performance im Vergleich zu netcat, auch nur NFS3 und um die Frage TCP oder UDP. Wenn sich hier die Fragen geklärt haben, werde ich auch NFS4 testen und mit Jumbo-Frames rumspielen.

Die ersten Ergebnisse:
Code:
 CLIENT               TRANSPORT              SERVER       TIME (s)      MiB/s

  tmpfs   >>>>>>>>>>  Netcat   >>>>>>>>>   /dev/null          9        113.70
  tmpfs   >>>>>>>>>>  Netcat   >>>>>>>>>   ZFS (comp)        47         21.78

  tmpfs   >>>>>>>>>>  NFS3 UDP >>>>>>>>>   ZFS (comp)       171          5.98
  tmpfs   >>>>>>>>>>  NFS3 TCP >>>>>>>>>   ZFS (comp)        51         20.07
  tmpfs   >>>>>>>>> OLDNFS3 UDP >>>>>>>>   ZFS (comp)        73         14.02
  tmpfs   >>>>>>>>> OLDNFS3 TCP >>>>>>>>   ZFS (comp)        59         17.36


/dev/null <<<<<<<<<<  Netcat   <<<<<<<<<   tmpfs             10        102.40
/dev/null <<<<<<<<<<  Netcat   <<<<<<<<<   ZFS (comp)        11         93.09

  tmpfs   <<<<<<<<<<  NFS3 UDP <<<<<<<<<   ZFS (comp)        11         93.09
  tmpfs   <<<<<<<<<<  NFS3 TCP <<<<<<<<<   ZFS (comp)       341          3.00
  tmpfs   <<<<<<<<< OLDNFS3 UDP <<<<<<<<   ZFS (comp)        11         93.09
  tmpfs   <<<<<<<<< OLDNFS3 TCP <<<<<<<<   ZFS (comp)        10        102.40
Die ersten vier Zeilen sind schreibend, die zweiten vier sind lesend.

Wie deutlich zu sehen ist, erreiche ich um die 100MiB / s wenn weder NFS noch ZFS im Spiel sind. Ich benutze das einfach als Richtwert für das was ohne Jumbo-Frames theoretisch möglich ist.

Wenn wir die anderen Zahlen analysieren finden wir folgende paradoxe Situation vor:
· Schreibend kann ich mit NFS3 TCP ungefähr ausreizen was auf ZFS möglich scheint [1]
· Lesend kann ich wiederum mit NFS3 UDP ungefähr ausreizen was möglich scheint
· jeweils in die andere Richtung verhalten sich beide sehr schlecht

Könnt ihr sowas auch beobachten? Welche Einstellungen verwendet ihr?

Insbesondere die TCP-Leseperformance ist so miserabel, da ist auf jeden Fall was im Argen. Ich kann später vielleicht noch das Ganze von einem Linux-Client aus testen, dann weiß ich ob der Server oder der Client verantwortlich ist...

Danke!

PS: mount Optionen für NFS3 TCP sind einfach tcp,rw und für UDP udp,rw,rsize=32768,wsize=32768.

[1] Die ZFS performance werde ich nochmal getrennt debuggen, hier ist anzumerken, dass compression, dedup und geli dazu kommen. Ist aber hier auch nicht relevant, da es um die performance im Vergleich zu netcat geht.

edit: OLDNFS Zahlen hinzugefügt
 
Last edited:
Also mit den Zahlen vom alten NFS-Client kann man schon mal sagen, dass der auf jeden Fall zuverlässiger funktioniert, konsistenter ist zwischen UDP und TCP und definitiv den Negativausreißer in der Read-Performance nicht hat.

Letzteren habe ich übrigens noch zwei Mal reproduziert jetzt, nur um sicher zu gehen...
 
Ich habe beim letzten Versuch weder den alten noch den neuen NFS dazu bekommen zuverlässig zu funktionieren. Unabhängig ob UDP oder TCP gewählt war gab es unter Last von mehreren Prozessen immer I/O Fehler.

Und zwar auf localhost!
 
Von mir dazu einige allgemeine Anmerkungen:

- Wenn über Netzwerkdateisysteme (NFS, SAMBA) auf ZFS geschrieben werden soll, sollte der ZPool auf jeden Fall ein Log-Device haben. Sonst wird die Schreibperformance absolut mieserabel sein. Alternativ kann man zu Testzwecken das Syncing im ZPool abschalten, für den produktiven Einsatz ist das aber keine gute Idee. Aber wie du sagst, du kannst ZFS auch so in etwa ausreizen.

- NFS ist eine Hardwaresau erster Klasse. Das betrifft vor allem NFSv4, aber auch der neue NFSv3-Server/Client hat so seine Ansprüche. Ich habe damit z.B. einen bösen Bug in if_age(4) gefunden. Seitdem ich mein Netzwerk modernisiert habe (if_em(4), Cisco Switch, Cat6-Kabel) läuft NFS insgesamt wesentlich besser. Ob das für dich relevant ist, kann ich nicht beurteilen.

- In FreeBSD 9.1 startet der Server lediglich 4 Threads. Das sollte für dich ausreichen, kann aber in Umgebungen mit vielen Clients zum Flaschenhals werden. Man kann den Wert per sysctl erhöhen:
Code:
vfs.nfsd.minthreads: 4
vfs.nfsd.maxthreads: 4
vfs.nfsd.threads: 4
10-CURRENT startet pro CPU einen Thread.

Davon einmal abgesehen, etwas konkreter:

- rsize und wsize sind keine "größer ist besser"-Werte. Je nach Workload und Hardware kann ein zu großer Wert die Leistung genauso wie ein zu kleiner Wert drastisch beschränken. Hier vielleicht man experimentieren.

- "readahead" kann bei lesender Performance einiges bringen. Die Manpage sagt, dass Werte von 0 bis 4 zulässig wären, aber ich erreiche mit dem neuen NFS-Client die beste Leistung bei 8...
 
Hallo,

ich selbst nutze auf der Arbeit ZFS/NFS unter Solaris 11. Mein Erfahrung ist, dass ZFS/NFS in Kombination nicht sehr performant ist - insbesondere da immer synchronisiert wird. Das kann man ausschalten oder eine SSD für das logging (ZIL) nehmen... Ohne SSD und ausschalten habe ich mal verglichen: ca 50000 kleine Dateien erstellen und wieder löschen geht lokal auf dem Server weit mehr als 100 mal schneller als remote. Und das liegt einfach am ZIL (die Aktivitäten habe ich mal dabei loggen lassen). Netzwerk ist dabei ja von untergeordneter Rolle - da werden ja keine Daten geschaufelt...

Das nur als Anmerkung... Ich habe vor, in Zukunft mal MooseFS (und dann unter FreeBSD und nicht Solaris) ausprobieren. Brauche mal ein einfaches, erweiterbares und performantes Dateisystem, und zwar ohne dieses dumme synchronisieren (ich nutze hier noch rsync). Habe gutes gelesen darüber.

Soweit dazu - hoffe, es hilft - Norbert
 
Danke für das Feedback, auch zu ZFS. Da werde ich mir die weite-performance als nächstes angucken, eine SSD für ZIL wäre da auch durchaus denkbar.

Dennoch geht es mir hier gerade um die reine NFS-Performance, die, wie ihr oben seit, ja abhängig von Parametern und Implementierung auch sehr unterschiedlich seien kann. Ich werde die nächste Tage mal ein einen Benchmark zusammen scripten, der das automatisiert, auch mit unterschiedlichen rsizes und wsizes.

Für das Testen unabhängig von dem Server-Dateisystem hätte ich gerne tmpfs verwendet, leider hat es ein Patch der das NFS-exportieren von tmpfs ermöglicht nicht in 9.1 geschafft, und ich hab keinen Bock zu frickeln.
 
Back
Top