FTL是個啥?
??FTL指Flash Translation Layer(閃存轉(zhuǎn)換層)固惯,這玩意兒的本職工作是完成Host的邏輯地址到Flash的物理地址的轉(zhuǎn)換厂抽。
??controller每把一筆數(shù)據(jù)寫入Flash中時,便會記錄下該數(shù)據(jù)的邏輯地址到物理地址的映射關(guān)系狈惫,這樣當(dāng)Host想要讀取這筆數(shù)據(jù)時就會根據(jù)這個映射讀取到真實的數(shù)據(jù)狭归。
首先說明一下閃存的特性:
1. 閃存塊需要先擦除才能寫入夭坪,不能覆蓋寫。
2. 閃存塊是有壽命的过椎。每擦除一次壽命便會減少一點室梅。
3. 閃存塊的讀取次數(shù)是有限的。讀的次數(shù)多了會造成讀干擾問題疚宇。
4. 閃存的數(shù)據(jù)保持是有時限的亡鼠。高溫時數(shù)據(jù)保持時間會縮短。
5. 閃存天生就會有壞塊敷待。使用過程中會產(chǎn)生新的壞塊间涵。
6. MLC和TLC 會有 lower page corruption的問題。
??針對閃存的以上特性榜揖,F(xiàn)TL在完成本職工作邏輯地址到物理地址轉(zhuǎn)換的同時浑厚,還要具有十八般武藝:
??垃圾回收(Garbage Collection)股耽,磨損平衡(Ware Leveling)根盒,壞塊管理钳幅,讀干擾處理,數(shù)據(jù)保持處理等事情炎滞。
FTL十八般武藝之本質(zhì)工作---映射管理
??映射有基于塊映射敢艰、基于頁映射和混合映射。
??基于塊映射Host在讀寫小尺寸數(shù)據(jù)(隨機性能)時性能較差册赛,一般用在U盤中(ps:不要驚訝钠导,U盤中也用到FTL的),所以U盤不適合裝系統(tǒng)森瘪,適合用來讀寫大尺寸數(shù)據(jù)的數(shù)據(jù)傳輸用牡属。
??基于頁映射對小尺寸數(shù)據(jù)(隨機性能)有很好的性能,但是由于閃存的頁要比閃存塊多的多扼睬,需要更多的空間來存放映射表逮栅。為了追求更好的隨機性能(操作系統(tǒng)對這個很在意)所以SSD都采用頁映射。
??混合映射的性能介于上邊二者之間窗宇,當(dāng)然存放映射表所用的空間也介于二者之間措伐。
SSD內(nèi)部FW維護(hù)了一張邏輯地址到物理地址的映射表(Map Table)。用戶每寫入一個邏輯頁就需要更改一次MT军俊;當(dāng)讀取一個邏輯頁時侥加,SSD會查找映射表中該邏輯頁對應(yīng)的物理頁,然后再訪問Flash讀取所要的數(shù)據(jù)粪躬。
??一般映射的邏輯頁的大小為4KB担败,物理地址的大小為4Byte,那么一個256GB的SSD的映射表大小為:256GB/4KB*4B = 256MB镰官,也就是說映射表的大小是SSD容量的1/1024提前。
??為了存放這個映射表,SSD一般有兩種設(shè)計方案:DRAM(帶DRAM的)和DRAM-less(不帶DRAM的)朋魔。帶DRAM的一般會把緩沖數(shù)據(jù)和映射表統(tǒng)統(tǒng)存放在DRAM中岖研,優(yōu)點是查找更新映射表迅速,性能較好警检,劣勢是多了一個DRAM孙援,成本和功耗上升,當(dāng)前的主流SSD是該方案扇雕;DRAM-less的會將少部分的映射表放在片內(nèi)的SRAM上拓售,其余部分的映射表則會放在Flash中,這種方案好處是節(jié)省了DRAM的成本和功耗镶奉,但是讀寫Flash要比讀寫DRAM要慢得多础淤,所以速度上不如DRAM方案崭放,性能較差,當(dāng)前入門級的SSD多采用這種方案鸽凶。
??一個小問題:我們都知道DRAM掉電數(shù)據(jù)是會丟失的币砂,那么數(shù)據(jù)表怎么辦?
答案是在SSD掉電之前玻侥,它會把映射表寫入到Flash中去的决摧,下次上電初始化時需要重新把映射表讀出來放在DRAM或SRAM中。也就是說不管DRAM或DRAM-less凑兰,F(xiàn)lash中都需要儲存映射表的掌桩。
FTL十八般武藝之重要內(nèi)功---收垃圾(Garbage Collection)
??這年頭收垃圾也成特色技能了,還是重要內(nèi)功姑食。波岛。。哈哈
??垃圾回收音半,就是把某一個閃存塊上的有效數(shù)據(jù)讀出來则拷,寫入另一個數(shù)據(jù)塊中,然后擦除原來的閃存塊祟剔,使之可用隔躲。
??也許你會問,數(shù)據(jù)在原來的閃存塊上待的好好的物延,為什么要費事吧連的讀出來寫入另外的塊中呢宣旱?原因是原來閃存塊上的垃圾(無效數(shù)據(jù))太多了!如前文講道叛薯,閃存塊需要先擦除才能寫入浑吟,不能覆蓋寫。如果一個塊上只有一點點有效數(shù)據(jù)占著整個數(shù)據(jù)塊耗溜,那么就需要把有效數(shù)據(jù)搬移出來组力,把這個塊擦除掉使之變成可用狀態(tài),從而提高塊的使用率抖拴。
??也許你又會問燎字,為啥子數(shù)據(jù)會無效呢?原因還是因為閃存的特性導(dǎo)致的阿宅,為了延長每個閃存塊的壽命候衍,就需要均衡每個數(shù)據(jù)塊的擦除次數(shù),為了均衡每個數(shù)據(jù)塊的擦除次數(shù)洒放,數(shù)據(jù)寫入時候就需要均衡的寫入每個塊蛉鹿,而不能照著一個塊往死了寫。當(dāng)用戶空間里的數(shù)據(jù)寫滿后往湿,就需要把數(shù)據(jù)寫備用空間(SSD的實際容量都比標(biāo)稱容量大妖异,多出來的部分就是備用空間)惋戏,因為備用空間對操作系統(tǒng)是不可見的,那么每往備用空間寫一筆數(shù)據(jù)就會在用戶空間產(chǎn)生一筆無效數(shù)據(jù)(垃圾)他膳。
??江湖傳言:SSD越用速度越慢响逢。很不幸,這是真的矩乐,而且是有依據(jù)的龄句。新盤沒有垃圾可收,所以速度快散罕!用久了產(chǎn)生的垃圾就多了,就需要用內(nèi)功把垃圾逼出來傀蓉,當(dāng)然速度就慢下來了欧漱。
FTL十八般武藝之---磨損平衡(Ware Leveling)
??其實在垃圾回收的時候已經(jīng)提到磨損平衡的原因了:為了延長每個閃存塊的壽命,就需要均衡每個數(shù)據(jù)塊的擦除次數(shù)葬燎,為了均衡每個數(shù)據(jù)塊的擦除次數(shù)误甚,數(shù)據(jù)寫入時候就需要均衡的寫入每個塊,而不能照著一個塊往死了寫谱净。
那么窑邦,一個閃存塊的壽命有多長呢?
SLC:10萬次
MLC:1~10千次
TLC:幾百次~2千次
QLC:< TLC
3D:< QLC
所以壕探,磨損平衡很重要冈钦!接下來幾個概念:
冷數(shù)據(jù)(Cold Data),熱數(shù)據(jù)(Hot Data)
年老塊(Old Block)李请,年輕塊(Young Block)
??所謂冷數(shù)據(jù)就是用戶不常更新的數(shù)據(jù)瞧筛,比如音視頻,只讀數(shù)據(jù)等导盅;相反熱數(shù)據(jù)就是頻繁更新的數(shù)據(jù)较幌,比如軟件使用等,會產(chǎn)生很多垃圾白翻。
??所謂年老塊是指擦寫次數(shù)比較多的塊乍炉;相反年輕塊則指擦寫次數(shù)比較少的塊。ps:每個塊都有EC(Erase Count)滤馍,年輕還是年老SSD一下就可以看出來岛琼。
??SSD一般有兩種(Ware Leveling)算法:動態(tài)磨損平衡(Dynamic WL)和靜態(tài)磨損平衡(Static WL)。動態(tài)磨損平衡算法基本原理是把熱數(shù)據(jù)寫到年輕塊上纪蜒;靜態(tài)磨損平衡的基本思想是把冷數(shù)據(jù)寫到年老塊上衷恭。這里可以停下來先品味一下這樣的做的原因。
DWL好理解:寫數(shù)據(jù)時找年輕的塊寫纯续,避免往老年塊上寫數(shù)據(jù)随珠,各個塊就能保持一個比較均衡的值灭袁。
SWL呢?冷數(shù)據(jù)基本不更新窗看,它所占用的塊擦寫次數(shù)就不會增加茸歧,而其他塊會被經(jīng)常寫入數(shù)據(jù),塊擦寫次數(shù)是會增加显沈,這樣就導(dǎo)致了擦除不均衡软瞎,SSD最不喜歡這個了。所以需要把冷數(shù)據(jù)搬到老年塊上拉讯,讓年輕塊替代老年塊的工作涤浇。