我的环境是 Ubuntu 15.04,内核为 3.19.0-28-generic,Btrfs v3.17。
我有两个相同的外部 USB 硬盘,用于备份脚本。其中一个使用 格式化btrfs
,另一个使用 格式化ext4
。源文件系统始终是ext4
。rsync
命令如下所示:
rsync --inplace --no-whole-file --link-dest="$previousBackup" "$sourceDir" "$destDir"
我刚刚意识到执行的备份btrfs
需要极其长时间: 稍微超过一个小时,而执行相同的复制则需要 4 分钟ext4
。
为了排除磁盘故障,我使用dd
和 Ubuntu 附带的“磁盘实用程序”执行了一些基准测试,但两个磁盘的性能相同。缓慢的部分似乎是与之前的备份进行硬链接。即使在碎片整理和清理之后,以下命令在 上需要大约 53 分钟btrfs
,但在 上只需 1 分钟ext4
:
cp -arl "$previousBackup" "$destDir"
通过互联网上的研究,我发现了一些迹象表明btrfs
硬链接的性能会受到影响,但我没想到这一点巨大的差异。我发现这个命令更快,但仍然需要 30 多分钟才能完成:
cp -ar --reflink "$previousBackup" "$destDir"
有没有人有过这种行为的经验并可以证实这一点? 有没有简单的方法可以纠正它(例如不同的挂载选项)或者我应该尝试删除尽可能多的硬链接并只使用 reflinks?
编辑
我刚刚发现删除目录btrfs
需要一个多小时。在“孪生”磁盘上,同样的操作是瞬间完成的ext4
。这里显然存在元数据问题。
答案1
你说你正在复制硬链接rsync
命令,但是-H
标志在哪里?我在你的命令中没有看到它:
rsync --inplace --no-whole-file --link-dest="$previousBackup" "$sourceDir" "$destDir"
我理解的工作原理rsync
(关于硬链接)是,如果没有标志,-H
则会复制实际数据,而不是硬链接,如rsync
手册页:
-H, --hard-links
这告诉 rsync 在传输中查找硬链接文件,并将接收端的相应文件链接在一起。如果没有此选项,传输中的硬链接文件将被视为单独的文件。
我可以想象,这样的过程——许多类似的文件被一遍又一遍地复制而不是被硬链接——会增加传输时间。
另外,也可以考虑使用-z
( ) 标志:--compress
-z,——压缩
使用此选项,rsync 会在将文件数据发送到目标机器时对其进行压缩,从而减少传输的数据量——这在慢速连接中很有用。
是的,这是在同一系统上进行的 USB 到 USB 的传输,因此其速度可能已经进行了优化,但看到它-z
也许可以帮助您克服自然的 USB 数据传输瓶颈也并没有什么坏处。
一个简单易懂的教程,解释了这些标志以及其他标志。可以在这里找到。