¿Es mejor usar la ejecución local rm -rf en lugar de sobre nfs?

10

¿Habría mucha diferencia en el tiempo para iniciar sesión en la máquina que tiene el directorio antes de hacer un rm -rfen el directorio, o simplemente rm -rfel directorio a través de NFS?

steviekm3
fuente

Respuestas:

11

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:

  1. su rmcomando da el unlink()syscall
  2. El controlador nfs lo convierte en una solicitud sunrpc, lo envía al servidor nfs
  3. El servidor nfs convierte esta solicitud sunrpc nuevamente en una unlink()llamada
  4. ejecuta esta unlink()llamada en el lado remoto
  5. después de tener éxito, devuelve al cliente el mensaje de respuesta de rpc equivalente a "todo está bien"
  6. el controlador del kernel del lado del cliente convierte esto nuevamente al código de salida 0 de la unlink()llamada de su originalrm
  7. rm itera al siguiente archivo, ir a 1

Ahora, lo importante es: entre 2-7, rmtiene 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:

  1. Primero mueva el directorio a un nombre diferente ( mv -vf oldfilms oldfilms-)
  2. Eliminar en segundo plano ( 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:

  • para determinar si es un archivo o un directorio (con una lstat()llamada al sistema),
  • entonces hazlo en consecuencia. En el caso de archivos ordinarios unlink(), en el caso de directorios opendir(), eliminar todos los archivos / directorios en forma recursiva, luego closedir(), finalmente rmdir().
  • finalmente, itere a la siguiente entrada del directorio con una readdir()llamada.

Esto requiere 3 comandos RPC nfs para archivos y 3 adicionales para directorios.

peterh - Restablece a Monica
fuente
2
El caso nfs es aún peor. Como la pregunta menciona el -rindicador, rmprimero debe verificar si el archivo es un directorio (a lstattravés de nfs), abrirlo (a opendirtravés de nfs), leer su contenido (a readdirtravé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 (a closedirtravés de nfs) y luego repita, para cada directorio encontrado.
el.pescado
5

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
Kusalananda
fuente