神秘的Flash Translation Layer (FTL)
轉自:http://blog.51cto.com/alanwu/1427101
如果僅僅是SSD的使用者,一定不會在意在SSD內部居然還存在一個復雜的軟件層Flash Translation Layer(FTL)。其實就是這個FTL才是SSD固態硬盤的軟件核心技術。正因為有了FTL,NAND Flash才能被當成硬盤來使用;文件系統才可以直接把SSD當成普通塊設備來使用。由于FTL是SSD設計廠商最為重要的核心技術,因此,沒有一家廠商愿意透露這方面的技術信息,并且也一直沒有業內的技術規范、標準存在。
FTL的重要程度在于決定了一個SSD的使用壽命、性能和可靠性。一旦FTL出現問題,那么就會導致數據讀寫發生錯誤,更為嚴重的是SSD盤無法被訪問。優秀的FTL不僅能夠提升Flash存儲的使用壽命,而且還可以最優化讀寫性能。因此,在Flash固態存儲中,FTL是一個最為重要的管理NAND Flash的軟件層。
在學術界,這十年來有很多文章在討論如果實現一個高效的FTL,例如,在有限硬件資源的環境下如何實現mapping?如何實現buffer的管理?如何實現高效的Garbage Collection?如何實現磨損均衡Wear-leveling?如何實現NAND Flash芯片之間的數據冗余(RAID on Chip)?很多算法的提出非常具有建設性和現實意義,對工業界具有很好的指導價值。
這里主要想談一下FTL內部mapping的機制。從文章《采用NAND Flash設計存儲設備的挑戰在哪里?》了解到基于NAND Flash研制存儲設備是有很多挑戰的,最大的問題在于NAND Flash不能像內存那樣隨意的寫入。NAND Flash在Page頁寫入之前必須要將Page頁所在的Block塊擦除。如果研制SSD的時候嚴格按照這個準則,那么設計開發出來的SSD是不能用的。其一,按照這種方式進行寫操作,寫入的性能將會很差,其bottleneck限制在塊擦除上(塊擦除時間在ms級);其二,不斷的對同一Block塊進行擦除操作,那么該塊將會在短時間內磨損寫壞,并且極易導致存儲在該塊上的數據丟失。因此,在設計SSD時最主要的任務就是解決NAND Flash的這種“寫時擦除”問題。
技術是相通的,在90年代提出的Log-structured File System(LFS)思想和NAND Flash簡直是天生一對。當初設計Log-Structured File System最主要的想法是利用機械磁盤出色的順序寫性能,避免糟糕的隨機寫問題。Log-structured File System在機械硬盤的時代有一定的應用局限性,問題在于采用log數據布局的方式之后,讀性能變得很差。因此,只有在大塊數據讀寫(對象存儲)的環境下,log-structured File System才變得合情合理。在NAND Flash介質上,不存在機械硬盤隨機讀寫的問題,因此,log-structured的數據布局方式不會引入任何性能問題,反而能夠解決NAND Flash的“寫時擦除”問題。
采用Log-structured的方式之后,NAND Flash可以采用out-of-place的數據更新方式。所有的數據更新都不會寫入原來的page頁,而是重映射寫入一個新的Page頁。在這個思路的引導,很顯然所有NAND Flash的存儲資源可以按照物理Page頁的方式管理起來,而用戶可見的空間則是一個連續邏輯Page頁連接起來的地址空間。FTL的一個關鍵任務就是建立邏輯Page和物理Page之間的映射關系,并且在數據寫入時重新分配物理Page頁。在這種機制的支撐下,SSD的寫性能可以大為提高,寫延遲可以控制在200us的級別。
引入log-structured的機制之后,邏輯page和物理page之間存在映射關系,FTL負責物理page頁的分配??紤]到每個Block塊都是有擦除壽命的,因此,如果想要提升SSD的整體使用壽命,那么需要將塊擦除次數均衡到所有塊上去。這個工作就交給了FTL中的塊分配器。均衡擦除次數這個工作其實是挺麻煩的事情,其最大的挑戰在于記錄每個塊的擦寫次數,并且這些信息需要持久化存儲。
眾所周知,log-structured數據布局方式最大的問題在于垃圾回收(garbage collection),由于page頁從來不會被in-place-update,因此,當一個page被重映射之后,老的page頁就會變成無效,等待Garbage Collection回收該頁。在NAND Flash中,GC最大的挑戰在于以塊為單元進行擦除,而不是Page頁。換句話說,GC需要將一個Block塊中的所有Page頁同時回收,這個限制導致GC在回收一個Block的時候會進行數據遷移操作。過多的數據遷移操作會影響SSD的使用壽命,并且會影響到整體的讀寫性能。因此,優化Garbage Collection成了FTL最頭疼的一個問題。最容易想到的一個優化方法是將冷熱數據分開存儲到不同的Block塊中,這樣在數據回收的時候,可以盡最大可能減少有效數據的遷移。
Log-structured File System為NAND Flash的FTL設計提供了一個非常好的思路。但是,要想在SSD這樣一個硬件資源非常有限的平臺上實現FTL的所有功能還是很有挑戰的。舉個例子,log-structured的方式是需要進行Page頁映射的,映射操作需要建立映射表。如果內存太小,那么對映射表的大小就提出了需求。假設一個SSD具有1TB的容量,那么如果采用4KB Page映射的方式,每個page映射需要4字節描述,那么至少需要1GB的內存容量來存放映射表。在嵌入式系統中,1GB的內存容量是龐大的。因此,為了避免過多的占用內存容量,拍腦袋可以想到Block映射的方式。假設一個Block容納128個Page頁,那么一下子可以將映射表容量縮減到原來的1/128。但是這種Block映射的方式效率實在太低,會導致大量的數據遷移,從而縮短了SSD的使用壽命。所以,為了減小映射表的容量,一個比較可行的方式是采用Hybrid映射方式。
Hybrid-level mapping的思想是將映射操作分成兩級。第一級是data-log,所有數據首先寫入log,當log寫滿之后,再將log中的數據合并至data-block;第二級是data-block,用來存放從log中合并過來的數據。對于data-log,由于數量有限,因此可以采用page-level mapping的方式;對于data-block,由于存儲容量比較大,因此,可以采用block-level mapping的方式。Hybrid-level mapping可以很好的平衡內存使用和mapping效率之間關系,因此,學術界也對此提出了很多優化的方法。
?
?
其中,一個比較有意思的方法是locality aware的hybrid-level mapping思想,其原理如上圖所示。從結構上講,其大致可以分成傳統Hybrid-level mapping的雙層結構。寫入的數據首先進入data-log。不同的地方是,data-log被分成了random-log-buffer和sequential-log-buffer。寫入的數據根據locality-detector被分流至random-log-buffer或者sequential-log-buffer。其中random-log-buffer采用page頁映射的方式,sequential-log-buffer直接采用block映射的方法,這樣可以進一步降低內存使用量。當log-buffer中的數據滿了之后,需要合并到data-block。合并的方法和傳統的相同,被分成switch、partial-merge和full-merge。
FTL是NAND Flash存儲的底層核心技術之一,由于NAND Flash本身存在很多問題,導致FTL的設計、實現都會存在很多的挑戰。上面只是簡單的闡述了一下FTL中mapping的一些棘手問題和一些解決思路,拋磚引玉,揭開了神秘面紗,往里面瞅上了一眼。這一看其實會發現,FTL雖小,但是難度絲毫不比一個文件系統小。
總結
以上是生活随笔為你收集整理的神秘的Flash Translation Layer (FTL)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 香港AfterShip 爱客科技(深圳
- 下一篇: WebView相关面试题