Cómo eliminar un directorio en el sistema de archivos NFS con una enorme cantidad de archivos

Cómo eliminar un directorio en el sistema de archivos NFS con una enorme cantidad de archivos

Un programa mal probado creó un directorio en un recurso compartido NFS con una enorme cantidad de archivos, que necesito eliminar.

ls -ald /home/foo
drwxrwxr-x 2 503 503 317582336 Jul 29 11:38 /home/foo

El directorio está ubicado en un montaje NFS de aproximadamente 600 GB en un dispositivo tipo netapp. En realidad, no tengo idea de cuántos archivos hay en él, pero un directorio similar creado después de solo 10 minutos tiene 121.000 archivos, por lo que probablemente sean millones en alguna parte. El sistema operativo es el kernel Linux 2.6.

Tratando de encontrar una manera de enumerarlo o eliminarlo y su contenido. find /home/foo da como resultado que find muera después de aproximadamente 1 hora, sin otra salida que "./"

Respuesta1

(respondiendo a mi propia pregunta en caso de que alguien lo encuentre mientras busca algo similar). Posiblemente haya hasta 9 millones de archivos en el directorio.

Desafortunadamente, no puedo iniciar sesión directamente en el servidor, es un dispositivo. El único acceso a los sistemas de archivos es mediante exportación.

rm -rf no pareció funcionar. mirando con la mirada que estaba colgando.

El hallazgo no se completó, murió sin error.

ls -1 nunca pareció completarse. (Ahora me doy cuenta de que intenta ordenar los resultados, ls -1f podría haber funcionado eventualmente).

lo que funcionó fue un simple fragmento de Perl. Supongo que el código C haría lo mismo.

 opendir( my $dh,  '/home/foo' ) or die $!
    while ( my $file = readdir $dh ) {
        print "$file\n";
    }

Respuesta2

Este hilo bastante antiguo apareció en Google, así que me gustaría compartir algunas estadísticas.

Aquí hay una comparación de tres métodos diferentes para eliminar archivos en un servidor NFS:

  1. habitación sencilla:rm dir/*
  2. encontrar:find dir/ -type f -exec rm {} \;
  3. sincronización:tempdir=$( mktemp -d ); \ rsync -a --delete $tempdir/ dir/; \ rmdir $tempdir

Para comparar estos métodos, creé 10000 archivos cada vez que ejecuté una prueba con

for i in {1..10000} ; do touch $i ; done

Los resultados del gráfico muestran que rsync es mucho más rápido y find es el más lento de los tres métodos. rendimiento de diferentes métodos para eliminar múltiples archivos, rsync es más rápido

Los resultados se mantienen cuando se duplica la cantidad de archivos (no ejecuté find20000 archivos), el tiempo promedio fue de 3 ejecuciones para 10000 archivos y 2 ejecuciones para 20000 archivos.

        10000    20000
find     28.3       -
rm       12.9     23.9
rsync     6.94    12.2

Es interesante ver de qué más depende el rendimiento de estos métodos.

un relacionadocorreoEn este sitio se analiza la eliminación de una gran cantidad de archivos en un sistema de archivos ext3.

Respuesta3

Le sugeriría que NO intente eliminar estos archivos a través de NFS: inicie sesión directamente en el servidor de archivos y elimine los archivos allí. Esto será sustancialmente menos abusivo para el servidor NFS (y el cliente).

Más allá de eso, use buscar (como lo describe MattBianco) o use ls -1 | xargs rm -f(desde ese directorio) si la búsqueda tiene problemas para completarse (este último debería funcionar bien en NFS, aunque nuevamente recomendaría hacerlo localmente).

Respuesta4

Esto parece un poco obvio, pero ¿has probado?

rm -rf /home/foo/

? De lo contrario, ¿hay alguna forma de utilizar una expresión regular para tener a mano un subconjunto lo suficientemente pequeño |xargs rm?

Si ls falla, puede intentarlo echo /home/foo/* | xargs rm, pero podría fallar con "línea demasiado larga" o algo similar. Ah, y apoyo la recomendación de intentar hacer esto directamente en el servidor en lugar de a través de NFS.

información relacionada