{{tag>nfs performance tuning mtu sysctl backup memory page allocation failure}}
====== Tuning de performance NFS ======
Je n'ai pas la prétention d'être exhaustif, je vais juste détailler les solutions que j'ai validé.
===== Options de montage coté client =====
* Ajouter les options **noatime** et **nodiratime** pour ne pas que le serveur n'ait à modifier (donc écrire) les dates d’accès respectivement aux fichier/répertoires pour chaque accès en lecture effectué.
* Modifier les tailles de **rsize** et **wsize** qui spécifient le nombre d'octets de données que le client et le serveur s'échangent pour les requêtes de lecture/écriture. Ces valeurs doivent être multiples de 1024 et la valeur optimale dépendra de votre utilisation. Je suis passé de 8192 a 32768.
Les options de montage coté client sont donc maintenant (montage NFSv3):
rw,hard,intr,nodev,exec,nosuid,rsize=32768,wsize=32768,noatime,nodiratime,vers=3
certains auront remarqué l'utilisation de **intr** qui est obsolète sur les noyaux supérieurs au 2.6.25
===== Augmentation de la MTU =====
Ayant la chance d'avoir un réseau séparé pour ces transferts NFS j'ai pu augmenter la MTU : passage de la valeur par défaut 1500 a 7200. Pourquoi 7200 ? et bien juste parce que c'est la valeur maximale permise par l'une des cartes réseau sous linux :'(
Pour modifier la MTU temporairement, en remplaçant bien sur eth0 par le nom de votre carte : ifconfig eth0 mtu 7200
Pour que cette modification persiste au redémarrage, ajouter une ligne "mtu 7200" dans le fichier /etc/network/interfaces dans la section de votre carte, comme dans l'exemple ci dessous (adresse statique) :
[...]
auto eth3
iface eth3 inet static
address 192.168.2.1
netmask 255.255.255.0
network 192.168.2.0
broadcast 192.168.2.255
mtu 7200
[...]
Dans le cas ou vous utilisez du DHCP, il faut ruser un peu en ajoutant "post-up /sbin/ifconfig eth0 mtu 7200" dans la section correspondant à votre interface dans le fichier /etc/network/interfaces :
[...]
auto eth3
iface eth3 inet dhcp
post-up /sbin/ifconfig eth3 mtu 7200
[...]
* Il faudra que la MTU de chacune des machines d'un même réseau soit la même : il faut donc la changer sur chacune des machines ou sur aucune
* Il faut que le switch du réseau soit capable de gérer des MTU supérieures a 1500 ( "jumbo frames" ) : les switchs recents supportent souvent jusqu'a 9000
===== Problème de Page allocation failure =====
Suite à l'augmentation de débit réseau des messages "page allocation failure" ont commencé a apparaitre en boucle dans le dmesg et les transferts réseau étaient gelés.
Ce problème apparait pour d'autres drivers que le mien : https://bugzilla.kernel.org/show_bug.cgi?id=12135#c4
Pour ne plus afficher ce message d'avertissement comme quoi le réseau alloue la mémoire plus vite que le système de mémoire virtuelle ne la réclame :
Pour connaitre votre valeur actuelle (dépend de la quantité de RAM) :
$ cat /proc/sys/vm/min_free_kbytes
Vous pouvez maintenant l'augmenter progressivement jusqu’à ce que le message cesse d'apparaitre en boucle, pour ma part une valeur de 4096 devrait suffire.
Ne bien sur pas diminuer la valeur présente si vous avez deja l'erreur ;p
Pour effectuer le changement temporairement : echo 4096 > /proc/sys/vm/min_free_kbytes
Puis une fois que vous avez la bonne valeur pour que ce changement soit permanent :
# cat <> /etc/sysctl.d/90-user-memory.conf
# it is possible to require a minimum number of free pages by setting the vm.min_free_kbytes parameter
vm.min_free_kbytes=4096
EOF
===== Impact sur les performances =====
En utilisant ces reglages sur le materiel suivant :
* serveur NFS : atom dualcore N330 1.6GHz, 2 Go RAM, carte reseau intel 82541GI Gb
* client NFS : athlon 1800xp, 512 Mo RAM, carte reseau dlink dge 528t Gb
Un rsync sur de gros fichiers lancé sur le client (copie du NFS vers disque local) : passage de 6-7Mo/s a 13,5 Mo/s
Performances brutes copie gros fichier (NFS vers disque local, en utilisant dd) : 40 Mo/s