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 rm -rf
uma grande árvore de diretórios. O sistema de arquivos é XFS. Não sei ao certo quantos arquivos existem, mas provavelmente chega a milhões.
Existe alguma maneira de acelerar? Existe algum comando que faz o mesmo rm -rf
e não leva horas e horas?
find . -delete -name directory
e é muito mais rápido querm -rf
.Respostas:
Não.
rm -rf
faz um percurso recursivo em profundidade do seu sistema de arquivos, chamandounlink()
todos os arquivos. As duas operações que fazem com que o processo ocorra lentamente sãoopendir()
/readdir()
eunlink()
.opendir()
ereaddir()
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 (que eu suspeito que não seja 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 é tão bom para grandes estruturas de diretório. 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 diferente do sistema de arquivos.Edit: Parece que o XFS é péssimo em excluir árvores , então mude definitivamente seu sistema de arquivos.
fonte
unlink
que não faz nada com o conteúdo real, mas para executar umaunlink
chamada do sistema, o código do sistema de arquivos ainda tem mais trabalho a fazer se o link removido for o último para o arquivo e se ele não estiver aberto no momento. É claro que isso depende do sistema de arquivos, mas pode haver uma diferença muito discernível quando o arquivo removido é enorme.Como alternativa, mova o diretório para o lado, recrie-o com o mesmo nome, permissões e propriedade e reinicie os aplicativos / serviços que se preocupam com esse diretório.
Você pode "rm nice" o diretório original em segundo plano sem precisar se preocupar com uma interrupção prolongada.
fonte
Verifique se você tem as opções de montagem corretas definidas para o XFS.
Usando -ologbufs = 8, logbsize = 256k com o XFS provavelmente triplicará seu desempenho de exclusão.
fonte
Se você estiver executando a rm efetivamente no nível do arquivo, isso levará um longo tempo. É por isso que os instantâneos baseados em bloco são tão bons :).
Você pode tentar dividir o rm em áreas separadas e tentar fazê-lo em paralelo, no entanto, talvez eu não espere que ele melhore. Sabe-se que o XFS tem problemas para excluir arquivos e, se isso é uma grande parte do que você faz, talvez seja um sistema de arquivos diferente para isso.
fonte
É bom usar o ionice para operações intensivas de IO, independentemente do sistema de arquivos usado.
Eu sugiro este comando:
Ele será útil para operações em segundo plano no servidor com carga pesada de E / S.
fonte
Sei que isso é antigo, mas pensei em dar uma sugestão. Você está excluindo esses arquivos sequencialmente, a execução de operações paralelas de rm pode acelerar as coisas.
http://savannah.nongnu.org/projects/parallel/ parallel pode ser comumente usado no lugar de xargs
por isso, se você está excluindo todos os arquivos em deltedir
Isso deixaria você com apenas estruturas de diretório vazias para excluir.
Nota: Você provavelmente ainda atingirá as limitações do sistema de arquivos, conforme observado acima.
fonte
Uma opção alternativa aqui seria separar os dados de tal maneira que você possa descartar e reconstruir o sistema de arquivos real em vez de executar a rm?
fonte
Que tal diminuir a gentileza do comando? Gostar:
fonte