$ rsync -aPhmS /mnt/data/ /mnt/data1/
今天在复制一些数据时遇到了一个奇怪的问题。
使用 时--sparse
,标志 rsync 的执行速度比预期慢得多:
time rsync --sparse
real 4m8.791s
user 0m23.558s
sys 2m43.257s
time rsync
(无-s)
real 2m32.607s
user 0m39.175s
sys 1m33.885s
time cp
real 2m31.811s
user 0m0.254s
sys 0m52.627s
监控进度,每隔几秒它就会停止写入,传输速度降至 0。
iostat
报告设备利用率约为 50-60%(与上面的时间相符 - 较快的时间约为较慢的 50%)。
为什么会出现这种情况?
是否有针对此性能问题的修复或解决方法? (除了没有 -S 之外。该标志之所以存在,是因为某些数据包含稀疏文件。)
我可以想象一个零碎的解决方案 - 以某种方式检测所有稀疏文件,列出所有非稀疏文件和所有稀疏文件的列表,并在这些列表中运行 rsync 两次。 (但我对 Linux 很陌生,所以这样的脚本远远超出了我的能力。)
rsync 版本 3.2.7 协议版本 31
答案1
--sparse
带有for 标志的事情rsync
是,它将需要分析它想要复制的任何文件(不仅仅是稀疏文件),以查看是否可以在目标中创建稀疏文件。
这是一个例子。我创建了一个 1GB 的文件不是疏。
$ dd if=/dev/zero of=bigfile bs=1G count=1
1+0 records in
1+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 0.65238 s, 1.6 GB/s
$ ls -lsh bigfile
1.0G -rw-r--r-- 1 root root 1.0G May 28 17:18 bigfile
现在请注意,如果我使用 复制此文件rsync --sparse
,则目标将要即使来源不是稀疏的。
$ time -p rsync --sparse bigfile bigfile.sparse
real 2.88
user 4.19
sys 0.56
$ ls -lsh bigfile.sparse
0 -rw-r--r-- 1 root root 1.0G May 28 17:19 bigfile.sparse
这意味着rsync
需要分析该文件以找出如何“稀疏”它。它需要搜索目的地上可能“稀疏”的空白空间块。这需要额外的计算时间。
顺便说一句,即使对于已经稀疏的文件,它也会执行相同的操作。它将需要读取整个“提取的”源文件,进行相同的分析,然后根据所做的分析在目的地创建一个新的稀疏文件。