47 votes

Pourquoi rsync est-il plus rapide que NFS ?

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 que rsync -av dir /nfs_mount/TEST/ mais reste nettement plus lent que le rsync -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èrement rsync -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 !

24voto

Massimo Points 67633

NFS est un protocole de partage, tandis que Rsync est optimisé pour les transferts de fichiers ; de nombreuses optimisations peuvent être réalisées lorsque l'on sait que l'on a besoin d'une assistance technique. a priori que votre objectif est de copier des fichiers le plus rapidement possible au lieu de leur fournir un accès partagé.

Cela devrait aider : http://en.wikipedia.org/wiki/Rsync

24voto

notpeter Points 3465

Il ne s'agit peut-être pas d'un ralentissement de la vitesse de transfert, mais d'une augmentation de la latence d'écriture. Essayez de monter le partage NFS en asynchrone au lieu de le monter en synchrone et voyez si cela comble l'écart de vitesse. Lorsque vous utilisez rsync via ssh, le processus rsync distant écrit de manière asynchrone (rapidement). Mais lorsque vous écrivez sur un partage NFS monté de manière synchrone, les écritures ne sont pas confirmées immédiatement : le serveur NFS attend d'avoir atteint le disque (ou plus probablement le cache du contrôleur) avant d'envoyer au client NFS la confirmation que l'écriture s'est déroulée correctement.

Si "async" résout votre problème, sachez que si quelque chose arrive au serveur NFS en cours d'écriture, vous risquez fort de vous retrouver avec des données incohérentes sur le disque. Tant que ce montage NFS n'est pas le stockage principal de ces données (ou de toute autre donnée), tout ira bien. Bien sûr, vous seriez dans le même bateau si vous débranchez le serveur nfs pendant/après l'exécution de rsync-over-ssh (par exemple, rsync revient après avoir terminé, le serveur nfs se plante, les données non validées dans le cache d'écriture sont maintenant perdues, laissant des données incohérentes sur le disque).

Bien que ce ne soit pas un problème pour votre test (rsync de nouvelles données), sachez que rsync via ssh peut solliciter de manière significative le CPU et l'IO du serveur distant avant qu'un seul octet ne soit transféré pendant qu'il calcule les sommes de contrôle et génère la liste des fichiers qui doivent être mis à jour.

5voto

user44746 Points 1

Rsync est un protocole de fichier qui transfère uniquement les bits modifiés entre les fichiers. NFS est un protocole de fichier de répertoire à distance qui gère tout à chaque fois ... un peu comme SMB d'une certaine manière. Les deux sont différents et ont des objectifs différents. Vous pouvez utiliser Rsync pour transférer entre deux partages NFS.

3voto

Slartibartfast Points 3255

C'est intéressant. Une possibilité que vous n'avez peut-être pas envisagée est le contenu/type de fichier que vous transmettez.

Si vous avez des tas de petits fichiers (par exemple des courriels dans des fichiers individuels), l'efficacité de NFS peut être réduite parce qu'il n'utilise pas la totalité du MTU (cela est peut-être moins probable avec TCP qu'avec UDP).

Alternativement, si vous avez des fichiers / données hautement compressibles, des CPU rapides, et un réseau qui n'a pas tout à fait la vitesse du CPU(*), vous pourriez obtenir une accélération juste par la compression implicite sur le lien ssh.

Une troisième possibilité est que les fichiers (ou une version de ceux-ci) existent déjà dans la destination. Dans ce cas, l'accélération serait due au fait que le protocole rsync vous évite de transférer les fichiers.

(*) Dans ce cas, par "vitesse", j'entends la vitesse à laquelle l'unité centrale peut compresser les données par rapport à la vitesse à laquelle le réseau peut transmettre les données. Par exemple, il faut 5 secondes pour envoyer 5 Mo sur le câble, mais l'unité centrale peut compresser ces 5 Mo en 1 Mo en 1 seconde. Dans ce cas, le temps de transmission des données compressées est légèrement supérieur à 1 seconde, alors que celui des données non compressées est de 5 secondes.

1voto

3m1n3n3 Points 1

Si votre objectif est de copier tous les fichiers d'un endroit à un autre, tar/netcat sera l'option la plus rapide. si vous savez que vous avez beaucoup d'espaces blancs dans vos fichiers (zéros), utilisez l'option -i.

SOURCE : tar cvif - /path/to/source | nc DESTINATION PORTNUM DESTINATION : cd /path/to/source && nc -l PORTNUM | tar xvif -

si vous savez que vos données sont compressibles, utilisez la compression dans vos commandes tar -z -j -Ipixz

Je suis un fan de pixz parallel xz, il offre une grande compression et je peux ajuster le nombre de cpu que j'ai à la bande passante du réseau. Si j'ai une bande passante plus lente, j'utiliserai une compression plus élevée afin d'attendre plus sur le cpu que sur le réseau. si j'ai un réseau rapide, j'utiliserai une compression très faible :

SOURCE : tar cvif - /path/to/source | pixz -2 -p12 | nc DESTINATION PORTNUM# tar, ignore zeros, level 2 pixz compression using 12 cpu cores DESTINATION : nc -l PORTNUM | tar -Ipixz -xvif

Si vous réglez correctement le niveau de compression et les cœurs, en fonction de votre ensemble de données, vous devriez être en mesure de maintenir le réseau proche de la saturation et d'effectuer suffisamment de compression pour que le goulot d'étranglement devienne le disque (généralement le côté écriture si les systèmes de disques de lecture et d'écriture sont les mêmes).

Quant à rsync, je crois qu'il saute les zéros de la même manière que tar avec cette option, il transmet donc moins de données que NFS. NFS ne peut pas faire d'hypothèses sur les données et doit donc transmettre chaque octet avec la surcharge du protocole NFS. rsync a des frais généraux

netcat n'en a pratiquement pas il enverra des paquets TCP complets qui ne contiendront rien d'autre que les données qui vous intéressent.

avec netcat, comme avec scp, vous devez envoyer toutes les données sources en permanence, vous ne pouvez pas être sélectif comme avec rsync, donc ce n'est pas adapté aux sauvegardes incrémentales ou ce genre de choses, mais c'est bon pour la copie de données ou l'archivage.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X