基本
1. 快閃記憶體單元類型
固態硬碟 (SSD) 是一種基於快閃記憶體的數據存儲設備。位存儲在單元中,分為三種類型:每單元 1 位(單級單元,SLC)、每單元 2 位(多級單元,MLC)、每單元 3 位(三級單元,TLC)。
2. 壽命有限
每個單元都有最大次數的 P/E 循環(編程/擦除),在此之後該單元被視為有缺陷。這意味著 NAND 快閃記憶體會磨損並且使用壽命有限。
3. 基準測試很難
測試人員是人,因此並非所有基準測試都不會出錯。閱讀製造商或第三方的基準時要小心,並在相信任何數字之前使用多個來源。在可能的情況下,使用您系統的特定工作負載以及您想要使用的特定 SSD 型號運行您自己的內部基準測試。最後,確保您查看對手頭系統最重要的性能指標。
頁和塊
4. NAND 快閃記憶體頁面和塊
單元格被分組到一個網格中,稱為塊,塊被分組到平面中。可以讀取或寫入塊的最小單位是頁。頁不能單獨擦除,只能擦除整個塊。NAND 快閃記憶體頁面大小可能會有所不同,大多數驅動器的頁面大小為 2 KB、4 KB、8 KB 或 16 KB。大多數 SSD 具有 128 或 256 頁的塊,這意味著塊的大小範圍在 256 KB到 4 MB 範圍內變化。例如,三星 SSD 840 EVO 的塊大小為 2048 KB,每個塊包含 256 個頁面,每個頁面為 8 KB。
5. 讀取在頁面大小上對齊
一次閱讀不到一頁是不可能的。一個人當然只能從操作系統請求一個位元組,但是將在 SSD 中檢索一整頁,迫使讀取比需要更多的數據。
6. 寫入在頁面大小上對齊
寫入 SSD 時,寫入是按頁面大小的增量進行的。所以即使一次寫操作隻影響一個位元組,無論如何都會寫一整頁。寫入比所需更多的數據稱為寫入放大。寫入頁面也稱為「編程」頁面。
7.頁面不能被覆蓋
NAND 快閃記憶體頁面只有在處於「空閑」狀態時才能被寫入。當數據改變時,頁面的內容被複制到內部寄存器中,數據被更新,新版本存儲在「空閑」頁面中,這個操作稱為「讀-修改-寫」。數據不會就地更新,因為「空閑」頁面與最初包含數據的頁面不同。一旦數據被持久化到驅動器,原始頁面被標記為「過時」,並將保持原樣直到被擦除。
8.擦除在塊大小上對齊
頁面不能被覆蓋,一旦它們變得陳舊,讓它們再次自由可用的唯一方法就是擦除它們。但是,無法擦除單個頁面,只能一次擦除整個塊。
SSD 控制器和內部結構
9. Flash 翻譯層
快閃記憶體轉換層 (FTL) 是 SSD 控制器的一個組件,它將邏輯塊地址 (LBA) 從主機映射到驅動器上的物理塊地址 (PBA)。最近的驅動器實現了一種稱為「混合日誌塊映射」的方法或其派生方法,其工作方式類似於日誌結構文件系統。這允許像順序寫入一樣處理隨機寫入。
10. 內部並行性
在內部,多個並行級別允許一次將多個塊寫入不同的 NAND 快閃記憶體晶元,即所謂的「集群塊」。
11. 磨損均衡
由於 NAND 快閃記憶體單元不可避免磨損,因此 FTL 的主要目標之一是在單元之間儘可能均勻地分配工作,以便塊將達到其 P/E 周期限制並同時磨損。
12.垃圾收集
SSD 控制器中的垃圾收集過程確保「陳舊」頁面被擦除並恢復到「空閑」狀態,以便可以處理傳入的寫入命令。
13.後台操作會影響前台操作
垃圾收集等後台操作會對來自主機的前台操作產生負面影響,尤其是在小隨機寫入的持續工作負載的情況下。
訪問模式
14.永遠不要寫不到一頁
避免寫入小於 NAND 快閃記憶體頁面大小的數據塊,以最大限度地減少寫入放大並防止讀取-修改-寫入操作。當前頁面的最大大小為 16 KB,因此默認情況下應使用該值。此大小取決於 SSD 型號,將來隨著 SSD 的改進,您可能需要增加它。
15. 對齊寫入
在頁面大小上對齊寫入,並寫入頁面大小的倍數的數據塊。、
16.緩衝小數據量寫
為了最大限度地提高吞吐量,儘可能將小數據量寫入 RAM 中的緩衝區,當緩衝區已滿時,執行單次大數據量寫以批處理所有小寫。
17.為了提高讀取性能,將相關數據一起寫入
讀取性能是寫入模式的結果。當一次寫入大量數據時,它會分布在單獨的 NAND 快閃記憶體晶元上。因此,您應該在同一頁、塊或集群塊中寫入相關數據,以便稍後通過利用內部並行性通過單個 I/O 請求更快地讀取這些數據。
18. 分離讀寫請求
由小型交錯讀取和寫入混合構成的工作負載將阻止內部緩存和預讀機制正常工作,並導致吞吐量下降。最好避免同時讀取和寫入,並在大塊中依次執行它們,最好是集群塊的大小。例如,如果必須更新 1000 個文件,您可以迭代這些文件,對文件進行讀寫,然後移動到下一個文件,但這會很慢。最好一次讀取所有 1000 個文件,然後一次寫回這 1000 個文件。
19.批量失效數據
當某些數據不再需要或需要刪除時,最好在單個操作中大批量等待並使其失效。這將允許垃圾收集器進程一次處理更大的區域,並有助於最大限度地減少內部碎片。
20. 隨機寫入並不總是比順序寫入慢
如果寫入很小(即低於集群塊的大小),則隨機寫入比順序寫入慢。
如果寫入既是集群塊大小的倍數又與集群塊大小對齊,則隨機寫入將使用所有可用的內部並行級別,並且將執行與順序寫入一樣好。對於大多數驅動器,群集塊的大小為 16 MB 或 32 MB,因此使用 32 MB 是安全的。
21.一個大的單線程讀比很多小的並發讀好
並發隨機讀取無法充分利用預讀機制。此外,多個邏輯塊地址可能會出現在同一個晶元上,而不是利用或利用內部並行性。大型讀操作將訪問順序地址,因此將能夠使用預讀緩衝區(如果存在)並使用內部並行性。因此,如果例允許,最好發出大型讀取請求。
22.一個大的單線程寫比很多小的並發寫好
大型單線程寫入請求提供與許多小型並發寫入相同的吞吐量,但在延遲方面,大型單線程寫入比並發寫入具有更好的響應時間。因此,只要有可能,最好執行單線程大寫。
23.當寫量較小且不能分組或緩衝時,多線程是有益的
許多並發的小的寫請求將提供比單個小的寫請求更好的吞吐量。所以如果I/O很小,不能批量處理,最好使用多線程。
24.冷熱數據分離
熱數據是變化頻繁的數據,冷數據是變化不頻繁的數據。如果一些熱數據和一些冷數據存儲在同一個頁面中,那麼每次在讀-修改-寫操作中更新熱數據時,冷數據都會被一起複制,並且會在垃圾收集期間一起移動以進行磨損均衡。儘可能將冷熱數據拆分成單獨的頁面將使垃圾收集器的工作更輕鬆。
25. 緩存熱點數據
應儘可能多地緩衝極熱數據和其他高變化的元數據,並儘可能不頻繁地將其寫入驅動器。
系統優化
26. PCI Express 和 SAS 比 SATA 快
製造商提供的兩個主要主機介面是 SATA 3.0(550 MB/s)和 PCI Express 3.0(每通道 1 GB/s,使用多個通道)。串列連接 SCSI (SAS) 也可用於企業 SSD。在它們的最新版本中,PCI Express 和 SAS 比 SATA 更快,但它們也更貴。
27. 過度配置對於磨損平衡和性能很有用
只需將驅動器格式化為小於最大物理容量的邏輯分區容量,即可過度配置驅動器。對用戶不可見的剩餘空間仍將可見並由 SSD 控制器使用。過度配置有助於磨損平衡機制應對 NAND 快閃記憶體單元固有的有限壽命。對於寫入不那麼重的工作負載,10% 到 15% 的過度空間配置就足夠了。對於持續隨機寫入的工作負載,保持高達 25% 的過度空間配置將提高性能。超額配置將充當 NAND 快閃記憶體塊的緩衝區,幫助垃圾收集過程吸收寫入峰值。
28.啟用TRIM命令
確保您的內核和文件系統支持 TRIM 命令。當一個塊被刪除時,TRIM 命令會通知 SSD 控制器。然後,垃圾收集過程可以在空閑時間在後台擦除塊,使驅動器準備好應對大型寫入工作負載。
29.對齊分區
為確保邏輯寫入真正與物理內存對齊,您必須將分區與驅動器的 NAND 快閃記憶體頁面大小對齊。
結論
如果您在閱讀本文章後想更深入地了解 SSD。一個重要資源是 FAST 會議(文件和存儲技術的 USENIX 會議)。每年都有許多優秀的研究在那裡發表。強烈推薦FAST 2013的視頻和出版物。
https://www.usenix.org/conference/fast13

原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/230043.html