btrfs是否还平衡碎片整理文件?


9

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

有一个常见问题解答条目,““平衡”是做什么的?” ,目前尚不清楚:

btrfs文件系统平衡是一项操作,该操作仅获取文件系统上的所有数据和元数据,然后将其重新写入磁盘上的其他位置,并通过分配器算法进行传递。它最初是为多设备文件系统设计的,目的是在设备之间更均匀地分布数据(即“平衡”它们的使用)。将新设备添加到几乎完整的文件系统时,这特别有用。

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

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

Answers:


10

TL; DR

Btrfs的碎片整理功能专用于修复文件夹元数据和文件内容中的碎片,而平衡功能的创建是为了“ 平衡 ”(因此得名)每当添加或删除驱动器时在驱动器之间共享的数据量。尽管它们在工作上确实存在理论上的重叠,但它们并不直接相关,因此文档并未链接这两个功能。

详细回答如下。当然,请注意,我的长答案是希望它能帮助那些没有全面了解所面临问题的人。


块分配

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

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


平衡如何发挥作用

平衡功能通过获取现有数据块并将其重新写入“当前”块来工作。当以这种方式清空现有块时,该块将自动提供给分配器。如果要清空的现有数据块不满(可能删除了该数据块中的旧数据),则最终结果是释放了磁盘空间,因为较新的数据块“被更紧密地打包”了相关数据。

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

平衡部分进入哪里?

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

典型的余额方案:

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

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

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

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

大约三分之一,它似乎是平衡的:

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

您当然可以在此时停止平衡操作,尽管出于某些原因(好的和坏的)您可能想让它完成3


btrfs中如何发生碎片

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

碎片整理进来的地方

无论有什么优势,有些文件都会被频繁覆盖(通常是数据库文件),因此最终会有数百个这样的片段。使用SSD,短期内几乎不会降低性能。但是对于主轴驱动器,性能下降是严重的。

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

一种替代解决方案是专门针对此类文件使用“ nocow”功能。nocow功能导致文件被覆盖到位。当心,要注意5 6


再次总结

  • 其余部分着眼于块和条纹-实际上并不知道文件内容,除了那些块中的数据是否仍然有用。

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


笔记:

  1. 尽管块的大小通常为1GB,但它们可以更大或更小。使用RAID类型时,通常跨多个驱动器以1GB的倍数对块进行条带化。例如,具有raid0的5个驱动器通常会导致5GB的条带,其中包含1GB的块写入每个驱动器。

  2. Btrfs使用“引用”来归档内容。当文件的一部分被覆盖时,活动文件系统会“引用”该数据的写入位置。但是,快照仍可能“引用”旧位置。如果没有快照-或删除了旧快照,则不会留下引用原始覆盖内容的“引用”。然后,该内容被认为是不相关的,并且不会在余额操作中与其他相关数据一起复制。

  3. 此时,假设存储使用的是简单的“单个”配置文件7,则最初的160GB平衡磁盘将全部移至新驱动器-但在这一点上,它仍有约320GB的平衡空间。其余的将在驱动器之间平均平衡。使用心轴,理想情况下,在btrfs重新平衡所有3个驱动器以更好地“分散”数据之前,您只希望平衡160个块。随着固态硬盘,试图保持数据的甚至是“传播”变得非常复杂,可能毫无意义,而且更可能非常不好的SSD使用寿命。

  4. “ nocow”功能是一个例外。

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

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

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


哇,好答案。我看到书籍或类似物中的BTRFS用户相关信息严重短缺(这与ZFS不同),这似乎导致其声誉持续下降。您是否拥有博客或更多类似这样的好东西?
Andrew Keech

1
谢谢!我真的应该在那里带一些最新的内容。:-| 时间已经非常匮乏:dogma.swiftspirit.co.za
zaTricky

6

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

更喜欢 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()调用。因此,没有明确的碎片整理。

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

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

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

高温超导


3

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


0

如果您使用具有高访问延迟的介质,则无论使用何种文件系统,帧计数总是很重要。寻宝保持寻宝,三脚架。


3
除非您要从SSD驱动器访问数据,否则根本没有任何意义。
马特

1
那没有回答问题。
Karl Richter

-2

碎片整理被高估了。当然,在FAT16上,它确实有很大的不同,但在大多数情况下,对任何现代的东西都没有。有效地,重新平衡将改善文件系统的组织,并且文件碎片更少。


6
对于ext2 / 3/4,xfs,jfs等而言,碎片并不是真正的问题,但对于btrfs来说可能是一个重大问题。请参阅btrfs.wiki.kernel.org/index.php/Gotchas,其中说:“具有大量随机写入的文件可能会严重碎片化(超过10000个范围),从而导致HDD上的文件被浪费,而具有SSD或大量RAM。” 即使对于常见用例(使用bittorrent,sqlite数据库等下载的文件),这也不是夸张的。
nemequ

2
即使使用更现代的文件系统,碎片整理也会有很大的不同,尤其是在驱动器开始装满传统硬盘驱动器后。一些文件系统比其他文件系统处理更好,而某些类型的文件则比其他文件系统差。松弛的空间,无法优化的方案,读/写缓存,预读,应用程序优化等等往往会掩盖很多此类问题。在大多数情况下,人们不必担心,只需要担心他们实际上是否有可能由碎片导致的严重问题。
jgmjgm
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.