Directorio con metadatos de 980 MB, millones de archivos, ¿cómo eliminarlo? (ext3)

Directorio con metadatos de 980 MB, millones de archivos, ¿cómo eliminarlo? (ext3)

Posible duplicado:
rm en un directorio con millones de archivos

Hola,

Entonces estoy atrapado con este directorio:

drwxrwxrwx 2 dan users 980M 2010-12-22 18:38 sessions2

El contenido de los directorios es pequeño: sólo millones de pequeños archivos.

Quiero borrarlo del sistema de archivos pero no puedo. Mi primer intento fue:

find sessions2 -type f -delete

y

find sessions2 -type f -print0 | xargs -0 rm -f

pero tuvo que detenerse porque ambos provocaron un aumento en el uso de la memoria. En un momento estaba usando el 65% de la memoria del sistema.

Entonces pensé (sin duda incorrectamente) que tenía que ver con el hecho de que dir_index estaba habilitado en el sistema. ¿Quizás find estaba intentando leer el índice completo en la memoria?

Entonces hice esto (tontamente):tune2fs -O^dir_index /dev/xxx

Muy bien, eso debería ser suficiente. Ejecuté el findcomando anterior nuevamente y... lo mismo. Uso loco de la memoria.

Corrí apresuradamente tune2fs -Odir_index /dev/xxxpara volver a habilitar dir_index y corrí hasta Server Fault.

2 preguntas:

1) ¿Cómo me deshago de este directorio en mi sistema en vivo? No me importa cuánto tiempo lleve, siempre y cuando utilice poca memoria y poca CPU. Por cierto, al usarlo nice find ...pude reducir el uso de la CPU, por lo que mi problema ahora es solo el uso de la memoria.

2) Deshabilité dir_index durante unos 20 minutos. Sin duda, mientras tanto se escribieron nuevos archivos en el sistema de archivos. Volví a habilitar dir_index. ¿Eso significa que el sistema no encontrará los archivos que se escribieron antes de que se volviera a habilitar dir_index ya que sus nombres de archivo faltarán en los índices antiguos? Si es así y sé que estos archivos nuevos no son importantes, ¿puedo mantener los índices antiguos? Si no, ¿cómo reconstruyo los índices? ¿Se puede hacer en un sistema en vivo?

¡Gracias!

Respuesta1

Vea esta pregunta:rm en un directorio con millones de archivos

Esta fue mi respuesta, pero también hubo otras respuestas excelentes:

¿Sería posible hacer una copia de seguridad de todos los demás archivos de este sistema de archivos en una ubicación de almacenamiento temporal, reformatear la partición y luego restaurar los archivos?

Respuesta2

Me inclinaría por quitar el directorio actual, crear un directorio nuevo y luego eliminar el anterior:

mv nombre de directorio nombre de directorio.old; mkdir dirname ls -ld dirname dirname.old # verificar que los permisos sean correctos rm -rf dirname.old

Esto tiene el beneficio adicional de que no terminará con un "rm -rf dirname" en su historial que podría volver a ejecutar accidentalmente. :-)

"rm -rf" debería eliminar el directorio utilizando muy poca sobrecarga de memoria. Pero los comandos "buscar" que ha ejecutado antes tampoco deberían utilizar mucha memoria adicional. ¿Cómo estás midiendo el uso de la memoria?

No estás midiendo este uso de memoria mirando la columna "libre" del resultado del comando "libre", ¿verdad? Porque Linux utilizará la memoria no utilizada para el almacenamiento en caché del disco, y la columna superior bajo "gratis" no tiene eso en cuenta. ¿Estás viendo el uso de memoria en uno de los programas? ¿Cuál? "ps awwlx --sort=vsz" le mostrará la memoria grande usando programas, ordenados con los grandes al final...

Respuesta3

Su problema es que lo está canalizando a xargs... probablemente consumiendo toda su memoria allí... buscar tiene una opción de eliminación

find sessions2 -type f -delete

Respuesta4

Mmmm una idea loca, no sé si funcionaría. ¿Qué pasa si intentas hacerlo en lotes? Primero cambie el nombre del directorio y cree uno nuevo vacío, para que los archivos nuevos no estorben. Luego genere el contenido del directorio. a un archivo de texto. Luego, ¿revisa ese archivo y elimina 100 archivos a la vez, durmiendo y sincronizándose en el medio?

información relacionada