btrfs balance 是否也对文件进行碎片整理?

pau*_*doo 10 btrfs

当我运行时btrfs filesystem balance,这是否隐式地对文件进行碎片整理?我可以想象平衡只是分别重新分配每个文件范围,保留现有的碎片。

有一个常见问题条目,“平衡”有什么作用?,在这一点上不清楚:

btrfs 文件系统平衡是一种操作,它简单地获取文件系统上的所有数据和元数据,并将其重新写入磁盘上的不同位置,并在途中通过分配器算法。它最初是为多设备文件系统设计的,以便在设备之间更均匀地分布数据(即“平衡”它们的使用)。这在将新设备添加到几乎完整的文件系统时特别有用。

由于平衡的工作方式,它也有一些有用的副作用:

  • 如果有大量已分配但未使用的数据或元数据块,则余额可能会回收部分已分配空间。这是在单设备文件系统上运行平衡的主要原因。
  • 在复制损坏的文件系统上(例如,磁盘失效并被移除的 RAID-1 FS),它将强制 FS 在当前活动的设备之一上重建丢失的数据副本,恢复 RAID-1 功能文件系统。

zaT*_*cky 12

TL; 博士

Btrfs 的碎片整理功能专门用于修复文件夹元数据和文件内容中的碎片,而创建平衡功能是为了在添加或删除驱动器时“平衡”(因此得名)驱动器之间共享的数据量。虽然它们在所做的事情上确实有一些理论上的重叠,但它们没有直接关系,因此文档没有将这两个功能联系起来。

下面详细回答。当然请注意,我的长篇回答是希望它能帮助那些不了解所面临问题的全部背景的人。


块分配

btrfs 的一个重要概念是块分配。当您将数据写入 btrfs 时,它会将数据写入“当前”块,通常为 1GB 大小1。如果“当前”块变满,则分配一个新块。如果一个现有的块被清空,当需要一个新的块时,它的存储空间可用于重新分配。

如果文件系统使用多个带有“dup”、“single”或“raid1”存储配置文件的驱动器,则块分配器总是倾向于将下一个新块放在可用空间最多的驱动器上。这通常确保驱动器被平等使用。


平衡如何发挥作用

平衡功能通过获取现有数据块并将它们重新写入“当前”块来工作。当以这种方式清空现有块时,它会自动提供给分配器。如果正在清空的现有块开始时未满(可能块中的旧数据已被删除),最终结果是释放磁盘空间,因为新块与相关数据“更紧密地打包在一起”。

这是理论上可以用作碎片整理策略的一部分的部分,我认为这就是许多人认为它已经这样做的原因。但是,当然,平衡功能的设计考虑了特定的目的,因此它为什么建看文件内容。在将数据复制到新块之前,它只检查它从现有块中取出的数据是否相关2

哪里的余额部分进来吗?

当您向文件系统添加新驱动器时,分配器首先倾向于将所有新数据写入新驱动器,主要是因为它比现有驱动器具有更多可用空间。通过重写所有块,所有初始平衡的块仅写入新驱动器。一旦均衡(变得平衡),其余数据将在驱动器之间平均重新分配。

典型的平衡方案:

我有 2 个 500GB 驱动器,每个驱动器使用 240GB;我添加了另一个 500GB 驱动器。我通常会有:

  • 驱动器 a:已使用 240GB
  • 驱动器 b:已使用 240GB
  • 驱动器 c:已使用 0GB

我开始平衡所有数据。通过余额大约四分之一,我可能会看到类似于以下的情况:

  • 驱动器 a:已使用 180GB
  • 驱动器 b:已使用 180GB
  • 驱动器 c:已使用 120GB

在大约三分之一的标记处,它似乎是平衡的:

  • 驱动器 a:已使用 160GB
  • 驱动器 b:已使用 160GB
  • 驱动器 c:已使用 160GB

您当然可以在此时停止平衡操作,尽管有一些原因(好的和坏的)为什么您可能希望让它完成3


btrfs 中的碎片是如何发生的

Btrfs 是一个 CoW(写时复制)文件系统,这意味着数据永远不会被覆盖4。如果您有一个现有的 100MB 文件并覆盖了该文件的 1MB 部分,则该 1MB 部分不会覆盖驱动器上的现有数据。相反,它写在“当前”块的其他地方。Btrfs 会跟踪这些新数据“片段”的存储位置。这对于维护数据快照最有用,因为这意味着默认情况下会保留旧数据。由于 SSD 以非常相似的方式也不会覆盖数据,因此这种 CoW 机制非常适合让 SSD 保持其使用寿命和性能。

碎片整理的用武之地

不管优点如何,有些文件经常被覆盖(通常是数据库文件),因此最终会有数百个这样的片段。使用 SSD,短期内几乎没有性能损失。但是对于主轴驱动器,性能损失是严重的。

一种解决方案当然是使用 btrfs 的碎片整理功能。碎片整理操作按照当前状态的逻辑顺序重新写入当前块中的文件内容,从而将碎片减少为一个 100MB 的大数据集,而不是许多单独的片段。

另一种解决方案是专门为此类文件使用“nocow”功能。nocow 功能会导致文件就地被覆盖。请注意 nocow 5 6 的注意事项。


再次总结

  • 平衡查看块和条带 - 除了这些块中的数据是否仍然相关之外,实际上并不知道文件内容。

  • 碎片整理操作查看文件夹数据和单个文件内容,并以尽可能连续的方式重写数据。不利的一面是快照,其中碎片整理会导致重复和额外的驱动器使用。


笔记:

  1. 尽管块的大小通常为 1GB,但它们可以更大或更小。使用 raid 类型时,块通常以 1GB 的倍数跨多个驱动器进行条带化。例如,带有raid0 的5 个驱动器通常会产生一个由1GB 块组成的5GB 条带写入每个驱动器。

  2. Btrfs 使用“引用”来文件内容。当文件的一部分被覆盖时,实时文件系统会“引用”写入该数据的位置。然而,快照可能仍然“引用”旧位置。如果没有快照——或者旧的快照被删除,这将导致没有引用原始覆盖内容的“引用”。该内容然后被认为是不相关的,并且不会在余额操作中与其他相关数据一起复制。

  3. 此时,假设存储使用简单的“单一”配置文件7,第一个平衡的 160GB 将全部移动到新驱动器 - 但此时,它仍有大约 320GB 剩余空间需要平衡。其余的将在驱动器之间平均平衡。使用心轴,理想情况下,在让 btrfs 重新平衡所有 3 个驱动器以更好地“传播”数据之前,您只需要平衡 160 个块。对于 SSD,试图保持数据的均匀“传播”变得非常复杂,可能毫无意义,而且更有可能对 SSD 的使用寿命非常不利。

  4. 例外是“nocow”功能。

  5. 如果有快照,对“live”文件进行碎片整理会导致快照和“live”文件指向磁盘上不同的数据位置,从而导致数据被复制,从而占用额外的磁盘空间。当通用重复数据删除功能可用时,这将不是什么大问题。

  6. 使用 nocow 意味着 btrfs 不维护文件内容的校验和。

  7. 对于大多数 RAID 类型(raid1 是例外),跨驱动器“传播”是没有实际意义的,因为条带通常无论如何都要跨所有驱动器写入。


小智 6

也许查看命令的源代码可能会有所帮助

更喜欢 btrfs balance start

“btrfs 文件系统平衡”命令已弃用,请改用“btrfs 平衡启动”命令。

然后在命令字符串上

"btrfs [filesystem] balance start [options] <path>",
"Balance chunks across the devices",
"Balance and/or convert (change allocation profile of) chunks that",
"passed all filters in a comma-separated list of filters for a",
"particular chunk type.  If filter list is not given balance all",
"chunks of that type.  In case none of the -d, -m or -s options is",
"given balance all chunks in a filesystem."
Run Code Online (Sandbox Code Playgroud)

我可能会再看一眼,但我看不到任何对结构和 ioctl() 调用进行碎片整理的引用。所以没有明确的碎片整理。

它所做的只是从一个地方复制到另一个地方,并在此过程中使用默认分配器。采取从这里

根据分配目的和分配模式,算法要么直接在每个合适的分配组中搜索一个连续的空闲空间范围(btrfs 中的一个组对应于上述块

因此,根据分配模式、设备上的可用空间等,您可以说 btrfs 将以不需要进行碎片整理的方式进行分配。您可能会考虑一种形式的隐式碎片整理。

HTH