复制稀疏文件的最快方法是什么?什么方法会产生最小的文件?

Ste*_*ige 13 files copy centos6 kvm-virtualization

背景:我正在复制一个大小为 200GB,但分配了 16GB 块的稀疏 qcow2 VM 映像。我尝试了各种方法来在同一服务器中复制这个稀疏文件,并获得了一些初步结果。环境为 RHEL 6.6 或 CentOS 6.6 x64。

ls -lhs srcFile 
16G -rw-r--r-- 1 qemu qemu 201G Feb  4 11:50 srcFile
Run Code Online (Sandbox Code Playgroud)

通过 cp - 最佳速度

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) 
Run Code Online (Sandbox Code Playgroud)

Via dd - 最佳整体表现者

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)
Run Code Online (Sandbox Code Playgroud)

通过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)
Run Code Online (Sandbox Code Playgroud)

通过同步

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)
Run Code Online (Sandbox Code Playgroud)

通过 virt-sparsify - 最佳尺寸

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

改变块大小

我担心 dd 复制期间的“膨胀”(文件大小比原来增加),所以我改变了块大小。我还使用“时间”来获取总时间和 CPU%。本例中的原始文件是一个 7.3GB 的 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
Run Code Online (Sandbox Code Playgroud)

问题:您能否确认我已经确定了复制稀疏文件以获得最佳整体性能的最佳方法?欢迎任何关于如何更好地做到这一点的建议,以及您对我使用的方法可能有的任何顾虑。

Ste*_*ige 7

从上面的基准测试来看,考虑到复制时间和膨胀,在我们的目标硬件上使用块大小为 64K 的 dd 看起来给了我们最好的整体结果:

dd if=srcFile of=dstFile iflag=direct oflag=direct bs=64K conv=sparse
Run Code Online (Sandbox Code Playgroud)

  • 嗨,史蒂夫,请将问题分成一个答案,这就是 stackexchange 站点的工作方式。 (2认同)