当我运行btrfs filesystem balance ,这是否隐式碎片整理文件? 我可以想象,平衡只是单独重新分配每个文件的范围,保留现有的碎片。
有一个FAQ条目, “平衡”是做什么的? ,这一点目前还不清楚:
btrfs文件系统平衡是一种操作,它只是简单地将文件系统上的所有数据和元数据,并将其重新写入磁盘上的不同位置,并在path上通过分配器algorithm。 它最初是为多设备文件系统devise的,可以在整个设备上更均匀地分配数据(即“平衡”它们的使用)。 将新设备添加到几乎完整的文件系统时,这一点特别有用。
由于平衡的方式,它也有一些有用的副作用:
- 哪些文件系统为用户提供快照function来恢复数据?
- Windows是否有像ZFS或BtrFS一样的校验和文件系统?
- 如何删除btrfs快照?
- BTRFS上的“rm:can not remove xxx:No Space left on device”
- BTRFS:删除一个卷
- 如果有大量已分配但未使用的数据或元数据块,则余额可能会回收部分分配的空间。 这是在单一设备文件系统上运行平衡的主要原因。
- 在复制受损的文件系统上(例如,带有死磁盘的磁盘的RAID-1 FS),它将强制FS重build当前活动设备上丢失的数据副本,恢复当前活动设备的RAID-1function文件系统。
也许看看命令的源代码可能会有所帮助
更喜欢btrfs balance start
'btrfs文件系统平衡'命令已被弃用,请改用'btrfs balance start'命令。
然后在命令string上
"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()调用的引用。 所以没有明确的碎片整理。
它所做的只是从一个地方复制到另一个地方,并在过程中使用默认分配器。 从这里采取
根据目的分配和分配模式,algorithm直接在每个合适的分配组中search连续的可用空间范围(btrfs中的组对应于上述的块
因此,根据分配模式,设备上的可用空间等等,可以说btrfs将以这种方式进行分配,以便不必进行碎片整理。 你可能会考虑一种隐式碎片整理的forms。
HTH
Btrfs的磁盘碎片整理function专门用于修复文件夹元数据和文件内容中的碎片,而平衡function则用于在驱动器添加或删除时,在驱动器之间共享的数据量“ 平衡 ”(因此名称)。 虽然它们在做什么时确实存在一些理论上的重叠,但它们并不直接相关,因此文档没有把这两个概念联系起来。
下面详细回答。 当然,我的长期回答是希望能够帮助那些没有面对这些问题的人。
btrfs的一个重要概念是块分配。 将数据写入btrfs时,会将数据写入“当前”块,通常为1GB大小1 。 如果“当前”块已满,则分配一个新的块。 如果现有块被清空,当需要新块时,其存储空间可用于重新分配。
如果文件系统使用具有“dup”,“single”或“raid1” 存储configuration文件的多个驱动器,则块分配程序始终倾向于将下一个新块放在具有最大可用空间的驱动器上。 一般而言,这确保了驱动器被平等地使用。
余额function通过将现有的数据块重新写入“当前”块来工作。 当现有的块以这种方式清空时,它会自动提供给分配器。 如果正在清空的现有块未满(可能删除了块中的旧数据),则最终的结果是释放磁盘空间,因为较新的块与相关数据“更紧密地”打包在一起。
这是理论上可以用作去碎片策略的一部分 ,我认为这是很多人认为它已经做到的原因。 但是,当然,平衡function是build立在一个特定的目的,因此为什么不看文件内容。 它只在将数据复制到新块之前检查它从现有块中取出的数据是否相关2 。
当您将新驱动器添加到文件系统时,分配器首先倾向于将所有新数据写入新驱动器,主要是因为它具有比现有驱动器更多的可用空间。 通过重写所有块,所有最初平衡的块都只写入新的驱动器。 一旦它被平衡(成为平衡),其余的数据将在硬盘之间重新分配。
我有两个500GB的驱动器,每个使用240GB; 我添加另一个500GB的驱动器。 我通常会有:
- 驱动器:240GB使用
- 驱动器b:使用240GB
- 使用驱动器c:0GB
我开始平衡所有的数据。 大约四分之一的天平,我可能会看到类似于以下的情况:
- 驱动器:180GB使用
- 驱动器b:使用180GB
- 驱动器C:使用120GB
大约三分之一,似乎是平衡的:
- 驱动器:160GB使用
- 驱动器b:使用160GB
- 驱动器c:160GB使用
你当然可以停止平衡操作,虽然有理由(好的和坏的),为什么你可能想让它完成3 。
Btrfs是CoW( 写入时复制 )文件系统,这意味着数据不会被覆盖4 。 如果您有一个现有的100MB文件并覆盖该文件的1MB部分,则该1MB部分不会写入驱动器上的现有数据。 而是写在“当前”块中的其他地方。 Btrfs跟踪新数据的这些“碎片”的存储位置。 这对于维护数据快照非常有用,因为这意味着默认情况下保留旧数据。 因为固态硬盘以非常类似的方式也不会覆盖数据,所以这种固态硬盘机制很适合让固态硬盘维持其使用寿命和性能。
不pipe优点如何,有些文件经常被覆盖(通常是数据库文件),所以最终会有数百个这样的文件。 使用固态硬盘,在短期内几乎没有性能损失。 但是对于主轴驱动器来说,性能损失非常严重。
一个解决scheme当然是使用btrfs的碎片整理function。 碎片整理操作按当前状态的逻辑顺序将当前块中的文件内容重新写入,从而将碎片减less为一个100MB的大数据集,而不是单独的碎片。
另一种解决scheme是使用专门用于这种文件的“nocow”function。 nocowfunction导致文件被覆盖到位。 谨防有些警告nocow 5 6 。
余额查看块和条纹 – 实际上并不知道文件内容,除了这些块中的数据是否仍然相关。
碎片整理操作将查看文件夹数据和单个文件内容,并以尽可能连续的方式重新写入数据。 不利的一面是在碎片整理导致重复和额外的驱动器使用的快照。
尽pipe块大小通常为1GB,但它们可以更大或更小。 使用raidtypes时,块通常以1GB的倍数分布在多个驱动器中。 例如,具有raid0的5个驱动器通常会导致每个驱动器写入1GB大小的5GB条带。
Btrfs使用“引用”来文件内容。 当文件的一部分被覆盖时,活动文件系统“引用”数据被写入的位置。 然而,快照可能仍然“引用”旧的位置。 如果没有快照 – 或者旧的快照被删除,则这将导致没有引用原始被覆盖的内容的“引用”。 这个内容被认为是不相关的,不会在余额操作中与其他相关数据一起复制。
在这一点上,假设存储使用简单的“单个”configuration文件7 ,第一个160GB的平衡将全部移到新的驱动器上 – 但是在这一点上,仍然有大约320GB左右的平衡。 其余的将在各个驱动器之间平衡。 有了主轴,理想情况下,您只想平衡160个块,然后让btrfs重新平衡所有3个驱动器,以更好地“传播”数据。 使用固态硬盘时,试图保持数据的“传播”变得非常复杂,可能毫无意义,而且对于SSD的使用寿命来说,这种可能性非常大 。
例外是“nocow”function。
如果有快照,对“活动”文件进行碎片整理会导致快照和“活动”文件引用磁盘上不同的数据位置,从而导致数据被复制,从而占用额外的磁盘空间。 当通用重复数据删除function可用时,这不会成为一个问题。
使用nocow意味着btrfs不会维护文件内容的校验和。
对于大多数raidtypes(raid1是个例外),横跨驱动器的“传播”是没有意义的,因为条纹通常被写在所有的驱动器上。
平衡在大块水平上工作; 大块是如何Btrfs实施突袭冗余。 它在Btree级别上没有做任何事情,也不进行碎片整理。
如果使用访问延迟较高的介质,无论使用哪种文件系统,分段总是会计数的。 寻求保持寻求,pediod。
碎片整理被高估。 当然,在FAT16上,它确实有所不同,但在大多数情况下,并不是现代的。 有效地,重新平衡将会改善你的文件系统的组织,并且文件将更less碎片化。