![为什么我要在创建 QEMU 映像时禁用写入时复制?](https://linux22.com/image/118684/%E4%B8%BA%E4%BB%80%E4%B9%88%E6%88%91%E8%A6%81%E5%9C%A8%E5%88%9B%E5%BB%BA%20QEMU%20%E6%98%A0%E5%83%8F%E6%97%B6%E7%A6%81%E7%94%A8%E5%86%99%E5%85%A5%E6%97%B6%E5%A4%8D%E5%88%B6%EF%BC%9F.png)
答案1
BTRFS 上的虚拟机映像的性能下降不仅仅是由于大量文件写入造成的;就 BTRFS 而言,写入是针对同一个文件的。这个问题源于很多随机的写入同一个文件。这些是在整个文件中发生的写入。
简而言之,随机写入会干扰 BTRFS 的 COW,导致文件碎片,进而导致读取性能下降。如果您手头有图像文件,则可以使用filefrag
.
请注意,这不仅仅是 VM 映像的问题。它会影响以随机文件偏移量写入的任何文件,例如 Firefox 使用的 SQLite 数据库。
解决方案/解决方法
对于 BTRFS 上的文件碎片,您可以采取一些措施。选择以下选项之一:
- 使用 挂载文件系统
nodatacow
,这会在整个文件系统中禁用 COW。尽管确实如此,但除非绝对必要(例如创建快照),否则它会避免使用 COW。 - 用于
chattr
在包含相关文件的目录上禁用 COW,然后重新创建文件,因为这chattr
不适用于现有文件。 - 定期运行
btrfs fi defrag
有问题的文件。 - 挂载文件系统以
autodefrag
自动对文件系统进行碎片整理。
前两个选项禁用COW,而后两个允许 COW,但事后清理。 BTRFS COW 和 QEMU COW 不应干扰,只是速度会特别慢:)
我的个人经历
根据我使用 SQLite 数据库文件的经验...
nodatacow
- 没试过。chattr
- 无论如何,我最终得到的都是碎片文件。btrfs fi defrag
- 我这样做了一段时间来测试这个概念。autodefrag
- 我已经非常成功地使用了这个。
对于 QEMU 映像,我使用 LVM 卷而不是映像文件。所以我根本不处理 COW 问题。
资源
推荐阅读以更好地了解 COW 如何在 BTRFS 上工作。