有效地从 ZFS 中删除 1000 万个以上的文件

nag*_*lzs 36 freebsd performance zfs

我写了一个错误的程序,它在 /tmp 下意外创建了大约 30M 的文件。(这个错误是几周前引入的,它每秒创建几个子目录。)我可以将 /tmp 重命名为 /tmp2,现在我需要删除这些文件。系统是 FreeBSD 10,根文件系统是 zfs。

与此同时,镜像中的一个驱动器出现问题,我已经更换了它。该驱动器有两个 120GB SSD 磁盘。

问题是:更换硬盘驱动器和重新同步整个阵列用了不到一个小时。删除文件 /tmp2 是另一回事。我写了另一个程序来删除文件,它每秒只能删除 30-70 个子目录。删除所有文件需要 2-4 天。

重新同步整个阵列需要一个小时,而从磁盘中删除需要 4 天,这怎么可能?为什么我的表现这么差?70 次删除/秒似乎非常非常糟糕的性能。

我可以手动删除 /tmp2 的 inode,但这不会释放空间,对吗?

这可能是 zfs 或硬盘驱动器的问题还是什么?

eww*_*ite 33

ZFS 中的删除是昂贵的。如果您在文件系统上启用了重复数据删除,则更是如此(因为取消引用重复数据删除的文件很昂贵)。快照也可能使问题复杂化。

您最好删除/tmp目录而不是其中包含的数据。

如果/tmp是 ZFS 文件系统,请将其删除并重新创建。

  • 我错了。这是一个单独的文件系统。这是有效的:重新启动到单用户模式,然后执行“zfs delete zroot/tmp ; zfs create zroot/tmp; chmod 41777 /tmp ” (11认同)
  • 总共有 5 分钟的停机时间。极好的!:-) (6认同)

小智 27

重新同步整个阵列需要一个小时,而从磁盘中删除需要 4 天,这怎么可能?

考虑一栋办公楼。

从所有楼层的所有办公室中移除所有计算机、家具和固定装置需要长时间,但其他客户可以立即使用这些办公室。

用 RDX 拆除整栋建筑快得多,但下一个客户可能会抱怨这个地方有多通风。

  • @developerbmw 实际上也没有文件或文件夹,但我们需要隐喻概念来理解正在发生的事情。 (10认同)
  • ZFS 不是办公楼 :) (8认同)
  • @JamesRyan 是的,这实际上是一个很好的比喻......我只是愚蠢 (2认同)

Ian*_*son 7

这里发生了很多事情。

首先,所有现代磁盘技术都针对批量传输进行了优化。如果您需要移动 100MB 的数据,如果它们位于一个连续的块中,而不是分散在各处,那么它们的速度会快得多。SSD 在这里有很大帮助,但即使它们也更喜欢连续块中的数据。

其次,就磁盘操作而言,重新同步是非常理想的。您从一个磁盘读取大量连续的数据块,对其执行一些快速 CPU 操作,然后将其重写为另一个大的连续数据块到另一个磁盘。如果中途断电,没什么大不了的 - 您只需忽略任何校验和错误的数据并照常进行。

第三,删除文件真的很慢。ZFS 特别糟糕,但实际上所有文件系统删除都很慢。他们必须在磁盘上修改大量不同的数据块并正确计时(即等待),以便在断电时不会损坏文件系统。

重新同步整个阵列需要一个小时,而从磁盘中删除需要 4 天,这怎么可能?

重新同步是磁盘非常快的事情,而删除是磁盘很慢的事情。每兆字节的磁盘,您只需要做一点点重新同步。该空间中可能有一千个文件需要删除。

70 次删除/秒似乎非常非常糟糕的性能

这取决于。我不会对此感到惊讶。您还没有提到您使用的是哪种类型的 SSD。现代英特尔和三星 SSD 非常擅长这种操作(读取-修改-写入),并且性能会更好。较便宜/较旧的 SSD(例如 Corsair)会很慢。每秒 I/O 操作数 (IOPS) 是这里的决定因素。

ZFS要删除的东西特别慢。通常,它会在后台执行删除操作,因此您看不到延迟。如果你正在做大量的事情,它无法隐藏它并且必须延迟你。


附录:为什么删除很慢?

  • 删除文件需要几个步骤。文件元数据必须标记为“已删除”,最终必须回收它以便可以重新使用空间。ZFS 是一个“日志结构化文件系统”,如果您只创建事物而不删除它们,它的性能最佳。日志结构意味着,如果您删除某些内容,日志中就会出现空白,因此必须重新排列(碎片整理)其他数据以填补空白。这对用户是不可见的,但通常很慢。
  • 必须以这样一种方式进行更改,即如果中途断电,文件系统保持一致。通常,这意味着要等到磁盘确认数据确实在介质上;对于 SSD,这可能需要很长时间(数百毫秒)。这样做的净效果是有更多的簿记(即磁盘 I/O 操作)。
  • 所有的变化都很小。您需要修改一个闪存块,而不是读取、写入和擦除整个闪存块(或磁盘的柱面)。为此,硬件必须读取整个块或柱面,在内存中对其进行修改,然后再次将其写出到介质中。这需要很长时间。

  • 我不了解 ZFS,但某些文件系统允许您取消目录与内容的链接,但稍后在垃圾收集/碎片整理/清理阶段删除这些内容。ZFS 是否有任何实用程序可以执行这种懒惰的删除?它实际上不会加快 OP 的删除速度,但如果它在内务处理期间隐式发生,则可能会减少它的问题。 (2认同)

Ole*_*nge 5

Ian Howson 很好地回答了为什么它很慢。

如果您并行删除文件,您可能会看到速度提高,因为删除可能使用相同的块,因此可以节省多次重写相同的块。

所以尝试:

find /tmp -print0 | parallel -j100 -0 -n100 rm
Run Code Online (Sandbox Code Playgroud)

看看它的性能是否比每秒 70 次删除更好。