Por que o rm é lento em uma unidade de armazenamento externa (conectada por USB, tipo fuseblk) com 50 GB de arquivos?

21

Eu tenho tentado usar o rsnapshot para fazer backups, mas acho inutilizável. Embora ele consiga diferenciar um diretório (50 gb) e duplicá-lo (encadernar todos os arquivos) em alguns minutos, e eu posso cp o diretório inteiro em cerca de meia hora, leva mais de uma hora para excluí-lo. Mesmo usando diretamente rm -rfv, acho que pode levar até meio segundo para rm um único arquivo, enquanto os comandos cpe linksão concluídos instantaneamente.

Por que rm é tão lento? Existe alguma maneira mais rápida de remover recursivamente os hardlinks? Não faz sentido para mim que copiar um arquivo demore menos tempo do que removê-lo.

O sistema de arquivos no qual estou trabalhando é uma unidade de armazenamento externo, conectada via usb e digite fuseblk (o que eu acho que significa que é ntfs). Meu computador está executando o ubuntu linux.

Saída de cima:

Cpu(s):  3.0%us,  1.5%sy,  0.0%ni, 54.8%id, 40.6%wa,  0.0%hi,  0.1%si,  0.0%st
Mem:   8063700k total,  3602416k used,  4461284k free,   557604k buffers
Benubird
fonte
1
Ser montado como fuseblknão significa que a unidade é NTFS, significa apenas que é montada como um dispositivo de bloco FUSE. Isso pode ser quase tudo.
Chris Baixo
1
@ ChrisDown True, mas eu sei que é NTFS ou ext3, e tenho certeza que se fosse ext3, seria montado como tal por mount sem argumentos.
Benubird 21/12
1
Depende de quantos arquivos estão no diretório (você não disse quantos) e, em particular, o NTFS fica mais lento com apenas> 3K arquivos no diretório. Praticamente todos os outros sistemas de arquivos têm muito mais desempenho. Veja todas as muitas outras postagens no SO / SE sobre o efeito do número de arquivos no desempenho do sistema de arquivos.
SMCI

Respostas:

28

Por fim, não importa o que você faça, rmele deve ser executado unlinkem todos os arquivos que você deseja remover (mesmo que você chame rm -ro diretório pai). Se houver muitos arquivos a serem removidos, isso pode levar um longo tempo.

Existem dois processos particularmente demorados quando você executa rm -r:

  1. readdir, Seguido por,
  2. um número de chamadas para unlink.

Encontrar todos os arquivos e, em seguida, percorrer todos os arquivos para removê-lo, pode levar muito, muito tempo.

Se você achar "inutilizável" porque torna o diretório inutilizável por algum tempo, considere mover o diretório pai antes de removê-lo. Isso liberará esse nome para o programa usar novamente, sem que isso seja inconveniente demais.

Supondo que o sistema de arquivos realmente seja NTFS (não está claro na sua pergunta), o NTFS geralmente é bastante lento ao excluir grandes faixas de arquivos. Você pode considerar usar um sistema de arquivos mais adequado para seus propósitos (os sistemas de arquivos ext mais recentes têm um desempenho de exclusão muito bom, se você não tiver outras necessidades específicas). O FUSE em si também não é particularmente rápido, em geral. Você pode considerar ver se consegue fazer isso de alguma forma que não use o FUSE.

Chris Down
fonte
2
+1 Realmente depende muito do sistema de arquivos exato - muitos tendem a ter um desempenho muito bom em algumas operações, enquanto são lentos com outras (geralmente, isso é para criação de arquivo x remoção x acesso a dados).
Peterph
15

Por que rm é tão lento? Eu não faço ideia. Mas eu sei uma maneira mais rápida:

mkdir blank
rsync -a --delete blank/ test/

Atualização: Esta resposta no Serverfault tem algumas explicações. Parece que o rsync está excluindo os arquivos em uma ordem específica que faz com que a árvore do sistema de arquivos permaneça equilibrada e nem sempre precise de reequilibrar. O rm excluirá os arquivos e causará muito reequilíbrio à medida que forem removidos. Há algumas informações sobre o reequilíbrio aqui .

rjmunro
fonte
1
Você comparou isso e comparou rm -rf? rsyncainda tem que conter unlink()todos os arquivos test/, e é provavelmente isso que leva tempo.
precisa saber é o seguinte
Não o fiz comparativamente formalmente, mas tentei depois de ler os benchmarks de outra pessoa, e a diferença foi substancial. Não consigo mais encontrar essa publicação, mas essa resposta no serverfault tem uma explicação e uma fonte para um programa de exclusão ainda mais rápido.
Rjmunro
Mas o método mais rápido deve ser unlink(2)no diretório (e lembrando-se de fazer uma fscktarde) ...
Matt Bianco
Um fato é um fato. Apenas cronometrou, e é quase o dobro da velocidade. Depois de ler o código rm do GNU coreutils, isso nem me faz pensar ...
Dominik George
1

Bem, uma vez tive um problema semelhante ao seu. Eu descobri que o seu "wa" é alto, você poderia usar

iostat -x 1

para verificar se o seu utilitário de disco está alto, isso significa que seu disco está bastante ocupado. Verifique se outros processos estão gravando no disco continuamente.

Para simplificar, use

vmstat 1

para verificar se b é alto ou r < b . Isso indica algo errado. Na sua situação, acho que o disco io é o motivo original.

fibonacci
fonte