Share via


Hyper-V 記憶體:快取圖層和對數據一致性的影響

本文提供虛擬記憶體堆疊中快取的概觀,並提供指引給軟體開發人員和系統管理員,以確保符合所需的數據一致性需求。

適用:Windows Server 2012 R2
原始 KB 編號: 2801713

其他相關資訊

至少,系統中各種快取層通常牽涉到下列專案:

  • 檔系統快取。 根據預設,Windows 會快取從磁碟讀取並寫入磁碟的檔案數據。 這表示讀取作業會從系統記憶體中稱為系統檔案快取的區域讀取檔案數據,而不是從實體磁碟讀取檔案數據。 相對地,寫入作業會將檔案數據寫入系統檔案快取,而不是磁碟,而這種快取稱為回寫快取。 應用程式可以使用檔案系統未緩衝的語意,以確保不會在系統快取中快取寫入。
  • 磁碟驅動器快取。 磁碟驅動器會在韌體層實作快取,以改善磁碟驅動器的效能。 雖然在韌體層快取可以改善效能,但在發生電源故障時,磁碟上的數據在寫入磁碟之前可能會遺失。 控制此快取行為的選項是標準化磁碟驅動器介面的一部分,例如 SCSI、SATA 和 ATA。 這些版本如下:
    1. 使用稱為「強制單位存取 (FUA) 的每個 I/O 控制機制。 此旗標指定磁碟驅動器應該先將數據寫入穩定媒體記憶體,再完成訊號處理。 必須這麼做的應用程式可確保磁碟問題 FUA 上的數據穩定,以確保在發生電源故障時不會遺失數據。

      SCSI 和光纖通道 (伺服器類別磁碟驅動器) 通常支援 FUA 旗標。 在 (ATA、SATA 和 USB) 的商用產品上,可能無法接受 FUA。 除非磁碟驅動器的寫入快取已停用,否則這可能會讓數據處於不一致的狀態。 如果您依賴此機制,請確定磁碟子系統會正確處理 FUA。

    2. 強制磁碟快取排清。 將清除向下傳送至磁碟的應用程式或系統會強制磁碟子系統將快取中的所有數據寫入磁碟。 因為磁碟快取中的所有資訊都必須在排清傳回之前寫入磁碟媒體,所以太頻繁發出排清會造成效能後果。

    3. 停用磁碟快取。 您可以對磁碟發出IOCTL_DISK_SET_CACHE_INFORMATION控件程式代碼,以停用磁碟的寫入快取。 寫入快取 (開啟或關閉) 的狀態將會在系統重新啟動時保留。 發出此控制程式代碼會對發行至該磁碟的所有 I/O 機制產生非常顯著的效能結果。 這些結果很可能包括效能明顯降低。 部署此控制項程式代碼之前,您應該仔細考慮使用它。

      注意事項

      如果您無法停用磁碟快取,您應該考慮選項 1 和 2。

因此,如果應用程式或工作負載是在虛擬機 (VM) 內執行,則各種快取層會影響數據一致性。

  • 客體文件系統快取。 您可以使用文件系統未緩衝的語意來略過此層,如先前所述。

  • 客體虛擬磁碟快取。 虛擬化的 IDE (模擬或綜合) 或 SCSI 裝置會報告較低堆疊所傳回的寫入快取狀態。 虛擬磁碟會報告其寫入快取已啟用,且拒絕讓客體關閉寫入快取。 停用快取將會失敗,而且一律會回應已啟用快取。 基於下列原因,這是必要的行為:

    • Hyper-V 無法假設在相同磁碟上執行的所有 VM 都必須有相同的磁碟快取設定。

    • 基礎記憶體可能有無法關閉的一律開啟寫入快取。 虛擬磁碟可能會移轉至相同主機上的不同磁碟, (即時記憶體移轉) 或即時移轉) 移轉至不同的主 (機,因此會強調這一點。

      因為應用程式將無法關閉磁碟快取,所以客體中任何必須確保電源故障數據完整性的應用程式,都必須使用選項 1 或選項 2,以確保寫入會略過磁碟快取。

  • 主機檔系統快取。 Hyper-V 記憶體堆疊也會使用未緩衝的寫入,以確保來自客體的寫入會略過基礎主機文件系統堆疊。

  • 主機磁碟快取。 FUA 如果由客體設定,則會傳播至主機和主機記憶體堆疊。 主機實體磁碟系統必須至少滿足下列其中一個準則,以確保透過電源錯誤的虛擬化工作負載數據完整性:

    • 系統會使用伺服器類別磁碟 (SCSI、光纖通道) 。
    • 系統會確定磁碟已連線到以電池為基礎的快取主機總線適配卡 (HBA) 。
    • 系統會使用記憶體控制器 (例如RAID系統) 作為儲存設備。
    • 系統會確保磁碟的電源受到不間斷的電源供應器保護, (UPS) 。
    • 系統會確定磁碟的寫入快取功能已停用。