Réponses:
Bien sûr, le ssh est le meilleur.
Nfs utilise un protocole réseau complexe avec divers appels de procédure à distance et temps d'attente de synchronisation des données. Dans le cas de ssh, ceux-ci ne s'appliquent pas.
De plus, il existe de nombreuses serrures. La suppression de fichiers dans nfs fonctionne de cette façon:
rm
commande donne le unlink()
syscallunlink()
appelunlink()
appel du côté distantunlink()
appel de votre originalrm
rm
itère dans le fichier suivant, goto 1Maintenant, la chose importante est: entre 2-7, rm
doit attendre. Il pourrait envoyer le prochain unlink()
appel de manière asynchrone, mais il s'agit d'un outil monothread, non orienté événement. Même si c'était le cas, cela nécessiterait toujours des drapeaux de montage nfs difficiles. Jusqu'à ce qu'il n'obtienne pas le résultat, il attend.
Nfs - et tout système de fichiers réseau - est toujours beaucoup plus lent.
Dans de nombreux cas, vous pouvez effectuer des suppressions récursives à vitesse quasi infinie avec une astuce:
mv -vf oldfilms oldfilms-
)rm -rf oldfilms- &
)De nombreux aspects (mais pas tous), cette suppression de répertoire semblera avoir été effectuée en un temps pratiquement nul.
Extension: Comme @ el.pascado le mentionne dans son excellent commentaire, en fait 2-7 doit exécuter 3x pour tous les fichiers:
lstat()
syscall),unlink()
, dans le cas des répertoires opendir()
, la suppression récursive de tous les fichiers / répertoires, puis closedir()
enfin rmdir()
.readdir()
appel.Cela nécessite 3 commandes nfs RPC pour les fichiers et 3 supplémentaires pour les répertoires.
Oui. Eh bien, peut-être. Ça dépend. Pour un petit nombre de fichiers et de répertoires, cela ne ferait pas beaucoup de différence.
L'opération de fichiers en bloc sur un répertoire monté NFS est lente. Si vous avez la possibilité de vous connecter au serveur NFS lui-même et de le faire sur le répertoire réel, ce serait plus rapide.
Testons-le en supprimant la collection de ports OpenBSD que j'ai extraite de CVS et montée sur NFS:
Sur le serveur NFS:
$ cd /export/shared/ports
$ du -hs .
2.6G .
$ find . | wc -l
179688
$ time rm -rf /export/shared/ports/*
0m20.87s real 0m00.12s user 0m04.62s system
Sur le client (après avoir restauré les fichiers d'origine à partir de la sauvegarde):
$ time rm -rf /usr/ports/*
6m49.73s real 0m01.55s user 1m08.96s system
-r
drapeau,rm
doit d'abord vérifier si le fichier est un répertoire (lstat
via nfs), l'ouvrir (opendir
via nfs), lire son contenu (readdir
via nfs), puis effectuer la suppression réelle comme décrit dans la réponse sur chaque fichier trouvé à l'intérieur et récursif dans les sous-répertoires, fermez le répertoire (closedir
via nfs), puis répétez, pour chaque répertoire trouvé.