删除文件花费的时间太长

删除文件花费的时间太长

简洁版本: rm -rf mydirmydir(递归地)包含 250 万个文件,在一台空闲的机器上大约需要 12 个小时。

更多信息:被删除的文件大部分都是其他目录中文件的硬链接(被删除的目录实际上是 制作的最旧备份rsnapshotrm命令实际上是 给出的rsnapshot)。因此被删除的大多是目录条目 - 文件内容本身并不多;大约有几十 GB。

我不太确定这btrfs就是罪魁祸首。我记得在我开始使用之前备份也很慢btrfs,但我不确定删除是否导致速度缓慢。

该机器是 Intel Core i5 2.67 GHz,配备 4 GB RAM。它有两个 SATA 磁盘:一个装有操作系统和其他一些内容,备份磁盘为 1 TB WDC WD1002FAEX-00Z3A0。主板是华硕 P7P55D。

编辑:该机器是 Debian wheezy,带有 Linux 3.16.3-2~bpo70+1。文件系统的安装方式如下:

root@thames:~# mount|grep rsnapshot
/dev/sdb1 on /var/backups/rsnapshot type btrfs (rw,relatime,compress=zlib,space_cache)

编辑:使用rsync -a --delete /some/empty/dir mydir大约需要 6 个小时。与 相比有显著的改进rm -rf,但我认为还是太多了。(解释为什么rsyncrm:“大多数文件系统都以 Btree 格式存储目录结构,删除文件的顺序非常重要。执行取消链接时,需要避免重新平衡 Btree……rsync -a --delete按顺序进行删除”

编辑:我附加了另一个磁盘,该磁盘的目录中有 220 万个文件(递归),但在 XFS 上。以下是一些比较结果:

                  On the XFS disk      On the BTRFS disk
Cached reads[1]       10 GB/s               10 GB/s
Buffered reads[1]     80 MB/s              115 MB/s
Walk tree[2]         11 minutes            43 minutes
rm -rf mydir[3]       7 minutes            12 hours

[1] 使用hdparm -T /dev/sdXhdparm -t /dev/sdX。 [2]启动后立即
运行所需的时间。 [3] 在 XFS 磁盘上,这是在使用 遍历树后不久的结果。 在 BTRFS 磁盘上,这是旧的测量值(我不认为它是使用缓存的树)。find mydir -print|wc -l
find

这似乎是一个问题btrfs

答案1

嗯,这仍然是一个 Btrfs 问题,众所周知,与其他文件系统相比,删除许多小文件确实需要相当长的时间。

如果您不喜欢它,您可以等到上游修复它或者转到另一个更好的文件系统。

不过,你的主要错误是使用老旧的内核(3.16,是的,你发帖时它已经很老了)和 btrfs。Btrfs 是一个仍在大力开发的文件系统,因此你应该始终使用最新最好的内核版本来了解改进之处。如果你的发行版不支持反向移植,你可以自己做,否则你就完蛋了。

Btrfs 在内核版本 3.19 中获得了很大的性能改进 - 这是您在生产中应该使用的最低版本,如果没有反向移植,您的内核版本 3.16 显然很糟糕。

还请记住,根据 Chris Mason 的说法,他确实认为 Btrfs 现在已经稳定,但尚未准备好投入生产。

答案2

我参加这个聚会有点晚了,但这里有一个技巧可以非常快速地删除极大的 btrfs 树:

  1. 在同一个 btrfs 文件系统上创建一个虚拟子卷。
  2. 将您要删除的顶层目录移动到所述子卷中 - 如果您在同一个 btrfs 文件系统上执行此操作,即使跨子卷,此操作也应该非常快。
  3. 销毁子卷。

内核将开始在后台回收空间,因此您不会立即获得可用空间,但该过程应该比执行任何类型的用户空间删除都要快得多。

答案3

您可以重命名目录,然后在后台进程中删除重命名的目录。这不会加快删除操作的速度。但是,这将允许程序在删除操作正在进行时继续使用空目录。

我不确定这是否适用于您的用例。这取决于程序是否在磁盘空闲之前无法继续(即它将执行一些繁重的磁盘操作)。这取决于程序是否会用大量数据填满磁盘。

相关内容