Qemu
為什麼我要在創建 QEMU 映像時禁用 Copy-On-Write?
arch wiki建議在使用 btfs 時在目錄上禁用 Copy-On-Write。我確實看到,如果您有很多文件讀/寫,那將是一個好主意。 這個問題探討了這個想法。我知道 VMWare 會成長為不同的文件,並且會寫出快照,這在使用 Copy-On-Write 時可能會出現問題。
對於 QEMU,該文件對 VM 的存在保持打開狀態,因此在 VM 關閉後寫入存在潛在問題,但我會看到 VM 關閉後慢速 I/O 不是問題。通過對 QEMU 執行此步驟,我將避免哪些陷阱。
另外:我假設這個問題的圖像是原始的。由於 qcow2 已經具有寫入時複製功能,是否存在可能的穩定性問題。
BTRFS 上 VM 映像的性能下降不僅僅是由於大量文件寫入;就 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 上的工作原理。