diretório com metadados de 980 MB, milhões de arquivos, como excluí-los? (ext3)

diretório com metadados de 980 MB, milhões de arquivos, como excluí-los? (ext3)

Possível duplicata:
rm em um diretório com milhões de arquivos

Olá,

Então estou preso com este diretório:

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

O conteúdo dos diretórios é pequeno - apenas milhões de pequenos arquivos.

Quero limpá-lo do sistema de arquivos, mas não consegui. Minha primeira tentativa foi:

find sessions2 -type f -delete

e

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

mas tive que parar porque ambos causaram um aumento no uso da memória. A certa altura, ele estava usando 65% da memória do sistema.

Então pensei (sem dúvida incorretamente) que tinha a ver com o fato de dir_index estar habilitado no sistema. Talvez find estivesse tentando ler todo o índice na memória?

Então eu fiz isso (tolamente):tune2fs -O^dir_index /dev/xxx

Tudo bem, então isso deve bastar. Executei o findcomando acima novamente e... a mesma coisa. Uso louco de memória.

Corri apressadamente tune2fs -Odir_index /dev/xxxpara reativar dir_index e corri para Server Fault!

2 perguntas:

1) Como faço para me livrar deste diretório no meu sistema ativo? Não me importa quanto tempo leva, desde que use pouca memória e pouca CPU. A propósito, com o uso nice find ...consegui reduzir o uso da CPU, então meu problema agora é apenas o uso de memória.

2) Desativei dir_index por cerca de 20 minutos. Sem dúvida, entretanto, novos arquivos foram gravados no sistema de arquivos. Eu reativei dir_index. Isso significa que o sistema não encontrará os arquivos que foram gravados antes de dir_index ser reativado, pois seus nomes de arquivos estarão faltando nos índices antigos? Se sim e sei que esses novos arquivos não são importantes, posso manter os índices antigos? Caso contrário, como reconstruo os índices? Isso pode ser feito em um sistema ativo?

Obrigado!

Responder1

Veja esta pergunta:rm em um diretório com milhões de arquivos

Esta foi a minha resposta, mas também houve outras ótimas respostas:

Seria possível fazer backup de todos os outros arquivos deste sistema de arquivos em um local de armazenamento temporário, reformatar a partição e depois restaurar os arquivos?

Responder2

Eu estaria inclinado a tirar o diretório atual do caminho, criar um novo diretório e remover o antigo:

mv nome do diretório nome do diretório.old; mkdir dirname ls -ld dirname dirname.old # verifica se as permissões estão corretas rm -rf dirname.old

Isso tem o benefício adicional de você não acabar com um "rm -rf dirname" em seu histórico que pode ser executado novamente acidentalmente. :-)

"rm -rf" deve remover o diretório usando muito pouca sobrecarga de memória. Mas os comandos "find" que você executou antes também não devem usar muita memória adicional. Como você está medindo o uso da memória?

Você não está medindo esse uso de memória olhando a coluna "free" da saída do comando "free", está? Porque o Linux usará memória não utilizada para cache de disco, e a coluna superior em “livre” não leva isso em consideração. Você está vendo o uso de memória em um dos programas? Qual deles? "ps awwlx --sort=vsz" mostrará a grande memória usando programas, classificada com os grandes no final...

Responder3

Seu problema é que você está direcionando para xargs .. provavelmente comendo toda a sua memória lá .. find tem uma opção de exclusão

find sessions2 -type f -delete

Responder4

Hmm, uma ideia maluca, não sei se funcionaria. E se você tentar fazer isso em lotes? Primeiro renomeie o diretório e crie um novo vazio, para que novos arquivos não atrapalhem. Em seguida, produza o conteúdo do diretório. para um arquivo de texto. Em seguida, analise esse arquivo e remova 100 arquivos por vez, suspendendo e sincronizando entre eles?

informação relacionada