Qual é a saída do comando “du” durante uma cópia longa?

1

Recentemente, eu lancei o comando cp para criar um backup de um diretório grande. Então, usei um comando assim:

cp -rv big_directory new_location

Como os arquivos são grandes, demorou muito tempo para executar este comando, e também quis observar o progresso da cópia. Então eu também usei o comando du em outro terminal, assim:

du -sh new_location/*

Mas este comando também demora muito para ser executado. Especialmente se houver arquivos grandes neste diretório.

Suponha que o comando cp demore 10 minutos para ser executado. Se eu iniciar o comando du 1 minuto depois de ter lançado o comando cp e supondo que du leva 1 minuto para ser executado, gostaria de saber se posso confiar na saída de du ?

Isso me dá uma saída confiável da situação quando du foi lançado (t = 1min) ou me fornece uma saída da situação no final de du tempo de execução (t = 2min)? Obviamente, o tamanho do diretório new_location foi alterado entre o início e o final do comando du devido à cópia.

    
por Nairolf21 11.08.2015 / 21:48

3 respostas

2

@derobert explicou como o du opera.

Ele não mencionou que, a menos que você tenha um número enorme de arquivos / diretórios pequenos (então os metadados consomem uma grande quantidade de memória), então executar du novamente imediatamente produz um resultado muito mais rápido. / p>

Um arquivo grande não torna du lento, mas é mais provável que copiá-lo torne os caches de diretório sem memória. ( área de trabalho a capacidade de resposta pode ser melhorada definindo vm.swappiness=10 e priorizando metadados sobre dados com configurações de vm.vfs_cache_pressure=60 sysctl (coloque-os em /etc/sysctl.d/99-local .)

Quando vários processos estão acessando o sistema de arquivos ao mesmo tempo, cada chamada do sistema obtém informações que são um instantâneo do estado quando foi executado. Por exemplo, um processo pode verificar se um arquivo existia e, em seguida, tentar abri-lo, apenas para descobrir que ele não estava mais lá. Porque outro processo tinha renomeado / removido durante esse intervalo entre as verificações. (Quando isso causa um problema / é a origem de um bug, ele é chamado de condição de corrida.)

Se a ordem da travessia do diretório du for igual à ordem que cp escolheu, então du não chegará ao diretório still-modified até o final de sua execução. tempo, e assim não terá perdido muito no momento em que termina. OTOH, se du somar o diretório em que cp está colocando novos arquivos primeiro e, em seguida, levar outro minuto para somar o resto, o resultado será obsoleto.

    
por 11.08.2015 / 23:24
2

du funciona varrendo o diretório recursivamente, contando o tamanho de todos os arquivos & diretórios. Algo como:

  1. inicie com o primeiro diretório fornecido na linha de comando.
  2. stat do diretório para determinar seu tamanho, adicione isso ao total
  3. leia a primeira entrada (nome do arquivo ou subdiretório) do diretório
  4. se for um arquivo, stat e adicioná-lo ao total
  5. se for um diretório (diferente de . e .. , é claro), execute as etapas de 2 a 7 para o subdiretório
  6. se houver outra entrada, leia-a e volte para 4 [você pode se perguntar: o que acontece se outra entrada for adicionada por cp enquanto du estiver verificando em um único diretório? O padrão diz que pode ou não aparecer — não é especificado.]
  7. imprima o tamanho do diretório

Se os diretórios e arquivos estão mudando, pois du faz tudo isso (como eles são no seu caso), então o tamanho que ele dá não é aquele do começo ou do fim, é algo intermediário - mas não completamente . Provavelmente perto o suficiente, pelo menos com cp .

Para obter indicadores de progresso, além da sugestão de rsync do @ roaima, há cp -v , gcp (encontrado por meio de uma pesquisa rápida) e coisas complicadas como (cd /src && tar c .) | pv -pterb -s $(du -sb /src) | (cd /dst && tar x) .

    
por 11.08.2015 / 23:17
0

Se você tem rsync instalado, pode assistir ao progresso da cópia como este

rsync -vP big_directory new_location

Se você quisesse preservar permissões, registros de data e hora, propriedades, etc., adicionaria o -a flag a rsync ou o -p flag a cp .

Esta resposta evita o uso de du na suposição de que você realmente queria assistir ao progresso da cópia em vez de ver uma aproximação do espaço em disco usado.

    
por 11.08.2015 / 22:21