SSD TRIM
TRIM 作為消費級SSD的救世神藥,也是性能起飛的催化劑,下面簡單介紹TRIM的前世今生。
一. TRIM相關背景/TRIM需要解決的問題
TRIM由檔案系統發起,就拿FAT32檔案系統舉例, 一個檔案包括兩個部分file(檔案指針)和file data(檔案資料)。
檔案建立後如圖1:在FAT區儲存檔案的指針(512B資料),檔案資料可能分幾個段(如file data1 和 file data2)
圖1:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLxYTOyAjNzUTM5ETMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
如圖2: 當要删除檔案時,檔案系統重新寫入檔案指針(深色的file),新的檔案指針不在指向老的file data。
圖2:
如圖3: 新的檔案指針和沒有任何聯系, 老資料因而成為垃圾資料。
圖3:
由于SSD不感覺host檔案删除, 仍然以為這些資料是有效資料。 在做GC時會帶來很多寫放大。由此TRIM 應運而生。
2. TRIM需要做什麼?
1): 清除無效的LBA映射表。
直接更新L2P table, clear trim LBA map。
2):重新計算Block有效資料個數。
通過L2P table查找到對應的BLK 号, 更新對于BLK的valid cnt。
3. TRIM遠沒有想象的那麼簡單
1)TRIM LBA不對齊處理:
HOST 大多資料以sector(512B)通路, 但SSD内部往往以4KB~16KB 對齊。 那麼如果這種不對齊的TRIM 指令如何處理呢?
如圖比如SSD 内部以4K mapping, 那麼LBA 6~7為一個單元, LBA8~15為另外一個單元。 LBA8~15可以直接修改L2P清楚映射關系就行, 但LBA 6~7不是一個映射單元, 如果需要trim顯然需要做一次read modify write,但這個對于大容量SSD 是不現實的。
其實Spec 有規定可以不知道TRIM後資料為全0, 是以實際做法可以是不修改LBA6~7的映射關系。
2)TRIM 給GC 帶來什麼?
TRIM對于GC如圖插上翅膀, 嘗試想一想GC面對一堆堆的無用資料需要搬移, 那麼現在告訴你隻需要搬這幾個就行,是不是快樂多了,如圖:
3)TRIM和SPOR的逆緣
有了TRIM, TRIM過後的資料發生SPOR應該盡量保證no mapping
試想一下這個場景: Host 寫 LBA0, 然後TRIM LBA 0~100, 再寫LBA 0, 異常掉電,再上電,讀LBA 0,host得到的資料是?
(L2P 不會一直dump)
假設:
如果讀到資料是第一寫的:證明TRIM完成後攝影關系并沒有flush到nand。這樣就是讀到老資料,顯然會verify不過。
如果讀到資料是全0:證明讀到的是trim後的資料, 如果最後一次後剛完成,就發生異常掉電,這是可能的。
如果讀到資料是最後一次寫的: 證明異常掉電前資料是寫入的flash, 這也是合理。
為了避免第一種情況發生,這裡可以引進一種機制-> TRIM BITMAP, 每個BIT表示一個映射關系是否還在(比如4K mapping, 一個4K用1給bit 表示)。
TRIM BITMAP設計的初衷是因為L2P table 太大,不可能一直重新整理,但trim之後的資料要在即使發生SPOR後也要盡量保證為no mapping,是以在TRIM時盡量在更新L2P同時去寫入TRIM BITMAP到NAND, TRIM 指令的完成要保證TRIM BITMAP已經寫入NAND。
在SPOR起來之後做replay可以參看TRIM BITMAP資訊來确定是否需要恢複相關映射關系。
THE END