使用硬链接来精简备份的最有效方法

使用硬链接来精简备份的最有效方法

我有一个备份磁盘,其中包含同一台计算机不同日期的数百个备份。备份是使用 rsync 和硬链接进行的,即如果文件没有更改,则备份脚本只会在旧备份中创建指向该文件的硬链接。因此,如果一个文件永远不会更改,那么您在备份磁盘中基本上拥有一份副本,但在每个目录中都有 100 个指向该文件的硬链接,代表每个日期的备份(例如back-1, back-2, ... back-n)。如果我想精简它,我会删除其中的一部分,但不是全部。假设我想删除back_5, back_6, ... back_10(仅作为示例,在我的真实场景中还有更多)。然后我尝试通过以下方式将其并行化:

echo back_5 back_6 back_10 | xargs -n 1 -P 0 rm -rf

这需要几个小时。那么有没有更快的方法来做到这一点呢?

答案1

我看不到你如何使用参数这样一点也不慢。我的联机帮助页显示 -P 是进程数,-n 是参数数。没有特殊值-P0,因此可能会被忽略(或者,如果荣幸的话,您将获得零个进程,这将解释 24 小时什么都没有!)。并-n1确保您得到一个执行(2) 对于每个文件名,这大约是最慢的。

我怀疑并行这项工作会给你带来很多好处。我会想只是

$ echo filenames ... | xargs rm -rf 

就足够了。-P4如果你愿意的话,你可以尝试一些值。经过不是限制命令行参数的数量,可以最大限度地减少调用/bin/rm并让它通过磁盘缓存串行进行。

答案2

df 报告的数字较小,因为您主要删除相对较小的目录。此外,根据文件系统,对目录的更改和对文件链接数量的更改会立即记录和/或同步到磁盘,因为它们对于故障恢复至关重要,因此速度较慢。

这实际上证明了您的链接效率!

答案3

根据我的经验,加速基于 rsync+hardlink 的备份的最佳方法是减少您拥有的文件数量。

大量小文件导致rsync变慢很多

如果您可以以这样的方式组织数据,以便您的大部分小文件、大部分只读目录变红tar,那么您应该会看到备份脚本的速度显着提高。 (使用诸如 之类的工具archivemount,您可以访问这些档案而无需解压它们)。

并行化备份脚本可能不会有帮助,甚至可能会减慢备份脚本的速度(可预测的磁盘访问更为优化)。

答案4

这也是一种基于经验的响应,而不是由硬数据支持的响应。

我发现,当删除具有大量交叉链接的类似树中的许多文件时,并行删除孤立的子树似乎更快。让我尝试用图来解释一下:

topdir1
    |-a1
    |-b1
    |-c1

topdir2
    |-a2
    |-b2
    |-c2

topdir3
    |-a3
    |-b3
    |-c3

我的印象是,并行删除, ,然后继续删除, , ,比并行删除topdir1, topdir2,更快。 (我对此的理论是,“相同”文件的多个并行取消链接会导致 inode 链接引用计数的争用,但我强调我还没有用硬数据检查这一点。)topdir3a1b1c1a2b2c2

for topdir in *
do
    echo "Removing $topdir..."
    for sub in "$topdir"/*; do rm -rf "$sub" & done
    wait
    rm -rf "$topdir"
done

相关内容