总结

总结

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

有一个常见问题解答条目,“平衡”起什么作用?,这一点尚不明确:

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

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

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

答案1

总结

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

下面是详细的解释。当然请注意,长篇大论的回答是为了帮助那些不完全了解这些功能用途的人。


区块分配

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

如果文件系统使用多个驱动器,包括“dup”、“single”或“raid1”存储配置文件,块分配器始终优先将下一个新块放在可用空间最多的驱动器上。这通常可确保驱动器得到平等利用。


平衡是如何发挥作用的

balance功能的工作原理是获取现有数据块并将其重新写入“当前”块。当现有块以这种方式清空时,它会自动提供给分配器。如果被清空的现有块一开始就不是满的(也许块中的旧数据已被删除),最终结果是释放磁盘空间,因为较新的块“更紧密地填充”了相关数据。

从理论上讲,这部分可以用作碎片整理策略的一部分,我认为这就是许多人认为它已经这样做的原因。然而,当然,平衡功能是为了特定目的而构建的,因此它不是查看文件内容。它仅有的在将数据复制到新块之前,检查从现有块中取出的数据是否仍然相关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 文件,它会将碎片缩减为一个 100MB 的大数据集,而不是数百个单独的小块。

另一种解决方案是专门针对此类文件使用“nocow”功能。nocow 功能会导致文件被覆盖。请注意 nocow 5 6存在一些注意事项。


再次总结

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

  • 碎片整理操作会查看文件夹数据和单个文件内容,并尽可能以连续的方式重写数据。如果您使用快照5 ,则存在缺点。


笔记:

  1. 虽然块的大小通常为 1GB,但它们可以更大或更小。使用 raid 类型时,块通常以 1GB 的倍数分布在多个驱动器上。例如,使用 raid0 的 5 个驱动器通常会导致 5GB 的条带,其中每个驱动器写入 1GB 的块。

  2. Btrfs 使用“引用”来引用文件内容。当文件的一部分被覆盖时,实时文件系统会“引用”写入该数据的位置。但是,快照可能仍会“引用”旧位置。如果没有快照 - 或者旧快照被删除,则将不再有指向原始覆盖内容的“引用”。然后,此内容将被视为不相关,并且不会在平衡操作中与其他相关数据一起复制。

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

  4. 例外是“nocow”功能。

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

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

  7. 对于大多数 raid 类型的存储配置文件(raid1 是例外),跨驱动器“分布”是没有意义的,因为无论如何,条带通常都写入所有驱动器上。

答案2

也许看着该命令的源代码可能有帮助

更喜欢btrfs balance start

'btrfs filesystem balance' 命令已弃用,请改用'btrfs balance start' 命令。

然后在命令字符串上

"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."

我可能会再看一眼,但我没有在结构或 ioctl() 调用中看到任何对 defrag 的引用。因此没有明确的 defrag。

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

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

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

高血压

答案3

平衡在区块级别起作用;区块是 Btrfs 实现 raid 冗余的方式。它不会在 Btree 级别执行任何操作,也不会进行碎片整理。

答案4

碎片整理的作用被高估了。当然,在 FAT16 上,它确实能带来不同,但在大多数情况下,在任何现代文件系统上都不是。实际上,重新平衡将改善文件系统的组织,文件碎片将减少。

相关内容