正確處理寫入記憶體的 SATA 磁碟?
在用於數據庫的單個磁碟上禁用寫入記憶體的建議很常見,因為否則某些磁碟將確認尚未到達磁碟表面的寫入。
這意味著某些磁碟在寫入磁碟表面之前不會確認寫入(更新:或者當被要求刷新記憶體時它們會準確報告。我在哪裡可以找到這樣的磁碟,或者我在哪裡可以找到權威資訊在哪裡可以找到這樣的磁碟?
我正在設置一些可以從使用寫入記憶體中真正受益的數據庫伺服器,但是該應用程序對價格很敏感,我不希望為某些記憶體 RAID 控制器增加磁碟子系統的成本,因為我沒有足夠的資訊來知道我是否可以信任每個驅動器中的記憶體。
一般來說,直接回答您的問題,我不知道任何主要品牌的 SATA 驅動器本身在啟用寫入記憶體的情況下存在與正確操作相關的錯誤。也就是說,僅從驅動器的角度來看,驅動器從記憶體的角度來看它應該做的事情。我還要注意,即使啟用了寫入記憶體,從 SATA 電纜上的磁碟寫入到物理更新的旋轉介質的延遲仍然非常短(通常約為 50 到 100 毫秒)。這並不像臟記憶體數據一次只會坐在那裡幾秒鐘……驅動器不斷嘗試從記憶體中獲取臟數據盡快放到物理媒體上。這不僅僅是一個數據安全問題,而是一個準備好立即接受未來寫入的問題(即:寫入發布)。
啟用記憶體時出現的問題是通過 SATA 電纜對驅動器的寫入順序與對旋轉介質的寫入順序不同。這永遠不會導致問題,除非您在記憶體的所有內容進入磁碟之前斷電或系統崩潰。為什麼?->
這裡可能出現的問題與文件系統和/或數據庫文件內容的事務穩健性與這些無序失去的寫入有關。實際上,那些可能失去的亂序寫入理論上可能會破壞事務邏輯的完整性,否則這些事務邏輯本來可以通過以非常特定的順序發生的磁碟寫入來保證。
現在,當然,文件系統、數據庫、RAID 控制器等的設計者已經意識到(或者當然應該意識到)這種與寫入記憶體相關的現象。在大多數隨機訪問類型的 I/O 場景中,從性能的角度來看,寫記憶體是非常可取的。事實上,擁有可用的寫入記憶體是能夠對更高級的本機命令隊列 ( NCQ ) 產生任何真正好處的關鍵要素) 支持較新的 SATA 和最後幾代 PATA 實現。因此,為了在這樣的特定關鍵時刻保證物理介質的順序,文件系統和/或應用程序等可以專門請求將寫入記憶體刷新到介質。在此同步請求完成時 - (可能)文件緩衝區、作業系統磁碟記憶體、物理磁碟記憶體等的所有待處理內容實際上都已在正確的關鍵操作中根據事務系統設計出現在媒體上。也就是說,如果程序員在頂部進行了正確的呼叫,並且這個軟體和硬體層鏈的每個元素都正確地完成了他們的工作,那麼這種情況就會正確發生。即:在驅動器、RAID 控制器、磁碟驅動程序、作業系統記憶體、文件系統、數據庫引擎等方面沒有這方面的錯誤。這是很多軟體都必須完全正確地工作。此外,在這方面驗證正確性非常困難,因為在幾乎任何情況下,通常寫入順序根本不重要……而且電源故障和崩潰場景是難以建構的測試。因此,最終在一個或多個不同層和/或該術語的含義中“關閉寫入記憶體”……具有“修復”某些類型問題的聲譽。實際上,關閉 RAID 控制器或 OS 磁碟記憶體或驅動器等的寫入記憶體行為是避免系統中的一個或多個錯誤……以及這種傳說的來源。電源故障和碰撞場景是難以建構的測試。因此,最終在一個或多個不同層和/或該術語的含義中“關閉寫入記憶體”……具有“修復”某些類型問題的聲譽。實際上,關閉 RAID 控制器或 OS 磁碟記憶體或驅動器等的寫入記憶體行為是避免系統中的一個或多個錯誤……以及這種傳說的來源。電源故障和碰撞場景是難以建構的測試。因此,最終在一個或多個不同層和/或該術語的含義中“關閉寫入記憶體”……具有“修復”某些類型問題的聲譽。實際上,關閉 RAID 控制器或 OS 磁碟記憶體或驅動器等的寫入記憶體行為是避免系統中的一個或多個錯誤……以及這種傳說的來源。
無論如何,回到問題的核心:在 SATA 下,所有磁碟讀/寫命令和刷新記憶體命令的具體處理由SATA 規範定義。此外,驅動器製造商應該為每個驅動器型號或驅動器系列提供詳細的文件,描述它們的實施和對這些規則的遵守情況,例如希捷梭子魚驅動器的範例。特別是,請參閱 SATA SET FEATURES的詳細資訊控制驅動器操作模式的命令,特別是選項 82h 可用於在驅動器級別禁用磁碟記憶體,因為預設值肯定是在我知道的所有驅動器上啟用寫入記憶體。如果您真的想禁用記憶體,則必須在每次驅動器重置或啟動時執行此命令,並且通常受作業系統磁碟驅動程序的控制。您可能可以鼓勵您的作業系統驅動程序通過 IOCTL 和/或系統資料庫設置類型的東西設置此模式,但這變化很大。