Qual é a maneira mais rápida de copiar um arquivo esparso? Qual método resulta no menor arquivo?


11

CONTEXTO : Estou copiando uma imagem esparsa da VM qcow2 com tamanho de 200 GB, mas com 16 GB de blocos alocados. Eu tentei vários métodos para copiar esse arquivo esparso no mesmo servidor e obter alguns resultados preliminares. O ambiente é RHEL 6.6 ou CentOS 6.6 x64.

ls -lhs srcFile 
16G -rw-r--r-- 1 qemu qemu 201G Feb  4 11:50 srcFile

Via cp - melhor velocidade

cp --sparse=always srcFile dstFile
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/26GB actual, bloat: 10GB
    Copy time: 1:02 (mm:ss) 

Via dd - melhor desempenho geral

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=4M conv=sparse
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/21GB actual, bloat: 5GB
    Copy time: 2:02 (mm:ss)

Via cpio

mkdir tmp$$
echo srcFile | cpio -p --sparse tmp$$; mv tmp$$/srcFile dstFile
rmdir tmp$$
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/26GB actual, bloat: 10GB
    Copy time: 9:26 (mm:ss)

Via rsync

rsync --ignore-existing -aS srcFile dstFile
Performance Notes:
    Copied 200GB max/16GB actual VM as 200GB max/26GB actual, bloat: 10GB
    Copy time: 24:49 (mm:ss)

Via virt-sparsify - melhor tamanho

virt-sparsify srcFile dstFile
    Copied 200GB max/16GB actual VM as 200GB max/16GB actual, bloat: 0
    Copy time: 17:37 (mm:ss)

Tamanho de bloco variável

Fiquei preocupado com o 'inchaço' durante a cópia do dd (aumento do tamanho do arquivo em relação ao original), então variei o tamanho do bloco. Eu usei 'time' para obter também o tempo total e a% da CPU. O arquivo original nesse caso é um arquivo esparso de 7.3GB de 200GB:

4K:   5:54.64, 56%, 7.3GB
8K:   3:43.25, 58%, 7.3GB
16K:  2:23.20, 59%, 7.3GB
32K:  1:49.25, 62%, 7.3GB
64K:  1:33.62, 64%, 7.3GB
128K: 1:40.83, 55%, 7.4GB
256K: 1:22.73, 64%, 7.5GB
512K: 1:44.84, 74%, 7.6GB
1M:   1:16.59, 70%, 7.9GB
2M:   1:21.58, 66%, 8.4GB
4M:   1:17.52, 69%, 9.5GB
8M:   1:10.92, 76%, 12GB
16M:  1:17.09, 78%, 16GB
32M:  2:54.10, 90%, 22GB

PERGUNTA : Você pode verificar se identifiquei os melhores métodos para copiar um arquivo esparso para obter o melhor desempenho geral? Todas as sugestões sobre como fazer isso melhor são bem-vindas, assim como quaisquer preocupações que você possa ter com os métodos que estou usando.


O único outro que eu tentaria, dados seus esforços louváveis, é o rsync com a opção --sparse. Também é possível que diferentes tamanhos de bloco no dd melhorem sua velocidade ou inchaço.
precisa saber é

o tar também é bom para tentar também
Olivier Dulac

@OlivierDulac Tentei tar, mas esse foi um desempenho tão ruim que nem o incluí. Eu deveria ter. O acima são cópias locais. Adicionarei dados de desempenho de cópia em rede para uma rede de 10 Gbps, copiando na mesma sub-rede. Depois disso, acho que terei dados suficientes para tirar uma conclusão viável sobre qual é o melhor desempenho geral.
9788 Steve Jobsige

O rsync também suporta --sparse para fazer esse estilo de cópia. Você pode querer tentar isso. Também possui o benefício adicional de ser mensurável nas cópias local e pela rede.
Travis Campbell

@TravisCampbell Adicionei dados para rsync. Foi o pior desempenho de todos os testes que fiz.
Steve Amerige

Respostas:


5

A partir dos testes comparativos acima, parece que usar dd em nosso hardware de destino com um tamanho de bloco de 64K nos dá o melhor resultado geral, considerando o tempo de cópia e o inchaço:

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=64K conv=sparse

2
Olá Steve, por favor, divida na pergunta uma resposta, é assim que os sites stackexchange funcionam.
Bummi
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.