神祕的Flash Translation Layer (FTL)

 

若是僅僅是SSD的使用者,必定不會在乎在SSD內部竟然還存在一個複雜的軟件層Flash Translation LayerFTL)。其實就是這個FTL纔是SSD固態硬盤的軟件核心技術。正由於有了FTLNAND Flash才能被當成硬盤來使用;文件系統才能夠直接把SSD當成普通塊設備來使用。因爲FTLSSD設計廠商最爲重要的核心技術,所以,沒有一家廠商願意透露這方面的技術信息,而且也一直沒有業內的技術規範、標準存在。算法

FTL的重要程度在於決定了一個SSD的使用壽命、性能和可靠性。一旦FTL出現問題,那麼就會致使數據讀寫發生錯誤,更爲嚴重的是SSD盤沒法被訪問。優秀的FTL不只可以提高Flash存儲的使用壽命,並且還能夠最優化讀寫性能。所以,在Flash固態存儲中,FTL是一個最爲重要的管理NAND Flash的軟件層。app

在學術界,這十年來有不少文章在討論若是實現一個高效的FTL,例如,在有限硬件資源的環境下如何實現mapping?如何實現buffer的管理?如何實現高效的Garbage Collection?如何實現磨損均衡Wear-leveling?如何實現NAND Flash芯片之間的數據冗餘(RAID on Chip)?不少算法的提出很是具備建設性和現實意義,對工業界具備很好的指導價值。dom

這裏主要想談一下FTL內部mapping的機制。從文章《採用NAND Flash設計存儲設備的挑戰在哪裏?》瞭解到基於NAND Flash研製存儲設備是有不少挑戰的,最大的問題在於NAND Flash不能像內存那樣隨意的寫入。NAND FlashPage頁寫入以前必需要將Page頁所在的Block塊擦除。若是研製SSD的時候嚴格按照這個準則,那麼設計開發出來的SSD是不能用的。其一,按照這種方式進行寫操做,寫入的性能將會不好,其bottleneck限制在塊擦除上(塊擦除時間在ms級);其二,不斷的對同一Block塊進行擦除操做,那麼該塊將會在短期內磨損寫壞,而且極易致使存儲在該塊上的數據丟失。所以,在設計SSD時最主要的任務就是解決NAND Flash的這種「寫時擦除」問題。ide

技術是相通的,在90年代提出的Log-structured File SystemLFS)思想和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塊中,這樣在數據回收的時候,能夠盡最大可能減小有效數據的遷移。spa

Log-structured File SystemNAND FlashFTL設計提供了一個很是好的思路。可是,要想在SSD這樣一個硬件資源很是有限的平臺上實現FTL的全部功能仍是頗有挑戰的。舉個例子,log-structured的方式是須要進行Page頁映射的,映射操做須要創建映射表。若是內存過小,那麼對映射表的大小就提出了需求。假設一個SSD具備1TB的容量,那麼若是採用4KB Page映射的方式,每一個page映射須要4字節描述,那麼至少須要1GB的內存容量來存放映射表。在嵌入式系統中,1GB的內存容量是龐大的。所以,爲了不過多的佔用內存容量,拍腦殼能夠想到Block映射的方式。假設一個Block容納128Page頁,那麼一會兒能夠將映射表容量縮減到原來的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效率之間關係,所以,學術界也對此提出了不少優化的方法。對象

 

wKiom1OfBEji-swLAAEWz_4dq3Y721.jpg

 

其中,一個比較有意思的方法是locality awarehybrid-level mapping思想,其原理如上圖所示。從結構上講,其大體能夠分紅傳統Hybrid-level mapping的雙層結構。寫入的數據首先進入data-log。不一樣的地方是,data-log被分紅了random-log-buffersequential-log-buffer。寫入的數據根據locality-detector被分流至random-log-buffer或者sequential-log-buffer。其中random-log-buffer採用page頁映射的方式,sequential-log-buffer直接採用block映射的方法,這樣能夠進一步下降內存使用量。當log-buffer中的數據滿了以後,須要合併到data-block。合併的方法和傳統的相同,被分紅switchpartial-mergefull-merge

FTLNAND Flash存儲的底層核心技術之一,因爲NAND Flash自己存在不少問題,致使FTL的設計、實現都會存在不少的挑戰。上面只是簡單的闡述了一下FTLmapping的一些棘手問題和一些解決思路,拋磚引玉,揭開了神祕面紗,往裏面瞅上了一眼。這一看其實會發現,FTL雖小,可是難度絲絕不比一個文件系統小。

相關文章
相關標籤/搜索