BTRFS 文件系统,压缩和写入时复制

BTRFS 文件系统,压缩和写入时复制

我计划将我的 PC 和备份服务器上的 etx4 文件系统迁移到 BTRFS。我对 BTRFS 快照功能(我了解它使用写入时复制功能)和压缩功能非常感兴趣,但我有疑问/问题:

压缩和 cow 如何交互/协同工作?文件系统压缩是否会影响(惩罚)cow 的效率?这里有人使用过 BTRFS 的 cow 和压缩这两个功能,并能确认它们协同工作得很好吗?

更新:我在里面找到了这个解释\答案btrfs 维基

“压缩如何与直接 IO 或 COW 交互?压缩不适用于 DIO,适用于 COW,不适用于 NOCOW 文件。如果文件以 DIO 模式打开,它将回退到缓冲 IO。”看起来压缩和 cow 一起工作。

是否有人在生产中使用过 cow+compression --ie: 压缩文件夹的多个快照?

答案1

BTRFS 压缩旨在与整个 CopyOnWrite 设计高效配合。我同时使用两者,我可以确认它们没有给我带来任何问题。

它们如何协同工作:BTRFS 中的文件数据存储在区段中,区段是连续块的长段。块的大小都相同,通常为 4K,而区段的大小则因实际文件和可用空间而异。例如,如果您有一个 1M 大小的文件,它可能是一个 256 个块的区段,也可能是两个 113 个块和 143 个块的区段。或者是数十个大小各异的区段,以任意组合。如果您更改文件中间的一个字节,它将复制包含更改字节的区段。它可能会创建一个全新的区段,或者可能会将该区段分成三个:两个位于更改字节的两侧,指向原始未更改的块,一个包含新数据。

根据 btrfs wiki,压缩的方式是按块(4K 大小)逐块进行压缩,块组大小最高可达 128K。因此,文件不是以一个长的压缩流的形式存储的;而是以压缩块的部分形式存储的。当您更改文件中间的一个字节时,压缩块中的大部分文件都不会受到影响。压缩块以及可能围绕它的几个块(最高可达 128K)会被复制并重新压缩,并且范围列表会像任何其他 COW 写入一样进行更新。在当今的系统中,压缩 4K 或 128K 很简单,因此不会影响性能。

由于调整文件的范围图是 COW 功能的正常组成部分,因此某些 4K 块是压缩的还是未压缩的并没有显著差异。(事实上,在 BTRFS 中,文件可以包含未压缩块、ZLIB 压缩块和 LZO 压缩块的任意组合,具体取决于更新文件部分时文件系统中哪个压缩选项处于活动状态。)

我没有做过任何详尽的研究或测量;它就像我预期的那样“起作用了”。

相关内容