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


11

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

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

通过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) 

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)

通过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)

通过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)

通过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)

变化的块大小

我在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

问题:您能验证我确定了复制稀疏文件以获得最佳整体性能的最佳方法吗?我们欢迎您提供任何有关如何更好地做到这一点的建议,以及您对我使用的方法可能存在的任何疑问。


考虑到您值得称赞的努力,我要尝试的唯一另一个方法是使用--sparse选项进行rsync。dd中不同的块大小也可能会提高其速度或膨胀。
mpez0

tar也是一个不错的选择
Olivier Dulac 2015年

@OlivierDulac我尝试过tar,但是它的性能太差了,我什至没有包含它。我应该。以上是本地副本。我将添加10Gbps网络的网络复制性能数据,并在同一子网中进行复制。有了这些信息后,我认为我将有足够的数据得出一个可行的结论,该结论是总体表现最好的。
史蒂夫·阿梅里奇

rsync还支持--sparse进行这种复制。您可能想尝试一下。还具有可在本地和网络复制上进行测量的附加好处。
特拉维斯·坎贝尔

@TravisCampbell我为rsync添加了数据。这是我进行的所有测试中表现最差的。
史蒂夫·阿默里奇

Answers:


5

根据上述基准测试,考虑到复制时间和膨胀,在目标硬件上以64K块大小使用dd可以为我们提供最佳的总体结果:

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

2
嗨,史蒂夫,请回答一个问题,这就是stackexchange网站的工作方式。
bummi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.