Por que o rm é lento em uma unidade de armazenamento externo (conectada via USB, tipo fuseblk) com 50Gb de arquivos?

21

Eu tenho tentado usar o rsnapshot para fazer backups, mas acho inutilizável. Embora seja possível diferenciar um diretório (50GB) e duplicá-lo (vinculando cada arquivo) em poucos minutos, e eu posso copiar o diretório inteiro em cerca de meia hora, demora mais de uma hora para excluí-lo. Mesmo usando diretamente rm -rfv , acho que pode demorar até meio segundo para rm um único arquivo, enquanto os comandos cp e link são concluídos instantaneamente.

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

O sistema de arquivos em que estou trabalhando é uma unidade de armazenamento externo, conectada via usb e tipo fuseblk (o que eu acho que significa que é ntfs). Meu computador está rodando o Ubuntu Linux.

Saída do topo:

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
    
por Benubird 21.12.2013 / 11:05

3 respostas

27

Por fim, não importa o que você faça, rm precisa executar unlink em cada arquivo que você deseja remover (mesmo se você chamar rm -r no diretório pai). Se houver muitos arquivos para remover, isso pode levar muito 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 passar por todos os arquivos para removê-los pode levar muito, muito tempo.

Se você achar isso 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 o tempo seja muito inconveniente.

Assumindo que o sistema de arquivos realmente é NTFS (não está claro a partir de sua pergunta), o NTFS é geralmente muito lento na exclusão de grandes faixas de arquivos. Você pode considerar o uso de 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 pode fazer isso de alguma forma que não use o FUSE.

    
por 21.12.2013 / 11:18
13

Por que o rm é tão lento? Eu não faço ideia. Mas eu sei de 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 não precise de rebalanceamento. O rm irá apagar os arquivos e causar um grande reequilíbrio quando forem removidos. Há algumas informações sobre o rebalanceamento aqui .

    
por 23.04.2014 / 12:59
1

Bem, uma vez eu tive um problema parecido com o seu. Eu achei que o seu "wa" é alto, você poderia usar

iostat -x 1

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

Por simpatia, 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.

    
por 20.01.2016 / 09:58