Respuestas:
Por supuesto, el ssh es el mejor.
Nfs utiliza un protocolo de red complejo con varias llamadas a procedimientos remotos y tiempos de espera de sincronización de datos. En el caso de ssh, estos no se aplican.
Además, hay muchas cerraduras. La eliminación de archivos en nfs funciona de esta manera:
rm
comando da el unlink()
syscallunlink()
llamadaunlink()
llamada en el lado remotounlink()
llamada de su originalrm
rm
itera al siguiente archivo, ir a 1Ahora, lo importante es: entre 2-7, rm
tiene que esperar. Podría enviar la siguiente unlink()
llamada de forma asincrónica, pero es una herramienta de un solo subproceso, no orientada a eventos. Incluso si pudiera, aún requeriría complicadas banderas de montaje nfs. Hasta que no obtenga el resultado, espera.
Nfs, y cualquier sistema de archivos de red, siempre es mucho más lento.
En muchos casos, puedes hacer eliminaciones recursivas de velocidad casi infinita con un truco:
mv -vf oldfilms oldfilms-
)rm -rf oldfilms- &
)Desde muchos aspectos (pero no todos), esta eliminación de directorio se verá como si hubiera sucedido en prácticamente cero tiempo.
Extensión: Como @ el.pascado menciona en su excelente comentario, en realidad 2-7 tiene que ejecutar 3x para cualquier archivo:
lstat()
llamada al sistema),unlink()
, en el caso de directorios opendir()
, eliminar todos los archivos / directorios en forma recursiva, luego closedir()
, finalmente rmdir()
.readdir()
llamada.Esto requiere 3 comandos RPC nfs para archivos y 3 adicionales para directorios.
Si. Bien quizás. Depende. Para una pequeña cantidad de archivos y directorios, no habría mucha diferencia.
La operación de archivo en bloque en un directorio montado en NFS es lenta. Si tiene la oportunidad de iniciar sesión en el servidor NFS y hacerlo en el directorio real, entonces esto sería más rápido.
Probémoslo eliminando la colección de puertos de OpenBSD que he extraído de CVS y que he montado sobre NFS:
En el servidor 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
En el cliente (después de restaurar los archivos originales de la copia de seguridad):
$ time rm -rf /usr/ports/*
6m49.73s real 0m01.55s user 1m08.96s system
-r
indicador,rm
primero debe verificar si el archivo es un directorio (alstat
través de nfs), abrirlo (aopendir
través de nfs), leer su contenido (areaddir
través de nfs) y solo luego realizar la eliminación real como se describe en la respuesta en cada archivo que se encuentra dentro y recurriendo a subdirectorios, cierre el directorio (aclosedir
través de nfs) y luego repita, para cada directorio encontrado.