Il y a quelques jours, j'ai remarqué quelque chose d'assez étrange (du moins pour moi). J'ai exécuté rsync en copiant les mêmes données et en les supprimant ensuite sur un montage NFS, appelé /nfs_mount/TEST
. Cette /nfs_mount/TEST
est hébergé/exporté à partir de nfs_server-eth1
. Le MTU sur les deux interfaces réseau est de 9000, le commutateur entre les deux supporte également les trames jumbo. Si je fais rsync -av dir /nfs_mount/TEST/
J'obtiens une vitesse de transfert réseau de X MBps. Si je fais rsync -av dir nfs_server-eth1:/nfs_mount/TEST/
J'obtiens une vitesse de transfert réseau d'au moins 2X MBps. Mes options de montage NFS sont les suivantes nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp
.
En résumé, les deux transferts passent par le même sous-réseau, les mêmes fils, les mêmes interfaces, lisent les mêmes données, écrivent dans le même répertoire, etc. La seule différence est que l'un passe par NFSv3, l'autre par rsync.
Le client est Ubuntu 10.04, le serveur Ubuntu 9.10.
Comment se fait-il que rsync soit aussi rapide ? Comment faire pour que NFS atteigne cette vitesse ?
T
Edit : please note I use rsync to write to NFS share or to SSH into the NFS server and write locally there. Dans les deux cas, je fais rsync -av
en commençant par effacer le répertoire de destination. Demain, j'essaierai avec une copie simple.
Edit2 (informations complémentaires) : La taille des fichiers varie de 1KB à 15MB. Les fichiers sont déjà compressés, j'ai essayé de les compresser davantage sans succès. J'ai fait tar.gz
de ce fichier dir
. Voici le modèle :
rsync -av dir /nfs_mount/TEST/
= transfert le plus lent ;rsync -av dir nfs_server-eth1:/nfs_mount/TEST/
= rsync le plus rapide avec les trames jumbo activées ; sans les trames jumbo, c'est un peu plus lent, mais toujours nettement plus rapide que le rsync directement vers NFS ;rsync -av dir.tar.gz nfs_server-eth1:/nfs_mount/TEST/
= à peu près la même chose que son équivalent non-tar.gz ;
Tests avec cp
y scp
:
cp -r dir /nfs_mount/TEST/
= légèrement plus rapide quersync -av dir /nfs_mount/TEST/
mais reste nettement plus lent que lersync -av dir nfs_server-eth1:/nfs_mount/TEST/
.scp -r dir /nfs_mount/TEST/
= le plus rapide au classement général, dépasse légèrementrsync -av dir nfs_server-eth1:/nfs_mount/TEST/
;scp -r dir.tar.gz /nfs_mount/TEST/
= à peu près la même chose que son équivalent non-tar.gz ;
Conclusion, sur la base de ces résultats : Pour ce test, il n'y a pas de différence significative entre l'utilisation d'un gros fichier tar.gz et de nombreux petits fichiers. L'activation ou la désactivation des trames Jumbo ne fait pratiquement aucune différence non plus. cp
y scp
sont plus rapides que leurs rsync -av
équivalents. L'écriture directe sur un partage NFS exporté est significativement plus lente (au moins 2 fois) que l'écriture sur le même répertoire via SSH, quelle que soit la méthode utilisée.
Différences entre cp
y rsync
ne sont pas pertinentes dans ce cas. J'ai décidé d'essayer cp
y scp
juste pour voir s'ils présentent le même schéma et c'est le cas - une différence de 2X.
Comme je l'utilise rsync
o cp
dans les deux cas, je ne comprends pas ce qui empêche NFS d'atteindre la vitesse de transfert des mêmes commandes via SSH.
Comment se fait-il que l'écriture sur un partage NFS soit 2X plus lente que l'écriture au même endroit via SSH ?
Edit3 (Options /etc/exports du serveur NFS) : rw,no_root_squash,no_subtree_check,sync
. Le fichier /proc/mounts du client affiche : nfs rw,nodev,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountvers=3,mountproto=tcp
.
Merci à tous !