NFS Tuning: Difference between revisions

From Lsdf
Jump to navigationJump to search
No edit summary
No edit summary
 
(One intermediate revision by the same user not shown)
Line 1: Line 1:
Es gibt leider 1000 Dinge die bei der Performance von NFS schiefgehen können.
Es gibt leider 1000 Dinge die bei der Performance von NFS schiefgehen können.
Informationen verschaffen diese beiden Befehle:
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
nfsstat
cat /proc/net/snmp
cat /proc/net/snmp
iperf -c 141.52.212.64 -P 2
mount



Es gibt die folgenden Optimierungen:
Es gibt u.a. folgende Optimierungen:


=Mount Optionen=
=Mount Optionen=
Line 36: Line 41:
=Netzwerk (mit Bezug auf NFS)=
=Netzwerk (mit Bezug auf NFS)=


* Input/Output-Qs:
==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.
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.


Line 43: Line 48:
/etc/rc.d/init.d/nfs restart
/etc/rc.d/init.d/nfs restart


==IP-Fragmentation optimieren==
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 524288 > /proc/sys/net/ipv4/ipfrag_high_thresh
echo 262144 > /proc/sys/net/ipv4/ipfrag_low_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:
Setze noch folgende Werte, falls nicht ohnehin schon:
echo 0 > /proc/sys/net/ipv4/tcp_timestamps # Timestamp header...
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_sack # Selective ACK
Line 56: Line 61:
bei vielen Retransmissions sinnvoll --> /proc/net/snmp
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).
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).

Latest revision as of 08:39, 1 April 2015

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