Je n'ai pas la prétention d'être exhaustif, je vais juste détailler les solutions que j'ai validé.
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
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 [...]
[...] auto eth3 iface eth3 inet dhcp post-up /sbin/ifconfig eth3 mtu 7200 [...]
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.
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 <<EOF >> /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
En utilisant ces reglages sur le materiel suivant :
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