天天看點

淺談SSD Trim(Data set management)

SSD TRIM

     TRIM 作為消費級SSD的救世神藥,也是性能起飛的催化劑,下面簡單介紹TRIM的前世今生。

一. TRIM相關背景/TRIM需要解決的問題

    TRIM由檔案系統發起,就拿FAT32檔案系統舉例, 一個檔案包括兩個部分file(檔案指針)和file data(檔案資料)。

檔案建立後如圖1:在FAT區儲存檔案的指針(512B資料),檔案資料可能分幾個段(如file data1 和 file data2)

圖1:

淺談SSD Trim(Data set management)

如圖2:  當要删除檔案時,檔案系統重新寫入檔案指針(深色的file),新的檔案指針不在指向老的file data。

圖2:

淺談SSD Trim(Data set management)

如圖3:  新的檔案指針和沒有任何聯系, 老資料因而成為垃圾資料。

圖3:

淺談SSD Trim(Data set management)

   由于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 Trim(Data set management)

   如圖比如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面對一堆堆的無用資料需要搬移, 那麼現在告訴你隻需要搬這幾個就行,是不是快樂多了,如圖:

淺談SSD Trim(Data set management)

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