diretório com 980MB metadados, milhões de arquivos, como deletá-lo? (ext3) [duplicado]

1

Olá,

Estou preso a 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.

Eu 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 teve que parar porque ambos causaram um aumento no uso de memória. Em um ponto, estava usando 65% da memória do sistema.

Então eu pensei (sem dúvida incorretamente), que isso tinha a ver com o fato de que dir_index estava habilitado no sistema. Talvez encontre estava tentando ler o índice inteiro na memória?

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

Tudo bem, então isso deve acontecer. Ran o comando find acima novamente e ... a mesma coisa. Uso de memória maluca.

Corri rapidamente tune2fs -Odir_index /dev/xxx para reativar o dir_index e executei o Server Fault!

2 perguntas:

1) Como faço para me livrar deste diretório no meu sistema ao vivo? Eu não me importo quanto tempo leva, contanto que use pouca memória e pouca CPU. By the way, usando nice find ... eu era capaz de reduzir o uso da CPU, então meu problema agora é apenas o uso da memória.

2) Desativei dir_index por cerca de 20 minutos. Sem dúvida, novos arquivos foram gravados no sistema de arquivos nesse meio tempo. Eu reativei o dir_index. Isso significa que o sistema não localizará os arquivos que foram gravados antes que dir_index fosse reativado, já que seus nomes de arquivos estarão ausentes dos índices antigos? Se sim, e sei que esses novos arquivos não são importantes, posso manter os índices antigos? Se não, como recompilar os índices? Pode ser feito em um sistema ao vivo?

Obrigado!

    
por Alexandre 23.12.2010 / 02:55

4 respostas

1

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

Essa foi minha resposta, mas também havia outras ótimas respostas:

Would it be possible to backup all of the other files from this file system to a temporary storage location, reformat the partition, and then restore the files?

    
por 23.12.2010 / 03:15
1

Eu ficaria inclinado a remover o diretório atual, criar um novo diretório e remover o antigo:

mv dirname dirname.old; mkdir dirname    ls -ld dirname dirname.old    # verifique 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 possa ser executado novamente acidentalmente. : -)

"rm -rf" deve remover o diretório usando apenas uma pequena sobrecarga de memória. Mas os comandos "find" que você executou antes também não deveriam estar usando muita memória extra. Como você está medindo o uso da memória?

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

    
por 23.12.2010 / 03:26
0

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

find sessions2 -type f -delete
    
por 23.12.2010 / 03:01
0

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

    
por 23.12.2010 / 08:44