Linux swap 的靜默磁碟錯誤和可靠性
我的理解是,硬碟驅動器和 SSD 在驅動器內實現了一些基本的糾錯,大多數 RAID 配置(例如 mdadm)將依賴於此來決定驅動器何時無法糾正錯誤並需要離線。但是,這取決於儲存在其錯誤診斷中是否 100% 準確。事實並非如此,像雙驅動器 RAID-1 鏡像這樣的常見配置將很容易受到攻擊:假設一個驅動器上的某些位被靜默損壞並且驅動器沒有報告讀取錯誤。因此,像 btrfs 和 ZFS 這樣的文件系統實現了它們自己的校驗和,以便不信任有問題的驅動器韌體、有故障的 SATA 電纜等等。
同樣,RAM 也可能存在可靠性問題,因此我們有 ECC RAM 來解決這個問題。
我的問題是:在雙磁碟配置(即使用主線核心驅動程序)上,保護 Linux 交換文件免受靜默損壞/比特腐爛未被驅動器韌體擷取的規範方法是什麼?在我看來,這裡缺乏端到端保護的配置(例如 btrfs 提供的配置)在某種程度上否定了 ECC RAM 帶來的安心。然而我想不出一個好辦法:
btrfs 根本不支持交換文件。您可以從 btrfs 文件設置循環設備並在其上進行交換。但這有問題:
- 隨機寫入表現不佳:https ://btrfs.wiki.kernel.org/index.php/Gotchas#Fragmentation
- 那裡禁用寫時複製的建議也將禁用校驗和 - 從而破壞了本練習的全部要點。他們的假設是數據文件有自己的內部保護。
Linux 上的 ZFS 允許使用 ZVOL 作為交換,我想這可以工作:http: //zfsonlinux.org/faq.html#CanIUseaZVOLforSwap - 但是,根據我的閱讀,ZFS 通常需要記憶體,並讓它在交換中工作-only 應用程序聽起來像是一些工作。我想這不是我的第一選擇。為什麼你必須使用一些樹外核心模組來實現可靠的交換,這超出了我的理解——在當今時代,大多數現代 Linux 發行版/核心肯定有辦法做到這一點?
實際上,Linux 核心郵件列表上有一個帶有更新檔的執行緒,可以在記憶體管理器本身中啟用校驗和,這正是我在這個問題中討論的原因:http: //thread.gmane.org/gmane.linux.kernel/989246 -不幸的是,據我所知,由於我不知道的原因,更新檔已經死了,並且從未進入上游。太糟糕了,這聽起來像是一個不錯的功能。另一方面,如果您在 RAID-1 上放置交換 - 如果損壞超出了校驗和修復的能力,您希望記憶體管理器在出現恐慌或其他任何情況之前嘗試從另一個驅動器讀取,這是可能超出了記憶體管理器應該做的範圍。
總之:
- RAM 有 ECC 來糾正錯誤
- 永久儲存上的文件具有 btrfs 來糾正錯誤
- 交換有???<—這是我的問題
我們相信從交換中檢索到的數據的完整性,因為儲存硬體具有校驗和、CRC 等。
在上述評論之一中,您說:
是的,但它不能防止磁碟本身之外的位翻轉
“它”在這裡表示磁碟的校驗和。
沒錯,但SATA 使用 32 位 CRC來儲存命令和數據。因此,您有 40 億分之一的機會在磁碟和 SATA 控制器之間無法檢測到損壞數據。這意味著一個連續的錯誤源可能會像每傳輸 125 MiB 一樣頻繁地引入一個錯誤,但是像宇宙射線這樣的罕見的隨機錯誤源會以微乎其微的速度導致無法檢測到的錯誤。
還要意識到,如果您有一個源以接近每 125 MiB 傳輸一個的速率導致未檢測到的錯誤,性能將會很糟糕,因為檢測到的錯誤數量很多需要重新傳輸。監控和記錄可能會及時提醒您問題,以避免未檢測到的損壞。
至於儲存介質的校驗和,每個 SATA(以及之前的 PATA)磁碟都使用某種類型的每扇區校驗和。“企業”硬碟的特徵之一是更大的扇區受到額外的數據完整性功能的保護,大大降低了未檢測到錯誤的機會。
如果沒有這些措施,每個硬碟驅動器中的備用扇區池將毫無意義:驅動器本身無法檢測到壞扇區,因此它永遠無法交換新扇區。
在另一條評論中,您問:
如果 SATA 如此值得信賴,為什麼會有 ZFS、btrfs、ReFS 等校驗和文件系統?
一般來說,我們不會要求交換來長期儲存數據。交換儲存的限制是系統的正常執行時間,交換中的大多數數據不會持續那麼長時間,因為通過系統虛擬記憶體系統的大多數數據屬於壽命較短的程序。
最重要的是,隨著核心和
libc
更新、虛擬化、雲架構等頻率的增加,正常執行時間通常越來越短。此外,swap 中的大多數數據在管理良好的系統中本質上是不被使用的,因為它本身不會耗盡主 RAM。在這樣的系統中,唯一以交換結束的東西是程序不經常使用的頁面,如果有的話。這比你想像的更常見。您的程序連結到的大多數動態庫中都有您的程序不使用的常式,但它們必須由動態連結器載入到 RAM 中。當作業系統發現您沒有使用庫中的所有程序文本時,它會將其換出,為您的程序正在使用的程式碼和數據騰出空間。如果這種換出的記憶體頁面被破壞了,誰會知道呢?
與 ZFS 之類的相比,我們希望數據能夠持久和持久地儲存,這樣它不僅能持續超過系統目前的正常執行時間,而且還能超過組成儲存系統的各個儲存設備的生命週期。ZFS 等解決的問題的時間尺度大約比交換解決的問題長兩個數量級。因此,與 Linux 交換相比,我們對 ZFS 的損壞檢測要求要高得多。
ZFS 等與交換在這裡的另一個關鍵方式不同:我們不會將文件系統 RAID 交換在一起。當在一台機器上使用多個交換設備時,它是一個JBOD方案,不像 RAID-0 或更高版本。(例如 macOS 的鍊式交換文件方案、Linux
swapon
等)由於交換設備是獨立的,而不是像 RAID 那樣相互依賴,我們不需要大量校驗和,因為更換交換設備不涉及查看其他相互依賴的交換設備應該在替換設備上的數據。在 ZFS 術語中,我們不會從其他儲存設備上的冗餘副本中重新同步交換設備。所有這些確實意味著您必須使用可靠的交換設備。我曾經使用一個 20 美元的外部 USB 硬碟盒來拯救一個出現問題的 ZFS 池,卻發現該盒本身不可靠,在過程中引入了它自己的錯誤。ZFS 強大的校驗和在這裡救了我。您無法通過交換文件對儲存介質進行如此隨意的處理。如果交換設備快死了,因此接近最壞的情況,即每傳輸 125 MiB 就會注入一個無法檢測到的錯誤,那麼您只需盡快更換它。
這個問題的整體偏執感轉移到拜占庭將軍問題的一個例子。閱讀它,思考 1982 年在向電腦科學界描述該問題的學術論文上的日期,然後決定您是否在 2019 年對這個問題有新的想法。如果沒有,那麼也許你只會使用由三個十年的 CS 畢業生設計的技術,他們都知道拜占庭將軍問題。
這是一個很好的基礎。您可能無法提出尚未在電腦科學期刊上討論過的想法、反對意見或解決方案。
SATA 肯定不是完全可靠的,但除非您打算加入學術界或核心開發團隊之一,否則您將無法在此處為最先進的技術添加實質性內容。正如您已經註意到的,這些問題已經在手邊:ZFS、btrfs、ReFS…作為作業系統使用者,您只需要相信作業系統的創建者會為您解決這些問題,因為他們也知道關於拜占庭將軍。
目前將交換文件放在 ZFS 或 Btrfs 之上是不切實際的,但如果上述內容不能讓你放心,你至少可以將它放在 xfs 或 ext4 之上。這比使用專用交換分區要好。