btrfs 上的 Rsync 备份非常慢

mat*_*pen 5 linux backup rsync hardlink btrfs

我的环境是 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"
Run Code Online (Sandbox Code Playgroud)

我刚刚意识到执行备份btrfs需要非常长的时间:略多于一个小时,相比之下执行相同的复制到ext4.

为了排除磁盘故障,我dd使用 Ubuntu 附带的“磁盘实用程序”进行了一些基准测试,但我在两个磁盘上都获得了相同的性能。缓慢的部分似乎是针对先前备份的硬链接。即使经过碎片整理和清理,以下命令在 上也需要大约 53 分钟btrfs,但在 上仅需要 1 分钟ext4

cp -arl "$previousBackup" "$destDir"
Run Code Online (Sandbox Code Playgroud)

通过在互联网上的研究,我发现btrfs了硬链接的性能会受到影响的迹象,但我没想到会有如此巨大的差异。我发现这个命令更快,但仍然需要 30 多分钟才能完成:

cp -ar --reflink "$previousBackup" "$destDir"
Run Code Online (Sandbox Code Playgroud)

有没有人有这种行为的经验并且可以确认?有没有简单的方法来纠正它(例如不同的挂载选项),或者我应该尝试删除尽可能多的硬链接并只使用引用链接?

编辑

我刚刚发现即使删除一个目录也btrfs需要一个多小时。同样的操作在“孪生”ext4磁盘上是即时的。这里的元数据显然存在问题。

Gia*_*968 0

你说你正在用你的命令复制硬链接rsync,但是-H标志在哪里?我在你的命令中没有看到它:

\n\n
rsync --inplace --no-whole-file --link-dest="$previousBackup" "$sourceDir" "$destDir"\n
Run Code Online (Sandbox Code Playgroud)\n\n

我理解rsync\xe2\x80\x94 对于硬链接 \xe2\x80\x94 的工作原理的方式是,如果没有该-H标志,则复制实际数据而不是硬链接,如rsync手册页上所述:

\n\n
\n

-H, --硬链接

\n\n

这告诉 rsync 在传输中查找硬链接文件,并将接收端的相应文件链接在一起。如果没有此选项,传输中的硬链接文件将被视为单独的文件。

\n
\n\n

我可以想象这样一个过程,其中许多类似的文件被一遍又一遍地复制而不是硬链接,这会增加传输时间。

\n\n

另外,还可以考虑使用-z( --compress) 标志:

\n\n
\n

-z, --压缩

\n\n

使用此选项,rsync 在将文件数据发送到目标计算机时对其进行压缩,从而减少传输的数据量,这在连接速度较慢时非常有用。

\n
\n\n

是的,这是同一系统上的 USB 到 USB 传输,因此\xe2\x80\x99s 可能速度已经优化,但它不会\xe2\x80\x99s 看到-z可能会帮助您克服自然的 USB 数据传输瓶颈。

\n\n

可以在此处找到解释这些标志\xe2\x80\x94 以及其他标志\xe2\x80\x94 的漂亮、简单的教程。

\n

  • 至于“--compress”选项,这对于网络传输最有用。人们可以测试差异,但使用 USB 不太可能带来任何优势,因为更快的传输可能与压缩数据的 CPU 时间相平衡。不管怎样,这并不能解决我的问题,因为“ext4”(速度快)和“btrfs”(速度慢)的选项是相同的。 (4认同)
  • 谢谢您的回答。 `--hard-links` 用于_保留_源目录中的硬链接。通过我使用的命令“--link-dest”,会导致目标目录与之前的备份_在同一 USB 磁盘上_进行硬链接。本质上,这是一个_差异_备份,其中只有更改的文件实际上从源传输,其他任何内容都是从备份到备份的长链硬链接。 (3认同)