删除文件花费的时间太长


11

简短版本rm -rf mydirmydir(递归地)包含250万个文件,在大多数空闲的计算机上大约需要12个小时。

更多信息:大部分要删除的文件是指向其他目录中文件的硬链接(实际上,删除的目录是由进行的最旧的备份rsnapshotrm命令实际上是由提供的rsnapshot)。因此,大多数目录条目都将被删除-文件内容本身并不多。它大约是几十GB。

我不确定btrfs是罪魁祸首。我记得在开始使用备份之前,备份也非常慢btrfs,但是我不确定删除是否缓慢。

该计算机是具有4 GB RAM的Intel Core i5 2.67 GHz。它有两个SATA磁盘:一个有操作系统和其他一些东西,备份磁盘是1 TB WDC WD1002FAEX-00Z3A0。主板是华硕P7P55D。

编辑:该机器是Linux的Debian狂潮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/sdXhdparm -t /dev/sdX
[2] find mydir -print|wc -l引导后立即运行所花费的时间。
[3]在XFS磁盘上,这是使用沿着树走后不久find。在BTRFS磁盘上,这是旧的度量标准(我认为它与缓存的树无关)。

似乎是一个问题btrfs


1
一个目录中有250万个文件?我不知道能很好处理的文件系统。
迈克尔·汉普顿

@MichaelHampton:它不平坦,包含嵌套目录。我在简短描述中添加了“递归”一词;我希望这可以澄清它。
Antonis Christofides

1
为什么在写时复制文件系统上使用写时复制目录技巧?
symcbean 2015年

@symcbean:您的意思是硬链接技巧对btrfs吗?当然可以,但是您认为这可能相关吗?现在我不记得为什么我决定尝试btrfs
Antonis Christofides 2015年

2
啊,我现在记得了。我决定切换到btrfs因为我想要透明压缩。现在:rsnapshot使用硬链接。它没有不使用硬链接的任何选择。因此,硬链接与的btrfs“写时复制”功能重叠,但是我对此无能为力。
Antonis Christofides

Answers:


3

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

如果您不喜欢它,则可以等待,直到上游对其进行修复,或者继续使用其他性能更好的文件系统。

但是,您的主要错误是使用带有btrfs的古老内核(3.16,是的,发布时已经很古老了)。Btrfs是一个仍在繁重开发中的文件系统,因此您应始终使用最新,最强大的内核版本,以获取改进信息。如果您的发行版不做反向移植,您可以自己做,也可以避免。

Btrfs在3.19版内核中获得了许多性能改进-这是您应该在生产环境中使用的最低版本,您的3.16版内核显然没有反向移植。

还要记住,根据Chris Mason的说法,他确实认为Btrfs到目前为止很稳定,但尚未准备好生产。


1
您如何定义“知名”?我在网络上进行了广泛而徒劳的搜索,没有一个参与者参与此讨论。但是,无论如何,我现在只是远离btrfs。尽管它的发展似乎将永远长盛不衰。
Antonis Christofides

1
好吧,例如有来自CoreOS的人。他们将大约一年的Btrfs用作默认文件系统,直到2015年初,他们又切换回Ext4 + Overlayfs。请记住,这是在内核版本3.19之前的,该版本为Btrfs带来了许多改进。还请看一下2015年10月的演示文稿,它介绍了数据库工作负载条件下的ext4,xfs,zfs和btrfs,即Postgres:de.slideshare.net/fuzzycz/…另一个基准,尽管内核不是那么好:goo.gl/rR3kZ2
马克Stürmer

就像我告诉我的那样,您的盒子的内核版本(3.16)受到性能问题的困扰,据Chris Mason称,对于严重的Btrfs问题,至少使用3.19。如果您想认真地使用Btrfs,请始终使用最新,最好的内核-某些东西在Debian中并不能很好地起作用……并搜索术语“ btrfs元数据性能”。
马克·斯蒂默(MarcStürmer)

2

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

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

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


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.