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

9

BACKGROUND : estou copiando uma imagem de VM qcow2 esparsa, com tamanho de 200 GB, mas com 16 GB de blocos alocados. Eu tentei vários métodos para copiar este arquivo esparso no mesmo servidor e ter 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)

Por meio do 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)

Variando o tamanho do bloco

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

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? Qualquer sugestão sobre como fazer isso melhor é bem-vinda, assim como quaisquer preocupações que você possa ter com os métodos que estou usando.

    
por Steve Amerige 05.02.2015 / 19:28

1 resposta

4

A partir do benchmarking acima, parece que usar o dd em nosso hardware de destino com um tamanho de blocos 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
    
por 20.02.2015 / 18:31