Table des matières
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
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
[...]
[...] 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.
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
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