天天看點

為SSD程式設計(4)——進階功能和内部并行

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

在這個部分,我将簡要的介紹一些SSD的主要功能,如TRIM和預留白間。我同樣會介紹SSD中不同等級的内部并行。

讓我們假設一個程式向SSD所有的邏輯塊位址都寫入檔案,這個SSD當然會被裝滿。然後删除這些檔案。檔案系統會報告所有的地方都是空的,盡管硬碟實際上還是滿的,因為SSD主要沒法知道邏輯資料是什麼時候被主機删掉的。SSD主要隻會在這些邏輯塊位址被複寫的時候才知道這些是空閑空間。此時,垃圾回收程序将會擦除與這些檔案相關的塊,為進來的寫操作提供空的頁。其結果就是,擦除操作并非在知道儲存有無用資料之後立刻執行,而是被延遲了,這将嚴重影響性能。

另一個值得關心的是,既然SDD主要不知道這些頁儲存有已删除的檔案,垃圾回收機制仍然會為了損耗均衡而移動這些頁上的資料。這增加了寫入放大,并毫無意義地影響了來自主機的前台工作負載。

延遲擦除問題的一個解決方法是TRIM指令,這個指令由作業系統發送,通知SSD控制器邏輯空間中的這些頁不會再使用了。有了這個資訊,垃圾回收程序就會知道自己不必再移動這些頁,并可以在任何需要的時間擦除它們。TRIM指令隻會在當SSD、作業系統和檔案系統都支援的時候才起作用。

TRIM指令的維基百科頁面列出了支援TRIM的作業系統和檔案系統。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功能。

預留白間隻是簡單的使實體塊比邏輯塊多,即為主要保留一定比例的,使用者不可見的實體塊。大多專業級SSD生産商已經包括了一些預留白間,通常是7~25%。使用者可以簡單的通過建立比最大實體容量小的邏輯容量分區來建立更多的預留白間。例如,你可以在100G的硬碟上建立一個90G的分區,而把剩下的10G作為預留白間。即使預留白間在作業系統級是不可見的,但SSD主要仍然是可以看見的。生産商提供預留白間的主要原因是為了對付NAND閃存單元固有的獸獸門限制。不可見的預留白間的塊将無縫的替換可見空間上的已耗損殆盡的塊。

AnandTech有一篇有意思的文章顯示出預留白間對SSD壽命和性能的影響。在他們研究的硬碟上,結果顯示出僅通過保證25%的預留白間(把所有的預留白間加在一起)就可以使性能極大地提升。在Percona的一篇文章中有另外一個有意思的結果,在他們測試了一塊Intel

320 SSD,顯示出當硬碟逐漸填滿時,寫入吞吐量将随之下降。

這裡是我的實驗中發生的事情。垃圾回收是使用空閑時間在背景擦除頁上不再使用的資料的。但既然擦除操作比寫入操作的延遲更久,或者說擦除要的時間比寫入長,在持續的重随機寫入工作負載下的SSD将會在垃圾回收有機會擦除之前用盡所有的空塊。此時,FTL将不能跟上前台的随機寫入工作負載,而垃圾回收程序将必須在寫入指令進來的同時擦除塊。這就是在基準測試中SSD性能下降的厲害,而SSD顯得性能超差的時候,如下圖7所示。是以,預留白間可以吸收高吞吐量寫入負載,起到緩沖的作用,為垃圾回收跟上寫入操作并重新開始擦除無用塊留夠時間。預留白間需要多少大部分基于SSD使用環境的工作負載,和其需要的承受的寫入操作的量。作為參考,持續随機寫入的工作負載比較推薦使用大約25%的預留白間。如果工作負載不是很重,大概10~15%估計夠大的了。

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

SSD可以簡單地通過格式化時設定比最大實體容量小的邏輯容量來啟動預留白間。餘下的不被使用者所見的空間仍會被SSD主要所用。預留白間幫助損耗均衡機制來對付NAND閃存單元的壽命限制。對于寫入不是很重的工作負載,10~15%的預留白間足夠了。對于持續的随機寫入工作負載,保持25%的預留白間将會提升性能。預留白間将會扮演NAND閃存塊的緩沖區的角色,幫助垃圾回收程序吸收寫入峰值。

從此,同樣可以推導出,預留白間甚至可能為不支援TRIM指令的環境提供更大的性能提升——注意我隻是在這進行個假設,我仍然在尋找材料來支援這個觀點。假設隻有75%的硬碟空間可被作業系統使用,餘下的25%留作預留白間。因為SSD控制器可以看見整個硬碟,盡管在某一時刻隻有75%的實體NAND閃存被使用,但100%的塊都在已使用、已廢棄、已擦除三種狀态中交替轉換。這表示餘下的25%實體閃存将可以安全的認為沒有儲存有資料,因為其并沒有被映射到任何邏輯塊位址上。是以,即使不支援TRIM,垃圾回收程序也能夠提前擦除這些預留白間中塊。

一些SSD主要提供ATA安全擦除功能,其作用是當硬碟處于意料之外的狀态時恢複其性能。這個指令擦除所有使用者寫入的資料并重置FTL映射表,但這顯然不能克服P/E循環有限造成的實體限制。盡管其功能上看上去非常有前途,但需要每個生産商争取的實作它。Wei等人2011年在他們關于安全擦除指令的review中顯示,在他們研究的超過12個型号SSD中,隻有8個提供了ATA安全擦除功能,而在這8個硬碟中,三個都有各種bug。

對于性能的影響是很重要的,并且在安全方面更加重要,但我不想展開說。這裡有幾個Stack Overflow上的讨論可以解釋關于如何可靠地删除SSD中的資料的細節。

原生指令隊列(NCQ)是SATA的一個功能,其允許SSD接受來自主機的多個指令,使SSD可以使用内部并行同時完成這些指令。除了減少因為硬碟造成的延遲外,一些新的硬碟同樣使用NCQ來應對來自主機的延遲。例如NCQ可以優先傳入的指令來確定當主機CPU忙的時候硬碟總是有指令處理。

無論是在家還是在資料中心,斷電都是有可能發生的。一些生産商在他們的SSD結構中設定有超級電容,這個電容設計為存有足夠送出總線中所有I/O請求所需的能量以防掉電。問題在于并非所有的SSD生産商都為他們的硬碟設定超級電容或者某種掉電保護,而有超級電容的不總是在說明書中提及。然後,和安全擦除指令一樣,斷電保護機制的實作是否正确,并且是否确實能夠在掉電時避免資料損壞是搞不清楚的。

Zheng等人2013年的研究中測試了15個SSD,但沒有透露品牌。他們給硬碟各種各樣的電源故障,發現測試的15個SSD中有13個最終丢失資料或者大規模的資料損壞。在另外一篇Luke

Kenneth Casson Leighton寫的關于電源故障的文章中顯示出,測試的4個硬碟有3個最終都在不正确的狀态,剩下的一個沒有問題(是Intel的硬碟) 。

SSD還是一個非常年輕的技術,并且我相信這些電源故障下造成資料損壞的阻力将會在接下來的産品中克服。然而現在,在資料中心配置不間斷電源(UPS)可能還是應該做的。并且和任何其他存儲解決方案一樣,經常備份敏感資料。

因為實體限制的存在,異步NAND閃存I/O總線無法提供32-40 MB/s以上的帶寬。SSD生産商提升性能的唯一辦法是以某種方法讓他們的硬碟中的多個存儲晶片可以并行或者交錯。的2.2節中有一個比較好的關于交錯的解釋。

通過組合SSD内所有層次的内部并行,不同晶片中的多個塊可以作為一個叫clustered block(直譯是叢集塊,但我感覺用簇比較親切,本譯文中所有的簇都是指它)東西同時通路。我不打算解釋關于SSD内部并行的所有細節,是以我隻簡述一下并行的層次和簇。擷取更多關于這個話題的資訊,以及SSD内部并行的概括,這裡的兩篇論文是很好的開始。此外,一些進階指令如copyback和inter-plane transfer在中有闡述。

内部并行

在SSD内部,數個層次的并行允許一次将數個塊寫入到不同的NAND閃存晶片中,這些塊稱為簇。

下邊的圖6展示了NAND閃存晶片的内部,其組織為一種分級的結構。這些級别包括通道、封裝、晶片、面、塊和頁。如中揭示的,這些不同的層通過下邊的方法提供并行

通道級并行 閃存主要和閃存封裝之間的通信通過數個通道。這些通道可以獨立或者同時通路。每個獨立通道有數個封裝共享。

封裝級并行 一個通道中的不同封裝可以獨立通路。交錯可以使指令同時在同一個通道中的不同封裝中運作。

晶片級并行 一個封裝包含兩個或者更多的晶片,晶片可以并行獨立通路。注:晶片通常也被稱為核心(chips are also called “dies”)

面級并行 一個晶片包含兩個或者更多的面。相同的操作(讀、寫或者擦除)可以在晶片中多個面上同時運作。面包含了塊,塊包含了頁。面也包含了寄存器(小RAM緩存),其用在面級操作上。

為SSD程式設計(4)——進階功能和内部并行

圖6: NAND 閃存封裝

譯注: 本節标題原文是“clustered blocks”,詞典上沒有這個詞(詞組?),Google了也沒有發現合适的翻譯,其直譯是“叢集的塊”或者“成簇的塊”。因為這個“clustered blocks”和“簇”的英文“Data cluster”比較像,特性上也相似(都是若幹存儲機關的集合),決定将這個“clustered blocks”在本文中譯為“簇”。但這個簇與機械硬碟的簇不是相同的東西,請讀者注意分辨。如果有更為合适或者正規的翻譯請告訴我。

從多個晶片中通路到的多個塊被稱為一個簇。這個做法比較像RAID系統中的striping。

一次通路的邏輯塊位址被分到不同SSD閃存封裝中的不同晶片上。這歸功于FTL的映射算法,并且這與這些位址是否連續無關。分割塊允許同時使用多個通道來整合其帶寬,并同樣可以并行執行多個讀、寫和擦除操作。這即表示I/O操作按簇大小對齊來確定SSD中多個級别的内部并行所提供的性能能夠最大程度的利用。

為SSD程式設計(4)——進階功能和内部并行

繼續閱讀