为什么我要在创建 QEMU 映像时禁用写入时复制?

为什么我要在创建 QEMU 映像时禁用写入时复制?

拱门维基建议在使用 btfs 时在目录上禁用映像的写入时复制。我确实认为如果您有大量文件读/写,这将是一个好主意。 问题探讨了这个想法。我知道 VMWare 会生成不同的文件并写入快照,这在使用写入时复制时可能会出现问题。

对于 QEMU,文件因虚拟机的存在而保持打开状态,因此在虚拟机关闭后写入时存在潜在问题,但我认为虚拟机关闭后 I/O 缓慢不是问题。通过为 QEMU 执行此步骤我可以避免哪些陷阱。

另外:我假设这个问题的图像是原始的。是否存在可能的稳定性问题,因为 qcow2 已经具有复制写入功能。

答案1

BTRFS 上的虚拟机映像的性能下降不仅仅是由于大量文件写入造成的;就 BTRFS 而言,写入是针对同一个文件的。这个问题源于很多随机的写入同一个文件。这些是在整个文件中发生的写入。

简而言之,随机写入会干扰 BTRFS 的 COW,导致文件碎片,进而导致读取性能下降。如果您手头有图像文件,则可以使用filefrag.

请注意,这不仅仅是 VM 映像的问题。它会影响以随机文件偏移量写入的任何文件,例如 Firefox 使用的 SQLite 数据库。

解决方案/解决方法

对于 BTRFS 上的文件碎片,您可以采取一些措施。选择以下选项之一:

  1. 使用 挂载文件系统nodatacow,这会在整个文件系统中禁用 COW。尽管确实如此,但除非绝对必要(例如创建快照),否则它会避免使用 COW。
  2. 用于chattr在包含相关文件的目录上禁用 COW,然后重新创建文件,因为这chattr不适用于现有文件。
  3. 定期运行btrfs fi defrag有问题的文件。
  4. 挂载文件系统以autodefrag自动对文件系统进行碎片整理。

前两个选项禁用COW,而后两个允许 COW,但事后清理。 BTRFS COW 和 QEMU COW 不应干扰,只是速度会特别慢:)

我的个人经历

根据我使用 SQLite 数据库文件的经验...

  1. nodatacow- 没试过。
  2. chattr- 无论如何,我最终得到的都是碎片文件。
  3. btrfs fi defrag- 我这样做了一段时间来测试这个概念。
  4. autodefrag- 我已经非常成功地使用了这个。

对于 QEMU 映像,我使用 LVM 卷而不是映像文件。所以我根本不处理 COW 问题。

资源

推荐阅读以更好地了解 COW 如何在 BTRFS 上工作。

相关内容