1. 程式人生 > >為SSD編程(4)——高級功能和內部並行

為SSD編程(4)——高級功能和內部並行

意義 負載 express 三種 ren 緩存 ech ont 單元

原文 http://codecapsule.com/2014/02/12/coding-for-ssds-part-4-advanced-functionalities-and-internal-parallelism/


在這個部分。我將簡要的介紹一些SSD的主要功能,如TRIM和預留空間。我相同會介紹SSD中不同等級的內部並行。

5. 高級功能

5.1 TRIM

讓我們如果一個程序向SSD全部的邏輯塊地址都寫入文件,這個SSD當然會被裝滿。然後刪除這些文件。文件系統會報告全部的地方都是空的。雖然硬盤實際上還是滿的,由於SSD主控沒法知道邏輯數據是什麽時候被主機刪掉的。SSD主控僅僅會在這些邏輯塊地址被復寫的時候才知道這些是空暇空間。此時,垃圾回收進程將會擦除與這些文件相關的塊。為進來的寫操作提供空的頁。其結果就是。擦除操作並不是在知道保存有無用數據之後立馬運行,而是被延遲了。這將嚴重影響性能。

還有一個值得關心的是,既然SDD主控不知道這些頁保存有已刪除的文件,垃圾回收機制仍然會為了損耗均衡而移動這些頁上的數據。

這添加了寫入放大。並毫無意義地影響了來自主機的前臺工作負載。

延遲擦除問題的一個解決方法是TRIM命令。這個命令由操作系統發送。通知SSD控制器邏輯空間中的這些頁不會再使用了。有了這個信息,垃圾回收進程就會知道自己不必再移動這些頁,並能夠在不論什麽須要的時間擦除它們。TRIM命令僅僅會在當SSD、操作系統和文件系統都支持的時候才起作用。

TRIM命令的維基百科頁面列出了支持TRIM的操作系統和文件系統[16]。

Linux下,ATA TRIM的支持是在2.6.33版本號增加的。雖然ext2和ext3 文件系統不支持TRIM,ext4 和XFS以及其它的一些是支持的。

在Mac OS 10.6.8下。HFS+支持TRIM操作。Windows 7則僅僅支持使用SATA接口的SSD的TRIM。使用PCI-Express的則不支持。

如今大部分的硬盤都支持TRIM,確實。同意垃圾回收盡早的工作顯著地提升了將來的性能。

因此強烈建議使用支持TRIM的SSD,並確保操作系統和文件系統級都啟用了TRIM功能。

5.2 預留空間

預留空間僅僅是簡單的使物理塊比邏輯塊多,即為主控保留一定比例的。用戶不可見的物理塊。大多專業級SSD生產商已經包含了一些預留空間,一般是7~25%[13]。用戶能夠簡單的通過創建比最大物理容量小的邏輯容量分區來創建很多其它的預留空間。比如。你能夠在100G的硬盤上創建一個90G的分區,而把剩下的10G作為預留空間。即使預留空間在操作系統級是不可見的。但SSD主控仍然是能夠看見的。

生產商提供預留空間的主要原因是為了對付NAND閃存單元固有的獸獸門限制。不可見的預留空間的塊將無縫的替換可見空間上的已耗損殆盡的塊。

AnandTech有一篇有意思的文章顯示出預留空間對SSD壽命和性能的影響[34]。在他們研究的硬盤上,結果顯示出僅通過保證25%的預留空間(把全部的預留空間加在一起)就能夠使性能極大地提升。在Percona的一篇文章中有另外一個有意思的結果,在他們測試了一塊Intel 320 SSD,顯示出當硬盤逐漸填滿時。寫入吞吐量將隨之下降[38]。

這裏是我的實驗中發生的事情。

垃圾回收是使用空暇時間在後臺擦除頁上不再使用的數據的。

但既然擦除操作比寫入操作的延遲更久,或者說擦除要的時間比寫入長。在持續的重隨機寫入工作負載下的SSD將會在垃圾回收有機會擦除之前用盡全部的空塊。此時。FTL將不能跟上前臺的隨機寫入工作負載,而垃圾回收進程將必須在寫入命令進來的同一時候擦除塊。

這就是在基準測試中SSD性能下降的厲害,而SSD顯得性能超差的時候,例如以下圖7所看到的。因此,預留空間能夠吸收高吞吐量寫入負載,起到緩沖的作用,為垃圾回收跟上寫入操作並又一次開始擦除無用塊留夠時間。

預留空間須要多少大部分基於SSD使用環境的工作負載,和其須要的承受的寫入操作的量。作為參考,持續隨機寫入的工作負載比較推薦使用大約25%的預留空間[34]。假設工作負載不是非常重,大概10~15%預計夠大的了。

預留空間對損耗均衡和性能表現是實用的

SSD能夠簡單地通過格式化時設置比最大物理容量小的邏輯容量來啟動預留空間。

余下的不被用戶所見的空間仍會被SSD主控所用。預留空間幫助損耗均衡機制來對付NAND閃存單元的壽命限制。對於寫入不是非常重的工作負載,10~15%的預留空間足夠了。

對於持續的隨機寫入工作負載,保持25%的預留空間將會提升性能。預留空間將會扮演NAND閃存塊的緩沖區的角色。幫助垃圾回收進程吸收寫入峰值。

從此,相同能夠推導出,預留空間甚至可能為不支持TRIM命令的環境提供更大的性能提升——註意我僅僅是在這進行個如果,我仍然在尋找材料來支持這個觀點。如果僅僅有75%的硬盤空間可被操作系統使用。余下的25%留作預留空間。

由於SSD控制器能夠看見整個硬盤,雖然在某一時刻僅僅有75%的物理NAND閃存被使用,但100%的塊都在已使用、已廢棄、已擦除三種狀態中交替轉換。這表示余下的25%物理閃存將能夠安全的覺得沒有保存有數據,由於其並沒有被映射到不論什麽邏輯塊地址上。因此,即使不支持TRIM。垃圾回收進程也能夠提前擦除這些預留空間中塊。

5.3 安全擦除

一些SSD主控提供ATA安全擦除功能,其作用是當硬盤處於意料之外的狀態時恢復其性能。這個命令擦除全部用戶寫入的數據並重置FTL映射表,但這顯然不能克服P/E循環有限造成的物理限制。雖然其功能上看上去很有前途。但須要每一個生產商爭取的實現它。Wei等人2011年在他們關於安全擦除命令的review中顯示,在他們研究的超過12個型號SSD中,僅僅有8個提供了ATA安全擦除功能。而在這8個硬盤中,三個都有各種bug[11]。

對於性能的影響是非常重要的。而且在安全方面更加重要,但我不想展開說。這裏有幾個Stack Overflow上的討論能夠解釋關於怎樣可靠地刪除SSD中的數據的細節。

5.4 原生命令隊列(NCQ)

原生命令隊列(NCQ)是SATA的一個功能,其同意SSD接受來自主機的多個命令,使SSD能夠使用內部並行同一時候完畢這些命令[3]。除了降低由於硬盤造成的延遲外,一些新的硬盤相同使用NCQ來應對來自主機的延遲。比如NCQ能夠優先傳入的命令來確保當主機CPU忙的時候硬盤總是有命令處理。

5.5 斷電保護

不管是在家還是在數據中心,斷電都是有可能發生的。一些生產商在他們的SSD結構中設置有超級電容,這個電容設計為存有足夠提交總線中全部I/O請求所需的能量以防掉電。問題在於並不是全部的SSD生產商都為他們的硬盤設置超級電容或者某種掉電保護,而有超級電容的不總是在說明書中提及。

然後,和安全擦除命令一樣。斷電保護機制的實現是否正確,而且是否確實可以在掉電時避免數據損壞是搞不清楚的。

Zheng等人2013年的研究中測試了15個SSD。但沒有透露品牌[72]。

他們給硬盤各種各樣的電源故障,發現測試的15個SSD中有13個終於丟失數據或者大規模的數據損壞。在另外一篇Luke Kenneth Casson Leighton寫的關於電源故障的文章中顯示出。測試的4個硬盤有3個終於都在不對的狀態,剩下的一個沒有問題(是Intel的硬盤)[73] 。

SSD還是一個很年輕的技術,而且我相信這些電源故障下造成數據損壞的阻力將會在接下來的產品中克服。然而如今,在數據中心配置不間斷電源(UPS)可能還是應該做的。而且和不論什麽其它存儲解決方式一樣。常常備份敏感數據。

6.SSD中的內部並行

6.1 總線帶寬限制

由於物理限制的存在,異步NAND閃存I/O總線無法提供32-40 MB/s以上的帶寬[5]。SSD生產商提升性能的唯一辦法是以某種方法讓他們的硬盤中的多個存儲芯片能夠並行或者交錯。[2]的2.2節中有一個比較好的關於交錯的解釋。

通過組合SSD內全部層次的內部並行。不同芯片中的多個塊能夠作為一個叫clustered block(直譯是集群塊,但我感覺用比較親切。本譯文中全部的簇都是指它)東西同一時候訪問。

我不打算解釋關於SSD內部並行的全部細節,因此我僅僅簡述一下並行的層次和簇。

獲取很多其它關於這個話題的信息。以及SSD內部並行的概括,這裏的兩篇論文是非常好的開始[2, 3]。

此外。一些高級命令如copybackinter-plane transfer在[5]中有闡述。

內部並行

在SSD內部。數個層次的並行同意一次將數個塊寫入到不同的NAND閃存芯片中,這些塊稱為簇。

6.2 並行的多級別

下邊的圖6展示了NAND閃存芯片的內部。其組織為一種分級的結構。

這些級別包含通道、封裝、芯片、面、塊和頁。如[3]中揭示的,這些不同的層通過下邊的方法提供並行

  • 通道級並行 閃存主控和閃存封裝之間的通信通過數個通道。

    這些通道能夠獨立或者同一時候訪問。

    每一個獨立通道有數個封裝共享。

  • 封裝級並行 一個通道中的不同封裝能夠獨立訪問。交錯能夠使命令同一時候在同一個通道中的不同封裝中執行。
  • 芯片級並行 一個封裝包括兩個或者很多其它的芯片,芯片能夠並行獨立訪問。

    註:芯片通常也被稱為核心(chips are also called “dies”)

  • 面級並行 一個芯片包括兩個或者很多其它的面。

    同樣的操作(讀、寫或者擦除)能夠在芯片中多個面上同一時候執行。面包括了塊,塊包括了頁。面也包括了寄存器(小RAM緩存),其用在面級操作上。



    技術分享

圖6: NAND 閃存封裝

6.3 簇

譯註: 本節標題原文是“clustered blocks”,詞典上沒有這個詞(詞組?)。Google了也沒有發現合適的翻譯。其直譯是“集群的塊”或者“成簇的塊”。由於這個“clustered blocks”和“簇”的英文“Data cluster”比較像,特性上也相似(都是若幹存儲單位的集合),決定將這個“clustered blocks”在本文中譯為“簇”。但這個簇與機械硬盤的簇不是同樣的東西,請讀者註意分辨。假設有更為合適或者正規的翻譯請告訴我。

從多個芯片中訪問到的多個塊被稱為一個[2]。這個做法比較像RAID系統中的striping[1, 5]。

一次訪問的邏輯塊地址被分到不同SSD閃存封裝中的不同芯片上。這歸功於FTL的映射算法,而且這與這些地址是否連續無關。切割塊同意同一時候使用多個通道來整合其帶寬。並相同可以並行運行多個讀、寫和擦除操作。

這即表示I/O操作按簇大小對齊來確保SSD中多個級別的內部並行所提供的性能可以最大程度的利用。

技術分享

為SSD編程(4)——高級功能和內部並行