Qemu

為什麼我要在創建 QEMU 映像時禁用 Copy-On-Write?

  • September 28, 2017

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 上的文件碎片,您可以做一些事情。選擇以下選項之一:

  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 上的工作原理。

引用自:https://unix.stackexchange.com/questions/394973