NFS, AMD et ton lien à 3KBps

Intro

Alors voilà, vous avez eu la superbe idée de partager vos données en wireless (via NFS), en ajoutant un zeste d'IPsec avec des certifs afin de vous protèger des vaporisations OGM de votre méchant ragondin de voisin, entre votre laptop du jardin et votre serveur (le terreau de vos plantations). En plus de cela, l'idée d'éviter de faire des mount dans tous les sens vous a mis en relation étroite avec AMD ( Automatic Mount Deamon, pas le constructeur). Un coup de doc FreeBSD et de “googlehisteria” vous a rassuré sur la faisabilité de la chose et vous avez mis en pratique le tout.

Petit rappel

  • Sur votre serveur
Ajouter dans votre /etc/rc.conf :

nfs_server_enable="YES"
mountd_enable="YES"
rpc_lockd_enable="YES"
rpc_statd_enable="YES"
rpcbind_enable="YES"
Contenu de votre /etc/exports :

/data -mapall=jardinier _IP_DU_LAPTOP_
  • Sur votre laptop gazon
Ajouter dans votre rc.conf :

nfs_client_enable="YES"
amd_enable="YES"
amd_flags="-a /.amd_mnt -l syslog /mnt/nfs /etc/amd.map"

Vous noterez au passage le “/mnt/nfs” qui est l'endroit où vous accéderez à votre serveur. Par exemple :

cd /mnt/nfs/terreau/data

Le “/.amd_mnt” étant le répertoire réel des opérations de montages. Vous pouvez très bien simplifier la chose avec un lien qui liera directement ce répertoire avec celui de votre choix.

Seulement voilà, lors d'une grosse copie de fichiers (plusieurs petits ou un gros bien lourd), votre noyau (celui du laptop-du-jardin) rouspète et dit :

kernel: nfs server terreau:/data: not responding

Bien évidemment, on se rend compte rapidement que le processus en question (le plus souvent un cp) se met en status D (uninterruptible wait) et vous voilà bien embêté (la fatalité se résumant à un reboot et à un gros fsck pour sortir du cauchemard).

Las de cette situation, j'ai passé quelques heures dans les pages man de mount_nfs(8) et consorts pour sortir la méthode de plantation suivante :

dans votre /etc/amd.map

/defaults       type:=host;fs:=${autodir}/${rhost}/host;rhost:=${key}
*               opts:=rw,intr,soft,dumptimer,grpid,resvport,vers=3,tcp,nosuid,nodev,timeo=30

Une petite explication s'impose : Par défaut, NFS utilise le protocole UDP et estime dynamiquement le temps de retransmission d'une trame. En désactivant celui-ci (dumbtimer) et en lui mettant une valeur assez grande (timeo) on arrive à un résultat satisfaisant lorsque la latence de votre liaison est trop élevée.

Si en plus de cela on passe du protocole UDP à TCP, on améliore grandement la fiabilité du transfert au détriment de la performance (mais, entre nous, changer le type du lien serait bien plus efficace dans ce cas.)

Notez le intr qui rend le processus mount interruptible juste au cas où…

Enfin la méthode n'a été pour le moment testée que sous FreeBSD 6.0R.. Mais sans doute est-elle reproductible sur les autres BSD ?

Changelog

  • 29/03/2006 Création du tips par hotbox
freebsd/nfs_highlatency.txt · Last modified: 2010/01/12 13:29 (external edit)