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。
再次总结
笔记:
尽管块的大小通常为1GB,但它们可以更大或更小。使用RAID类型时,通常跨多个驱动器以1GB的倍数对块进行条带化。例如,具有raid0的5个驱动器通常会导致5GB的条带,其中包含1GB的块写入每个驱动器。
Btrfs使用“引用”来归档内容。当文件的一部分被覆盖时,活动文件系统会“引用”该数据的写入位置。但是,快照仍可能“引用”旧位置。如果没有快照-或删除了旧快照,则不会留下引用原始覆盖内容的“引用”。然后,该内容被认为是不相关的,并且不会在余额操作中与其他相关数据一起复制。
此时,假设存储使用的是简单的“单个”配置文件7,则最初的160GB平衡磁盘将全部移至新驱动器-但在这一点上,它仍有约320GB的平衡空间。其余的将在驱动器之间平均平衡。使用心轴,理想情况下,在btrfs重新平衡所有3个驱动器以更好地“分散”数据之前,您只希望平衡160个块。随着固态硬盘,试图保持数据的甚至是“传播”变得非常复杂,可能毫无意义,而且更可能非常不好的SSD使用寿命。
“ nocow”功能是一个例外。
如果存在快照,则对“活动”文件进行碎片整理会导致快照和“活动”文件引用磁盘上的不同数据位置,从而导致数据被复制,从而占用额外的磁盘空间。当通用重复数据删除功能可用时,这将不再是问题。
使用nocow意味着btrfs不会维护文件内容的校验和。
对于大多数RAID类型(raid1是例外),跨驱动器的“传播”是没有意义的,因为通常无论如何跨所有驱动器写入条带。