SSD知多少(3): FTL

SSD深入淺出理解筆記

Yuan Ko
Sep 11, 2022

FTL也是SSD之中最核心的技術,曾經有業內人士說過: “沒有寫過FTL,就不算是寫過SSD韌體。”就可以明白FTL在SSD之中的重要性。控制了SSD的磨損也大程度決定了SSD的壽命,同時也決定了SSD的讀取速度。Why?可以決定讀取速度

Performance, Reliability, Endurance這些很大程度上都是被FTL所影響的,那怎麼影響的呢?

Performance為什麼會被FTL的內容所影響?

Reliablility跟FTL之間的關係是?跟壞塊管理,掉電恢復有關係嗎?

Endurance很直接的被FTL磨損均衡的演算法所控制。

有個都市傳說是SSD愈寫愈慢,其實這是真的,因為前期總是有餘裕可以去寫入的時候不需要去做garbage collection,所以自然會比較快,可是到了後期寫入空間不足之後,需要去做garbage collection自然就會需要更多時間。

Write Amplification (WA) = 寫入falsh的資料量/用戶寫的資料量

Write Amplification (WA): 因為可能會有garbage collection的情況,所以寫入的次數並不會完全等同於user寫入的資料量,一般來說都會是大於的,而這個被稱為Write Amplification (WA)

Over Provisioning (OP)= (總體Flash空間-用戶使用空間)/用戶使用空間

一個SSD的 WA愈大愈不好,因為你寫入的資料量比你預期寫入的資料量大,會造成壽命的減少,同時進行garbage collection也會讓SSD的速度下降。

這時候要提到Over Provisioning (OP)再韌體上預留空間,因為OP大導致user space少,平均每塊flash上你的有效數據相對少。FTL在進行清除,並重新寫入有效數據的時候,清掉較多的都會是垃圾。

而如果今天OP小,你user space多,對於單塊flash的有效數據比例就較高,你清除再重新寫入的有效數據較多,那自然讓WA的數字較大。

簡單統整一句話,就是因為OP大你單塊flash比例上的垃圾比較多,清掉再重新寫入時,WA也會比OP小的情況來的小。那也因為,OP大的時候,需要重新寫入的有效數據少,在進行garbage collection的時候的時間也會較少,那也就讓SSD的效能更好。

在SSD深入淺出筆記有展示OP與WA以及endurence的關係圖,但是可能有版權問題,我就不放了,想要了解的讀者可以自行購買後閱讀。

上面我們提到Garbage collection(GC),

要對哪一塊進行Garbage collection我們又是什麼時候要進行Garbage collection呢?

GC實行的Block當然會希望是 block上面有效數據最多的,這樣之後要進行寫入的數據最少,可以有效地減少Write Ampilfy(WA)。但是通常不會兩全其美,所以會在這之間設置權重。目前大多廠商似乎都是以Greedy的方式去進下GC的。

那我們需要去進行GC的時機點分為兩種,Foreground GC在空間不足的時候被動去進行GC。另一個是在SSD 閒置時期,Background GC避免Foreground GC減少SSD效能。

如何去做磨損平衡(WL)?

這邊需要先講四個東西,Cold data, hot data,cold表示不常更新的資料,hot則是常更新的資料。同時,你在寫入的時候需要去判斷,目前的block是年輕還是老(也就是被使用的次數多寡,多的老,少的年輕,寫入較多次可能block會掛掉)。

這邊衍伸出兩個策略,動態WL,靜態WL。動態WL也就是把hot data放到年輕的數據上;靜態WL也就是把cold data放到年老的block。

目前心中的疑問在於,你要怎麼判斷他是cold data, hot data?畢竟類似這件事情在virtual memory之中也是用LFU Algorithm (least frequently used) 或是MFU Algorithm (most frequently used)

LFU Algorithm或是MFU Algorithm,但是兩個都會有overflow的可能,所以cold, hot之間到底要怎麼判斷我也不清楚,可能不同公司有不同作法吧,至少在深入淺出SSD我沒有找到答案。

SSD使用途中如果掉電會產生什麼影響嗎?

SSD上可能會有voliate的RAM, DRAM, SRAM等等先做暫存,之後才存入SSD之中,所以如果中途掉電會導致資料流失。

部分SSD上面會裝配電容,一旦SSD掉電就開始放電,讓RAM可以上面的數據寫入Flash之中。只是電容也不保證能讓RAM上面的數據完整寫入flash之中。另一種解法是Intel與Micron合作開發的3DX point,是利用 non-voliate來代替RAM,但是目前似乎Micron已經放棄開發,所以不清楚後續如何。

掉電除了會損失資料本身,也會失去在RAM之中的邏輯地址,導致無法映射到物理地址。所以掉電之後會需要重建映射表。那要怎麼重建映射表呢?

需要從Flash之中的Meta Data之中獲得我們需要的資訊,Meta Data之中有:邏輯位址,時間戳,Others。有了邏輯地址,我們就可以連結他的物理地址。可能可能會遇到在同樣的邏輯地址寫入在不同的物理地址,這時候就會需要時間戳去協助辨別哪一個才是比較新的資料。

SSD整顆重新掃描也是耗費時間的,因此我們可以選擇每經過固定時間就建立快照,這樣當需要重建映射表的時候花費的時間也更加的少。

閃存篇提到的壞塊要怎麼處理呢?

壞塊的處理方式有兩種:略過策略,替換策略。略過策略很直觀,就是跳過。替換策略,則是每個Die上面會有預留空間,當Die上面有壞塊的時候就會使用預留空間。

略過策略會導致SSD的效能不穩定,效能表現不如替換策略,但是替換策略如果有個別的Die品質較差,可能導致SSD效能受限於這個Die,這個也可以被理解為木桶效應,劣勢決定了整個系統的水準。

壞塊本身又分為出廠壞塊,以及使用之後出現的增長壞塊。出廠壞塊通常由Flash製造商對壞塊打上標注,比如說在特定字節打上非0xFF的值。參照文檔掃描所有block之後就可以建立壞塊表。也有些廠商會儲存在閃存之中;增長壞塊,則是在發現block出現UECC (Uncorrectable error correction),擦除失敗或是寫失敗,都是壞塊的表現。

延伸閱讀:

SSD知多少(1): 綜述

SSD知多少(2): Flash

SSD知多少(4): PCIe (撰寫中…)

Reference:

--

--