Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
freebsd:nfs_highlatency [2006/03/29 15:53]
hotbox created
freebsd:nfs_highlatency [2010/01/12 13:29] (current)
Line 1: Line 1:
 +====== 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
 +
 +<​code>​
 +Ajouter dans votre /​etc/​rc.conf :
 +
 +nfs_server_enable="​YES"​
 +mountd_enable="​YES"​
 +rpc_lockd_enable="​YES"​
 +rpc_statd_enable="​YES"​
 +rpcbind_enable="​YES"​
 +</​code>​
 +
 +<​code>​
 +Contenu de votre /​etc/​exports :
 +
 +/data -mapall=jardinier _IP_DU_LAPTOP_
 +</​code>​
 +
 +  * Sur votre laptop gazon
 +
 +<​code>​
 +Ajouter dans votre rc.conf :
 +
 +nfs_client_enable="​YES"​
 +amd_enable="​YES"​
 +amd_flags="​-a /.amd_mnt -l syslog /mnt/nfs /​etc/​amd.map"​
 +</​code>​
 +
 +Vous noterez au passage le "/​mnt/​nfs"​ qui est l'​endroit où vous accéderez à votre serveur.
 +Par exemple : 
 +
 +<​code>​
 +cd /​mnt/​nfs/​terreau/​data
 +</​code>​
 +
 +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 :
 +
 +<​code>​
 +kernel: nfs server terreau:/​data:​ not responding
 +</​code>​
 +
 +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 :
 +
 +<​code>​
 +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
 +</​code>​
 +
 +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)