NFS Tuning

From Lsdf
Revision as of 08:39, 1 April 2015 by Marcus (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Es gibt leider 1000 Dinge die bei der Performance von NFS schiefgehen können. Informationen verschaffen u.a. diese beiden Befehle, die uns helfen können Fehler zu finden. Beim eröffnen eines Tickets [helpdesk.lsdf.kit.edu] wären diese infos hilfreich

   ifconfig
   ip route
   nfsstat
   cat /proc/net/snmp
   iperf -c 141.52.212.64 -P 2
   mount


Es gibt u.a. folgende 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

IP-Fragmentation optimieren

echo 524288 > /proc/sys/net/ipv4/ipfrag_high_thresh
echo 262144 > /proc/sys/net/ipv4/ipfrag_low_thresh

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...

TCP Tuning

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

MTU

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).