在其他問題中已經提到,紅帽建議不要在 SSD 上使用 mdadm RAID 1。
紅帽還警告稱,不建議在 SSD 上使用軟體 RAID 等級 1、4、5 和 6。在這些 RAID 層級的初始化階段,某些 RAID 管理公用程式(例如 mdadm)會寫入儲存裝置上的所有區塊,以確保校驗和正確運作。這會導致SSD的效能快速下降。
我明白背後的原因。不過,我懷疑這是在他到來之前寫的。修剪,這是專門為 mdadm RAID 1 設計的。如果我對 TRIM 的理解是正確的,那麼我相信它是正確的,但我不確定,因此我問。
TRIM 可能不適合我。我需要這個用於生產系統,而 mdtrim 看起來充其量只是實驗性的。更重要的是,我需要強大的加密和研究已經表明,TRIM 透過突出顯示實際正在使用的驅動器部分來揭示有點太多。有什麼方法可以避免效能問題並且仍然具有強加密性嗎?我想知道是否可以進行部分 TRIM,釋放一些塊以提高性能,但又不能釋放太多塊。
我看到的一個建議是只使用每個磁碟的 80% 左右,這樣在 mdadm 進行初始檢查後,仍然有少數區塊未使用。但是這些區塊不是在後續使用磁碟時最先使用的嗎?它們仍然會很快用完,然後我的情況不會更好,對嗎?
答案1
當然,您可以使用 mdtrim(請參閱選項)進行部分修剪,--reserve
以始終保留一些未修剪的可用空間。或者您可以簡單地在加密的 FS 上使用 dd(1) 建立一些大檔案來佔用一些空間,然後這些空間將永遠不會被修剪(也不會被您使用)。我猜想,修剪除約 30% 之外的所有未使用空間將為您帶來大量效能優勢,同時不會對安全性造成太大影響。
您可以(按照您的建議)進行過度配置,而不是修剪(在新的或 ATA 安全擦除的 SSD 上)建立僅 80% 空間的分割區,然後使用它。它不會「很快用完,然後你的情況也不會好轉」。原因如下:
假設(為簡單起見)您的磁碟有 10000 個磁區 (LBA)。當您進行分區時,僅使用其中的一半(同樣是為了簡單起見),您將只使用 LBA 0-4999,而 LBA 5000-9999 將永遠不會被觸及。現在,磁碟機中的等級磨損韌體有兩種方法可以了解哪些磁區未使用 - 那些由 TRIM 指定的作業系統,以及那些正在重寫的磁區。因此,如果您第一次寫入 LBA 100,它將被使用(例如在實體區塊 123 上)。當您第二次寫入LBA 100時,SSD會將其寫入新位置(例如實體區塊124),然後將LBA 100的舊版本(即實體區塊123)標記為未使用(TRIMed),因此稍後當SSD 空閒時,它可以進行垃圾收集,並且(如果該擦除區塊中的所有其他物理區塊也未使用),擦除整個擦除區塊(比物理寫入區塊大得多- 例如512KB 與4KB)
因此,透過將 LBA 的使用範圍減少一半,您就增加了磁碟機可以使用的過度配置的實體磁區的數量。它們不會“用完”,但您需要擁有足夠的它們,以便它們上的碎片(同一擦除區塊中的部分使用和部分未使用的物理區塊)將在您用完可用空間之前消失(否則, SSD 韌體在擦除整個擦除區塊之前需要將已使用的區塊複製到其他位置,從而導致寫入放大,效能低下,並縮短SSD的壽命)
TRIM 指令仍然很有用,因為它可以在需要再次寫入之前標記未使用的磁區,從而加快處理速度(並且不會損失太多空間)(從而避免額外寫入並延長 SSD 的使用壽命)。
答案2
為了補充過時的答案,我最近用 SSD 取代了 RAID1 上故障的 HDD,根據我進行的實驗和研究,我發現了以下內容:
- 自~2.6.39 起,Linux md 將 TRIM 命令傳遞到組成驅動器,但前提是所有驅動器都支援 TRIM 命令。
- 對於我的 HDD+SSD RAID1,我必須失敗並移除 HDD,執行 TRIM,然後執行
--re-add
HDD。
- 對於我的 HDD+SSD RAID1,我必須失敗並移除 HDD,執行 TRIM,然後執行
- TRIM 可以使用在熱塊設備上完成
fstrim
,然後 Linux md 會將其轉送到 SSD。 - 初始 RAID1 復原將寫入整個 SSD。
- mdtrim 腳本仍處於實驗階段,多年來未更新。
- 透過對過度寫入的區塊使用 TRIM,可以釋放 SSD 韌體眼中的空間,從而提高效能、減少寫入放大等。