NFS Tuning: Difference between revisions

From Lsdf
Jump to navigationJump to search
(Created page with "test")
 
No edit summary
Line 1: Line 1:
Es gibt leider 1000 Dinge die schiefgehen können.
test
Informationen verschaffen diese beiden Befehle:
nfsstat
cat /proc/net/snmp

Es gibt die folgenden Optimierungen:

=Mount Optionen=
* tcp statt udp benutzen, da TCP FlowControl beherrscht und mit Netzen verschiedener Geschwindigkeiten und komplexen Routings schneller sein kann.

* intr und hard verbessern das Timeoutverhalten, der Client kann schneller auf einen Timeout reagieren und Sendevorgänge selbstständig canceln.

* noatime macht sich bei "langen Leitungen" immer gut.

* rsize,wsize machen wahrscheinlich am meisten aus. Eigentlich sollten Server und Client die richtigen Werte selbst aushandeln, das klappt aber
nicht immer, gerade wenn dazwischen viel geroutet wird geht das schief. Probiere auch unsymmetrische Werte aus, (ja nach Vorgang) sind beim
Lesen kleine Blockgrößen schneller als große, beim Schreiben ist's allerdings dann umgekehrt.

Bei NFSv3 sind die maximalen Blockgrößen hardgecoded (bis zu 64K), stehn in /include/linux/nfsd/const.h (--> NFSSVC_MAXBLKSIZE), bei aktuellen vanilla Kerneln sollte die maximale Blockgröße 32K sein).

Am besten einfach mal verschiedene Blockgrößen testen, dann sieht man schnell, was besser ist. Vielleicht mit 8K, 16K, 32K anfangen und schauen, und dann eben alles dazwischen testen. Da reicht ja schon ein for loop:

mount -o rsize=...,wsize=...,tcp,intr ... ...
time dd if=... of=... bs=<blocksize>
umount ...

==Konkretes Beispiel==
/etc/fstab:
lsmb01.lsdf.kit.edu:/ibm/gpfs/lsdf/anka /mnt/ANKA-LSDF-DDN nfs defaults,rw,tcp,hard,intr,rsize=32768,wsize=32768 0 0


Zwischen Tests bitte immer unmounten und neu mounten (kein remount!) um die Caches zu leeren. Ganz sauber wäre es natürlich jeden Test ein paar
mal laufen zu lassen und den Durchschnitt zu nehmen. Ach ja und du solltest ein (urandom) File vom NFS lesen und nach /dev/null schreiben.
Nur um sicher zu gehen, dass die Platte nicht schuld ist.

=Netzwerk (mit Bezug auf NFS)=

* Input/Output-Qs:
Die Kernel-Parameter [rw]mem_default und [rw]mem_max auf 256K erhöhen (defaulten bei Vanilla Kerneln bei 64K, bei neueren CPUs ist mehr aber sinnvoller). Das sind die Speicherlimits der Input/Output-Queues.

echo 262144 > /proc/sys/net/core/rmem_default
echo 262144 > /proc/sys/net/core/rmem_max
/etc/rc.d/init.d/nfs restart

Das erste setzt den oberen Threshold. Sobald so viele Bytes in fragmentierten Paketen ankommen, wird verworfen bis der untere Threshold erreicht wird. Sollte eigentlich kein Problem darstellen, wenn deine Pakete klein genug sind...
* IP-Fragmentation optimieren:
echo 524288 > /proc/sys/net/ipv4/ipfrag_high_thresh
echo 262144 > /proc/sys/net/ipv4/ipfrag_low_thresh


* Setze noch folgende Werte, falls nicht ohnehin schon:
echo 0 > /proc/sys/net/ipv4/tcp_timestamps # Timestamp header...
echo 1 > /proc/sys/net/ipv4/tcp_sack # Selective ACK
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling # Large TCP Windows

bei vielen Retransmissions sinnvoll --> /proc/net/snmp

* Eventuell bringt es was, die MTU manuell anzupassen (--> ping -f und -s oder tracepath; ICMP muss dann durchgelassen werden) und den Output von netstat -s, /proc/net/snmp. In letzterem will man möglichst keine drops von reassemblierten Packeten haben (--> IP: ReasmFails).

Revision as of 08:32, 1 April 2015

Es gibt leider 1000 Dinge die schiefgehen können. Informationen verschaffen diese beiden Befehle:

   nfsstat
   cat /proc/net/snmp

Es gibt die folgenden Optimierungen:

Mount Optionen

  • tcp statt udp benutzen, da TCP FlowControl beherrscht und mit Netzen verschiedener Geschwindigkeiten und komplexen Routings schneller sein kann.
  • intr und hard verbessern das Timeoutverhalten, der Client kann schneller auf einen Timeout reagieren und Sendevorgänge selbstständig canceln.
  • noatime macht sich bei "langen Leitungen" immer gut.
  • rsize,wsize machen wahrscheinlich am meisten aus. Eigentlich sollten Server und Client die richtigen Werte selbst aushandeln, das klappt aber

nicht immer, gerade wenn dazwischen viel geroutet wird geht das schief. Probiere auch unsymmetrische Werte aus, (ja nach Vorgang) sind beim Lesen kleine Blockgrößen schneller als große, beim Schreiben ist's allerdings dann umgekehrt.

Bei NFSv3 sind die maximalen Blockgrößen hardgecoded (bis zu 64K), stehn in /include/linux/nfsd/const.h (--> NFSSVC_MAXBLKSIZE), bei aktuellen vanilla Kerneln sollte die maximale Blockgröße 32K sein).

Am besten einfach mal verschiedene Blockgrößen testen, dann sieht man schnell, was besser ist. Vielleicht mit 8K, 16K, 32K anfangen und schauen, und dann eben alles dazwischen testen. Da reicht ja schon ein for loop:

  mount -o rsize=...,wsize=...,tcp,intr ... ...
  time dd if=... of=... bs=<blocksize>
  umount ...

Konkretes Beispiel

/etc/fstab:

lsmb01.lsdf.kit.edu:/ibm/gpfs/lsdf/anka    /mnt/ANKA-LSDF-DDN      nfs defaults,rw,tcp,hard,intr,rsize=32768,wsize=32768 0 0


Zwischen Tests bitte immer unmounten und neu mounten (kein remount!) um die Caches zu leeren. Ganz sauber wäre es natürlich jeden Test ein paar mal laufen zu lassen und den Durchschnitt zu nehmen. Ach ja und du solltest ein (urandom) File vom NFS lesen und nach /dev/null schreiben. Nur um sicher zu gehen, dass die Platte nicht schuld ist.

Netzwerk (mit Bezug auf NFS)

  • Input/Output-Qs:

Die Kernel-Parameter [rw]mem_default und [rw]mem_max auf 256K erhöhen (defaulten bei Vanilla Kerneln bei 64K, bei neueren CPUs ist mehr aber sinnvoller). Das sind die Speicherlimits der Input/Output-Queues.

 echo 262144 > /proc/sys/net/core/rmem_default
 echo 262144 > /proc/sys/net/core/rmem_max
 /etc/rc.d/init.d/nfs restart

Das erste setzt den oberen Threshold. Sobald so viele Bytes in fragmentierten Paketen ankommen, wird verworfen bis der untere Threshold erreicht wird. Sollte eigentlich kein Problem darstellen, wenn deine Pakete klein genug sind...

  • IP-Fragmentation optimieren:
echo 524288 > /proc/sys/net/ipv4/ipfrag_high_thresh
echo 262144 > /proc/sys/net/ipv4/ipfrag_low_thresh


  • Setze noch folgende Werte, falls nicht ohnehin schon:
echo 0 > /proc/sys/net/ipv4/tcp_timestamps       # Timestamp header...
echo 1 > /proc/sys/net/ipv4/tcp_sack             # Selective ACK
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling   # Large TCP Windows

bei vielen Retransmissions sinnvoll --> /proc/net/snmp

  • Eventuell bringt es was, die MTU manuell anzupassen (--> ping -f und -s oder tracepath; ICMP muss dann durchgelassen werden) und den Output von netstat -s, /proc/net/snmp. In letzterem will man möglichst keine drops von reassemblierten Packeten haben (--> IP: ReasmFails).