我有一个备份磁盘,其中包含同一台计算机不同日期的数百个备份。备份是使用 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 链接引用计数的争用,但我强调我还没有用硬数据检查这一点。)topdir3
a1
b1
c1
a2
b2
c2
for topdir in *
do
echo "Removing $topdir..."
for sub in "$topdir"/*; do rm -rf "$sub" & done
wait
rm -rf "$topdir"
done