我已经阅读有关 BTRFS 和 ZFS 的文章有一段时间了,虽然我确实很欣赏 CoW 在托管重要文件时的好处,但我目前对以下困境感到困惑:
鉴于 ZFS 和 BTRFS 在托管受随机写入影响的大型文件(例如 QCOW2、VDI 等)时似乎都会遭受性能下降,为什么有人会选择 BTRFS 作为托管虚拟机的首选 FS?
我知道在 BTRFS 的情况下,您可以使用 chattr 或 nodatacow 挂载选项有选择地关闭 CoW,从而减少碎片和 CoW 造成的性能下降……
然而,根据红帽这也是“禁用数据和元数据的校验和验证,导致数据完整性降低。”(除了丢失的压缩和自然所需的 CoW)。
基于此我想问:为什么有人会选择 BTRFS,而不是 XFS,而不是 LVM,而不是 MD RAID?
答案1
如果主要用例是存储 VM 映像或数据库,并且您不愿意接受潜在的性能问题以获得 btrfs 的数据完整性优势,那么我想不出任何理由让您选择 btrfs 而不是 xfs 或 ext4。
当存储 VM 映像只是文件系统的众多用途之一时,仅对 VM 映像目录禁用写时复制(使用 chattr +C)最为重要。然后,只需为该单个目录禁用写时复制即可非常方便,同时仍保留 btrfs 对文件系统其余部分的所有优势。
答案2
BTRFS 具有不同的磁盘格式,在某些写入模式上其性能优于其他文件系统。特别是,我们投入了大量精力来改进元数据写入磁盘的方式,并且它支持一些高级功能,例如数据校验和、压缩和快照。对于大型文件,改进元数据性能通常并不重要。
与 ZFS 相比,BTRFS 是一种更简单的解决方案,在 Linux 上得到更好的支持。主要缺点是它的扩展性较差(添加大量磁盘时)并且没有相同的功能集。
与 XFS 相比,它将是一种性能较低的解决方案。即,它将花费更多的处理器时间来将数据块写入磁盘,并且最大吞吐量将受到限制。这可以通过禁用校验和验证等操作在一定程度上得到缓解,但这样你就失去了 BTRFS 相对于 XFS 的主要优势,即改进的元数据信息。即校验和和不同的日志记录(在某些情况下可能会更好)。
在写时复制 (COW) 支持方面,XFS 更注重性能,而不是严格的 COW。也就是说,XFS 在可扩展性方面具有非常好的元数据和日志功能,并且通常不会在写入时覆盖文件数据,除非应用程序明确请求覆盖该数据,否则它将允许覆盖现有磁盘块。对于虚拟机来说,这可能是件好事,因为您的磁盘分配最初可以是连续的,在这种情况下,在虚拟机的整个生命周期内都将保持连续。
答案3
使用 BTRFS,即使使用nodatacow
和类似的,你仍然可以创建手动快照数据具有CoW
行为,因此它速度快并且不消耗太多内存。此外,这些快照比使用 LVM 更灵活,因为您不需要在文件系统下方保留空间,文件系统不知道这些空间,如果根本不需要,也无法使用。与 ZFS 一样,快照可以通过网络发送和接收,这可能有助于您改进备份策略。因此,即使使用nodatacow
BTRFS 似乎也比使用 LVM 更好。
答案4
在使用云计算平台之后,我开始接受他们的观点,即虚拟机是数据和功能的容器,而实际的虚拟机并不那么重要。
我宁愿拥有良好的备份-恢复和安装-部署流程,而较少担心虚拟机的完整性,而更多地担心性能。
即选择 JFS/XFS/EXT4 而不是 LVM 而不是 MD-raid 而不是 BTRFS。确保我不会长时间在虚拟机上存储任何未备份的内容...并准备好脚本和程序,以便在发生意外时在合理的时间内备份虚拟机的新安装。
但这更像是一个开发/实验场景。