¿Cuál es la forma más rápida de copiar un archivo disperso? ¿Qué método da como resultado el archivo más pequeño?

11

ANTECEDENTES : estoy copiando una escasa imagen de VM qcow2 que tiene un tamaño de 200 GB, pero tiene 16 GB de bloques asignados. He probado varios métodos para copiar este archivo disperso dentro del mismo servidor y tengo algunos resultados preliminares. El entorno es RHEL 6.6 o CentOS 6.6 x64.

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

Vía cp - mejor velocidad

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 - mejor intérprete general

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)

Vía 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 - mejor tamaño

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

Tamaño de bloque variable

Estaba preocupado por la 'hinchazón' durante la copia de dd (aumento del tamaño del archivo desde el original), por lo que varié el tamaño de bloque. Utilicé 'tiempo' para obtener también el tiempo total y el% de CPU. El archivo original en este caso es un archivo escaso de 200GB de 7.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

PREGUNTA : ¿Puede verificar que he identificado los mejores métodos para copiar un archivo disperso para obtener el mejor rendimiento general? Cualquier sugerencia sobre cómo hacerlo mejor es bienvenida, así como cualquier inquietud que pueda tener con los métodos que estoy usando.

Steve Amerige
fuente
El único otro que probaría, dados sus encomiables esfuerzos, es rsync con la opción --sparse. También es posible que un tamaño de bloque diferente en dd mejore su velocidad o hinchazón.
mpez0
el alquitrán es bueno para probar también
Olivier Dulac
@OlivierDulac Probé el alquitrán, pero este era tan pobre que ni siquiera lo incluí. Yo debería. Lo anterior son copias locales. Agregaré datos de rendimiento de copia de red para una red de 10 Gbps, copiando en la misma subred. Una vez que tenga eso, creo que tendré suficientes datos para sacar una conclusión viable para cuál es el mejor desempeño general.
Steve Amerige
rsync también admite --sparse para hacer este estilo de copia. Quizás quieras probar eso. También tiene el beneficio adicional de ser medible tanto en la copia local como en la red.
Travis Campbell
@TravisCampbell Agregué datos para rsync. Fue el peor desempeño de todas las pruebas que realicé.
Steve Amerige

Respuestas:

5

De la evaluación comparativa anterior, parece que usar dd en nuestro hardware de destino con un tamaño de bloque de 64K nos da el mejor resultado general teniendo en cuenta el tiempo de copia y la hinchazón:

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=64K conv=sparse
Steve Amerige
fuente
2
Hola Steve, divide la pregunta y la respuesta, así es como funcionan los sitios de intercambio de pila.
bummi