為SSD程式設計(6):總結—每個程式設計師都應該瞭解的固態硬碟知識

熊鐸發表於2014-06-03

在這部分,我以獨立的簡單段落的形式總結了其它部分的內容。每個段落概括了其他部分一節或幾節的內容,這樣可以讓讀者在每個主題下能夠得到更多細節。

基礎

1. 儲存單元型別

固態硬碟(SSD)是基於快閃記憶體的資料儲存裝置。每個位元都儲存在儲存單元中,而儲存單元分為三類:每個單元1位元(單層單元,SLC),每個單元2位元(多層單元,MLC),每個單元3位元(三層單元,TLC)。

>> 詳見第1.1節

2. 壽命限制

每個單元都有P/E(寫/擦)迴圈的最大限制,在此之後儲存單元被認為是損壞的。這表示NAND快閃記憶體已經損耗殆盡,並有一個壽命限制。

>> 詳見第1.1節

3. 基準測試很難

測試者是人,因此並不是所有的基準測試都毫無破綻。在讀生產商或者第三方的基準測試結果的時候請小心,並在相信這些資料之前使用多個來源的資料。在有可能的時候,使用你的系統特定的工作負載在你打算使用的SSD型號上,執行自己的內部基準測試。最後,著眼於與你的系統最相關的效能指標。

>> 詳見第2.2節和第2.3節

 

頁和塊

4. NAND快閃記憶體頁和塊

快閃記憶體單元組織成為陣列,稱為塊,而塊組織成為面。塊中能夠進行讀寫操作的最小單元是頁。頁不能獨立擦除,只能整塊擦除。NAND快閃記憶體頁大的大小並不一致,大多數硬碟的頁大小是2KB、4KB、8 KB 或16 KB。大多數SSD每個塊有128或256個頁。這即表示一個塊的大小可能在256 KB 到4 MB之間。例如Samsung SSD 840 EVO的塊大小是2048 KB,每塊包括256頁每頁8KB。

>> 詳見第3.2節

5. 讀是頁對齊的

一次讀取少於一頁是不可能的。當然可以通過作業系統只請求一個位元組,但SSD中會取回整個頁,強制讀取比所需多的多的資料。

>> 詳見第3.2節

6. 寫是頁對齊的

寫入到SSD的時候,寫入將補齊到頁大小。所以即便寫入操作隻影響一位元組,都會重寫整個頁。寫入比所需更多的資料被稱為寫入放大。寫入一個頁也被稱為“(編置to program)”一個頁。

>> 詳見第3.2節

7.頁不能覆寫

NAND快閃記憶體頁只能在其為“空”的狀態下進行寫入。當資料改變,頁的內容被複制到內部暫存器中,資料更新,然後新版本的資料將儲存字啊一個”空“頁中,這個操作被稱為”讀-改-寫“。資料並非原地更新,因為”空”頁並非原先儲存資料的頁。一旦資料被儲存到硬碟上,原來的頁將被標記為“廢棄”,並一直保持這樣直到被擦除。

>> 詳見第3.2節

8.擦除是塊對齊的

頁不能被覆寫,一旦頁成為“廢棄的”,讓其重新空下來的方法是擦除它們。然而,獨立擦除一個頁是不可能的,並且只能一次擦除整個塊。

>> 詳見第3.2節

 

主控和內部

9.快閃記憶體轉換層

快閃記憶體轉換層(FTL)是SSD主控中的一個元件,它將來自主機的邏輯塊地址(LBA)對映為硬碟上的物理塊地址(PBA)。很多最新的硬碟使用了類似於“混合日誌塊”或其派生者的技術,其以類似於日誌結構檔案系統的方式工作。這允許將隨機寫入當做順序寫入處理。

>> 詳見第4.2節

10.內部並行

在內部,數個層次的並行使得可以一次向不同NAND快閃記憶體晶片上寫數個塊的資料,這幾個塊被稱為“簇”。

>> 詳見第6節

11.損耗均衡

因為NAND快閃記憶體單元會損耗殆盡,FTL的一個主要目標是額能的將工作分散到各個單元上,這樣塊中的快閃記憶體單元可以在同一時間損壞。

>> 詳見第3.4節

12.垃圾回收

SSD主控中的垃圾回收確保廢棄的塊能夠擦除並重新變為空狀態,使新進入的寫入命令可以訪問。

>> 詳見第4.4節

(譯註:你沒看錯,少了13,原文就是這樣)

14.後臺操作可能影響前臺操作

例如垃圾回收的後臺操作可能對來自主機的前臺操作有負面影響,尤其是在持續的小隨機寫入工作負載下。

>> 詳見第4.4節

訪問模式

15.絕不寫入少於一頁的資料

避免寫入少於NAND快閃記憶體頁大小的資料以最小化寫入放大並避免讀-改-寫操作。目前一頁最大為16KB,因此此值應該作為預設值使用。這個值取決於SSD型號,並且在將來SSD改進之後你可能需要增加。

>> 詳見第3.2和3.3節

16.對齊寫入

將寫入對齊為頁大小,寫入資料塊大小為頁大小的倍數。

>> 詳見第3.2和3.3節

17.小寫入快取化

為了最大化吞吐量,在任何可能的時候將小寫入快取到記憶體中,當快取滿了再進行一次大寫入,這樣來將小寫入打包。

>> 詳見第3.2和3.3節

18.為了提升讀效能,將相關的資料寫在一起。

讀取效能取決於寫入模式。當大資料塊一次寫入的時候,其將被分配到不同的NAND快閃記憶體晶片上。因此你需要將相關的資料寫到相同的頁、塊、或簇上,這樣在你之後讀取的時候可以利用內部並行,用一個I/O請求更快的讀取。

>> 詳見7.3節

19.分離讀寫請求

混合的小讀寫交叉的工作負載會妨礙內部快取和預讀取機制正常工作,並會導致吞吐量下降。最好的辦法是避免同時發生的讀操作和寫操作,並將其以一個接一個的大資料塊的形式實現,資料塊大小推薦和簇大小相同。舉個例子,如果要更新1000個檔案,你可以遍歷檔案逐一讀寫,但會很慢。如果一次讀取1000個檔案然後一次寫回1000個檔案將會好很多。

>> 詳見7.4節

20.批量廢棄資料

當有資料不再需要或者需要刪除的時候,最好等到廢棄資料量比較大的時候在一個操作中統一廢棄它們。這可以使垃圾回收程式可以一次處理更大範圍的資料,可以最小化內部碎片。

>> 詳見第4.4節

21.隨機寫入並不遠總是比順序寫入慢

如果寫入很小(即小於簇大小)。隨機寫入將比順序寫入慢。如果寫入都是數倍於且對齊簇大小的話,隨機寫入將會利用所有可用層次的內部並行,並達到和順序寫入相同的水平。對於大部分硬碟來說,簇大小是16或32MB,因此使用32MB應該是安全的。

>> 詳見第7.2節

22.一個大的單執行緒的讀取比很多小的併發讀取要好

併發隨機讀取不能完全使用預讀取機制。並且,多個邏輯塊地址會指向同一個晶片而不能利用內部並行。一個大的書籤操作將會訪問連續地址並在預讀取快取可用的時候利用之,並使用內部並行。因此如果用例允許的話,發出一個大的讀取請求會好一些。

>> 詳見第7.3節

23.一個大的單執行緒寫入比很多小的併發寫入要好

大的單執行緒寫入請求提供的吞吐量和很多併發寫入是相同的,然而就延遲來說,一個大的單一寫入比並發寫入反應時間要短一些。因此,在可用的時候,使用單執行緒大寫入是最好的。

>> 詳見7.2節

24.當寫入小且無法快取或組織在一起的時候,多執行緒是有用的。

很多併發寫入請求將比單一小寫入請求提供的吞吐量要大。因此,如果I/O很小並且不能組織,用多執行緒比較好。

>> 詳見第7.2節

25.分離冷熱資料

熱資料是經常改變的資料,而冷資料是不經常改變的資料。如果一些熱資料和冷資料被儲存在同一個頁中,冷資料將會隨著熱資料的每次讀-改-寫操作一起復制,並且會因為垃圾回收的損耗均衡不停移動位置。儘可能的將冷熱資料分離到不同的也中將減輕垃圾回收的工作。

>> 詳見4.4節

26.快取熱資料

極其熱的速進和其他高頻變化的後設資料應該儘可能的快取並儘可能少的寫入硬碟。

>> 詳見4.4節

 

系統優化

27. PCI Express 和SAS比SATA快

生產商提供的兩個主要的介面是SATA 3.0 (550 MB/s) 和 PCI Express 3.0 (1 GB/s 每通道,使用多個通道)。序列SCSI(SAS)同樣在企業級的SSD上可用。在最新版本中,PCI Express和SAS比SATA要快,但也更貴。

>> 詳見2.1節

28.預留空間對提高效能和損耗均衡十分有用

硬碟可以簡單地通過在格式化的時候讓邏輯分割槽容量比最大物理容量小來設定預留空間。預留的空間對使用者不可見,但SSD主控仍然可見。預留空間幫助損耗均衡機制應付NAND快閃記憶體單元固有的壽命限制。對於寫入負載不是很重的工作環境,10%~15%的預留空間足夠了。對於持續隨機寫入的工作負載,保持25%的工作負載將會提升效能。預留空間將會扮演NAND快閃記憶體塊的快取的角色,幫助垃圾回收程式吸收寫入峰值。

>> 詳見5.2節

29.啟用TRIM命令

確認你的系統核心和檔案系統支援TRIM命令。TRIM命令在塊被刪除的時候通知SSD主控。當垃圾回收程式能夠在空閒時候後臺擦除這些塊,為將來的寫入負載準備硬碟。

>> 詳見第5.1節

30.對齊分割槽

為了確保邏輯寫入確實和物理儲存裝置對齊,你需要將分割槽和硬碟的NAND快閃記憶體頁對齊。

>> 詳見第8.1節

 

總結

這是為“SSD程式設計”系列文章的總結。我希望我用易於理解的方法表述了我在固態硬碟上的個人研究中學到的東西。

如果你讀了這個系列並想深入瞭解SSD,比較好的起步點是讀一些我在第二部分和第五部分列出的引用文獻和文章。

另外一個很好的學習資源是FAST大會(the USENIX Conference on File and Storage Technologies,USENIX檔案和儲存技術大會)。會上每年都有大量出色的研究。我高度推薦他們的網站,FAST 2013視訊和文獻的集散地。(譯註:截至本文翻譯完畢, FAST 2014的網站已經可用了。)

相關文章