简洁版本: rm -rf mydir
,mydir
(递归地)包含 250 万个文件,在一台空闲的机器上大约需要 12 个小时。
更多信息:被删除的文件大部分都是其他目录中文件的硬链接(被删除的目录实际上是 制作的最旧备份rsnapshot
;rm
命令实际上是 给出的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
,但我认为还是太多了。(解释为什么rsync
比rm
:“大多数文件系统都以 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/sdX
和hdparm -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 树:
- 在同一个 btrfs 文件系统上创建一个虚拟子卷。
- 将您要删除的顶层目录移动到所述子卷中 - 如果您在同一个 btrfs 文件系统上执行此操作,即使跨子卷,此操作也应该非常快。
- 销毁子卷。
内核将开始在后台回收空间,因此您不会立即获得可用空间,但该过程应该比执行任何类型的用户空间删除都要快得多。
答案3
您可以重命名目录,然后在后台进程中删除重命名的目录。这不会加快删除操作的速度。但是,这将允许程序在删除操作正在进行时继续使用空目录。
我不确定这是否适用于您的用例。这取决于程序是否在磁盘空闲之前无法继续(即它将执行一些繁重的磁盘操作)。这取决于程序是否会用大量数据填满磁盘。