Por que o rsync não usa delta-transfer para arquivos locais?

25

Eu tenho uma grande imagem ISO que está sendo baixada por um cliente de torrent com a reserva de espaço ativada: isso significa que o tamanho do arquivo não é alterado enquanto alguns trechos no (4 Mib) estão constantemente mudando devido a um download.

No download de 90%, faço o rsync inicial para economizar tempo depois:

$ rsync -Ph DVD.iso / media / outro-hdd /
enviando lista de arquivos incrementais

DVD.iso
       2.60G 100% 40.23MB / s 0:01:01 (xfer # 1, verificação = 0/1)

enviados 2,60G bytes recebidos 73 bytes 34,59M bytes / s
o tamanho total é de 2,60G de aceleração é de 1,00

Então, quando o arquivo estiver totalmente baixado, eu sincronizo novamente:

total size is 2.60G   speedup is 1.00

Speedup = 1 diz que a transferência delta não foi usada, embora 90% do arquivo não tenha sido alterado, o dir de destino está em outro FS e a cópia leva vários minutos. Por que não tenta acelerar a transferência ?! Como forçar o rsyncuso da transferência delta?

Kolypto
fonte
6
O que você está fazendo não faz sentido. O objetivo do rsync é acelerar a transferência de arquivos pela rede, não localmente. Para encontrar as diferenças, ele precisa ler a origem e o destino. No tempo que leva para ler o destino localmente para encontrar as diferenças, você também pode fazer uma cópia normal. Basta baixar o arquivo para o destino em vez de copiá-lo.
psusi 17/01/11
1
Portanto, ele simplesmente não usa delta-xfer porque, trabalhando localmente, é mais rápido copiar do que calcular hashes? Em caso afirmativo, poste a resposta plz :)
kolypto 17/01
9
A leitura pode ser mais rápida do que gravar em um disco local em determinadas circunstâncias. Também pode reduzir o desgaste de um SSD. Esta é certamente uma pergunta válida e a resposta é bastante valiosa para mim.
HRJ
2
@psusi, além do comentário de HRJ acima, considere também o caso em que o arquivo de destino foi refluído (por exemplo, em btrfs ou ocfs2). Minimizar gravações durante a sincronização pode fazer uma enorme diferença no uso geral do espaço.

Respostas:

20

De acordo com a página de manual , psusi está certo:

-W, --whole-file : a transferência pode ser mais rápida se essa opção for usada quando a largura de banda entre as máquinas de origem e de destino for maior que a largura de banda do disco (especialmente quando o "disco" é realmente um sistema de arquivos em rede). Esse é o padrão quando a origem e o destino são especificados como caminhos locais, mas apenas se nenhuma opção de gravação em lote estiver em vigor.

ligânico
fonte
10
Ah, obrigada! I miseed esta linha :) Para ligar delta-trasfer em, uso-no-W
kolypto
1
No meu sistema -no-Wnão funciona apenas a opção longa -no-whole-file. Minha razão para precisar dessa opção é quando estou configurando um backup e tenho arquivos grandes (por exemplo, imagens) que não têm o mesmo horário de modificação. É MUITO mais rápido, a velocidade é 163.26, para sincronizar esses arquivos usando a transferência delta no meu sistema de arquivos local.
Jesse the Wind Wanderer
6
@JessetheWindWanderer, a opção longa é --no-whole-file(observe o dobro --no início).
Eddie
Graças Eddie C. eu tinha editar o meu comentário se eu pudesse descobrir o nosso como :-(
Jesse the Wanderer Vento
17

A resposta direta a esta pergunta é:

Use o --no-Wsinalizador para forçar a compactação delta, não importa o local ou o remoto.

Atualização: Parece que há mais na história. A delta compressionparece ser ativada somente entre receber e processo de transmissão do rsync. Ao enviar o arquivo para o sistema de arquivos, rsyncainda é possível gravar o (s) arquivo (s) inteiro (s), mesmo com a compactação delta ativada.

Veja a investigação de "Wakan Tanka" aqui .

HRJ
fonte
2
--no-Wsempre transfira o arquivo inteiro no meu caso. Verifique unix.stackexchange.com/questions/291156/…
Wakan Tanka,
@WakanTanka Isso é interessante! Eu atualizei minha resposta.
HRJ 22/06
3

Por padrão, o rsync primeiro cria uma nova cópia do arquivo de destino e depois a substitui, por vários motivos de segurança. Você pode substituir isso especificando --inplacejunto com --no-whole-file. Isso instrui o rsync a fazer uma edição no local do arquivo de destino, aceitando os vários riscos (geralmente menores para esta situação), conforme documentado na página de manual.

kartik_subbarao
fonte
0

Por padrão, rsynccria uma cópia do arquivo no destino e substitui atomicamente o original pela nova cópia. Isso é feito por razões de segurança. O que você está procurando é a --inplaceopção, que fará com rsyncque modifique apenas as partes do arquivo de destino que foram alteradas em relação à origem.

Para o caso de uso do OP, recomendo desativar também a pré-alocação, para que uma cópia esparsa possa ser sincronizada, o que será muito mais rápido. Para downloads, não se preocupe com a fragmentação, a menos que você esteja usando um sistema de arquivos muito antigo como o VFAT. Os arquivos de mídia, em particular, não são lidos com o desempenho máximo da mídia de armazenamento; portanto, desfragmentá-los é um esforço desperdiçado.

Para copiar seu diretório de downloads escassamente para o volume de destino, recomendo estes sinalizadores e operações, nesta ordem:

rsync --ignore-existing -vxaHAXS /source /destination
rsync --inplace -vxaHAX /source /destination

A primeira passagem copiará novos arquivos esparsamente para o destino. A segunda passagem atualizará os arquivos existentes no local, copiando apenas as alterações.

Como está fazendo cópias delta esparsas e no local, você pode executá-lo repetidamente sem incorrer em muito IO extra. Mesmo se você tiver 20 torrents sendo executados simultaneamente, isso não amplificará as gravações no destino ou afetará os volumes de origem / destino.

Wil
fonte
O que você quer dizer com "escassamente" aqui, Wil? Realmente não reflete o significado real da palavra, tanto quanto posso dizer.
Julius
@ Julius: significa exatamente o que isso implica - copie os arquivos com suporte total para alocação esparsa; portanto, por exemplo, seus filmes HDR de 40 GB não ocuparão mais espaço no destino do que na fonte. Mesmo com imagens de disco do VirtualBox. Conforme declarado, o OP precisaria desativar a pré-alocação para que isso funcionasse.
Wil