Fazer um rm -rf em uma árvore de diretórios massiva leva horas

19

Estamos usando o rsnapshot para backups. Ele mantém muitos instantâneos do arquivo de backup, mas exclui os antigos. Isso é bom. No entanto, leva cerca de 7 horas para fazer um rm -rf em uma árvore de diretórios massiva. O sistema de arquivos é o XFS. Não tenho certeza de quantos arquivos existem, mas provavelmente são milhões.

Existe alguma maneira de acelerar? Existe algum comando que faça o mesmo que rm -rf e não leve horas e horas?

    
por Rory 28.07.2009 / 10:26

8 respostas

38

Não.

rm -rf realiza uma travessia recursiva de profundidade do seu sistema de arquivos, chamando unlink() em cada arquivo. As duas operações que fazem o processo ir devagar são opendir() / readdir() e unlink() . opendir() e readdir() dependem do número de arquivos no diretório. unlink() depende do tamanho do arquivo que está sendo excluído. A única maneira de tornar isso mais rápido é reduzir o tamanho e o número de arquivos (o que suspeito não ser provável) ou alterar o sistema de arquivos para um com melhores características para essas operações. Eu acredito que o XFS é bom para unlink () em arquivos grandes, mas não é bom para estruturas de diretórios grandes. Você pode achar que ext3 + dirindex ou reiserfs é mais rápido. Não tenho certeza de quão bem o JFS se sai, mas tenho certeza de que há muitos benchmarks de desempenho de sistemas de arquivos diferentes.

Edit: Parece que XFS é péssimo ao deletar árvores , então mude definitivamente o seu sistema de arquivos.

    
por 28.07.2009 / 10:41
22

Como alternativa, mova o diretório para o lado, recrie-o com o mesmo nome, permissões e propriedade e reinicie todos os aplicativos / serviços que se importarem com esse diretório.

Você pode então "nice rm" no diretório original sem ter que se preocupar com uma interrupção prolongada.

    
por 28.07.2009 / 10:45
7

Certifique-se de ter as opções de montagem corretas definidas para o XFS.

Usar -ologbufs = 8, logbsize = 256k com o XFS provavelmente triplicará seu desempenho de exclusão.

    
por 21.09.2009 / 22:52
5

Se você estiver fazendo o rm com eficiência no nível do arquivo, isso levará um longo tempo. É por isso que os instantâneos baseados em blocos são tão bons:).

Você pode tentar dividir o rm em áreas separadas e tentar fazê-lo em paralelo, mas talvez não espere que ele melhore. Sabe-se que o XFS tem problemas ao excluir arquivos e, se isso é uma grande parte do que você faz, talvez um sistema de arquivos diferente seja uma ideia.

    
por 28.07.2009 / 10:36
5

É bom usar o ionice para operações intensivas em IO, independentemente do sistema de arquivos usado.
Eu sugiro este comando:

ionice -n7 nice rm -fr dir_name

Ele funcionará muito bem para operações em segundo plano no servidor com carga pesada de E / S.

    
por 19.08.2009 / 17:02
2

Eu sei que isso é velho, mas achei que seria uma sugestão. Você está excluindo esses arquivos sequencialmente, executando operações de rm paralelas que podem acelerar as coisas.

link Paralelamente pode ser usado normalmente no lugar de xargs

então se você deletar todos os arquivos deltedir

find -t f deletedir | parallel -j 10 rm

Isso deixaria apenas estruturas de diretório vazias para excluir.

Observação: você provavelmente ainda atingirá as limitações do sistema de arquivos, conforme mencionado acima.

    
por 28.01.2010 / 22:31
1

Seria uma opção alternativa separar os dados de tal forma que você possa lixo e reconstruir o sistema de arquivos real em vez de fazer o rm?

    
por 28.07.2009 / 10:50
0

Que tal diminuir a gentileza do comando? Como:

nice -20 rm -rf /path/to/dir/
    
por 28.07.2009 / 10:38