天天看點

FTL——掉電恢複

本文章内容來源《深入淺出SSD 固态存儲核心技術 原理與實戰.pdf》

掉電分兩種,一種是正常掉電,另一種是異常掉電。不管是哪種原因導緻的掉電,重新上電後,SSD都需要能從掉電中恢複過來,繼續正常工作。

先說正常掉電。在掉電前,主機會通過指令通知SSD,比如SATA中的Idle Immediately, SSD收到該指令後,主要會做以下事情:

1.把buffer中緩存的使用者資料刷人閃存。

2.把映射表刷人閃存。

3.把閃存的塊資訊寫人閃存(比如目前寫的是哪個閃存塊,以及寫到閃存塊的哪些位置,哪些閃存塊已經寫過,哪些閃存塊又是無效的等)。

4.把SSD其他資訊寫人閃存。

主機等SSD處理完以上事情後,才會真正停止對SSD的供電。正常掉電不會導緻資料的丢失,重新上電後,SSD隻需把掉電前儲存的相關資訊(比如映射資料,閃存塊資訊等)重新加載,又能接着掉電前的狀态繼續工作。

所謂的異常掉電,就是SSD在沒有收到主機的掉電通知時就被斷電;或者收到主機的掉電通知,但還沒有來得及處理上面提到的那些事情,就被斷電了。異常掉電可能會導緻資料的丢失,比如緩存在SSD中的資料來不及寫到閃存,掉電導緻這部分資料丢失。還有,根據閃存特性,如果掉電發生在寫MLC的Upper page,會導緻其對應的Lower Page資料遭到破壞,也就是意味着之前寫人閃存的資料也可能由于異常掉電導緻丢失。異常掉電恢複的目的一方面是盡可能恢複使用者資料,把損失減到最低;另一方面是讓SSD經曆異常掉電後還能正常工作。

SSD為什麼怕異常掉電?

它不是用閃存做存儲媒體嗎?它不是資料掉電不丢失嗎?沒錯。不過一個SSD,除了資料掉電不丢失的閃存,還需要有掉電資料丢失的RAM, SRAM或者DRAM。閃存的作用是存儲資料,而RAM的作用主要是SSD工作時用以緩存使用者資料和存放映射表(Map Table,邏輯位址映射閃存實體位址)。是以一旦掉電,RAM的資料就會丢失。

掉電還會導緻RAM中映射表丢失。映射表資料很重要,對一個邏輯位址,如果SSD查找不到對應的實體位址,它就無法從閃存上讀取資料傳回給主機。如果映射表中的資料不是最新的,舊的實體位址對應着老的資料,SSD就會錯誤地把老資料傳回給主機,這個問題就嚴重了。

但是,和RAM中使用者資料丢失不同,RAM中映射表資料是有辦法恢複過來的。SSD的異常掉電恢複主要就是映射表的恢複重建。

那麼,如何重建映射表呢?下面介紹一種重構政策(不同的SSD重構政策略有不同,但大同小異)。SSD在把使用者資料寫到閃存的時候,會額外打包一些資料,我們叫它中繼資料( Meta Data),它記錄着該筆使用者資料的相關資訊,比如該筆資料對應的邏輯位址、資料寫人時間(時間戳)等,如圖4-43所示。

FTL——掉電恢複

是以,使用者資料在閃存中是像下面這樣存儲的(見圖4-44)

FTL——掉電恢複

以圖4-44為例,如果我們讀取實體位址Pa x,就能讀取到中繼資料x和使用者資料x,而中繼資料是有邏輯位址La x的,是以,我們就能獲得映射:La x→Pax。映射表的恢複原理其實很簡單,隻要全盤掃描整個閃存空間,就能獲得所有的映射關系,最終完成整個映射表的重構。

原理簡單,但實作起來還有一些問題需要考慮,比如如何解決資料新舊問題、重構速度問題等。

同一邏輯位址,使用者可能寫過若幹次,在閃存空間,該邏輯位址對應的資料有很多是舊資料,隻有一筆是新資料,那麼如何甄别哪些資料是舊的,哪些資料是新的呢?如何讓邏輯位址映射到最新資料所在的實體位址呢?以圖4-44為例,SSD起初把邏輯位址La 2的資料寫在實體位址Pa 2上;之後,使用者又改寫了那筆資料,SSD把它寫到了實體位址Pa 8上。我們知道,使用者最後寫人的資料總是最新的。在這裡,時間戳幫上大忙了,哪個值大,就表示哪個是最後寫人的。SSD可以依賴Meta data中的時間戳來區分新舊資料的。圖4-44中,在全盤掃描時,假設掃描順序是從實體位址Pa I到實體位址Pa x,對邏輯位址La 2來說,開始會産生映射La 2一Pa 2,但掃描到Pa 8時,發現時間戳比之前的更新,于是新的映射取代舊的映射,最後得到映射關系:La 2—>Pa 8;

全盤掃描有一個問題,就是映射表恢複很慢,所耗的時間與SSD容量成正比。現在SSD容量已達到TB級别,全盤掃描映射方式,重構映射表需要花費幾分鐘甚至幾十分鐘,這在實際使用中,使用者是不能接受的。那SSD内部是如何快速恢複映射表的呢?

一種辦法就是SSD定期把SSD中RAM的資料(包括映射表和緩存的使用者資料)和SSD相關的狀态資訊(諸如閃存塊擦寫次數、閃存塊讀次數、閃存塊其他資訊等)寫人到閃存中去,與正常掉電前SSD要做的事情類似,這個操作我們稱之為做Checkpoint(檢查點,此處譯成“快照”更合适),如圖4-45所示。

FTL——掉電恢複

假設圖4-45中,在做完快照C後,做下一個快照D之前,SSD在X處發生了異常掉電,如圖4-46所示。

FTL——掉電恢複

重上電,SSD可以從閃存中讀取到最新的快照資訊,即快照C。由于異常掉電,從快照C處到X處新産生的映射關系丢失。由于之前絕大多數的映射關系都被快照C儲存,是以需要重建的映射關系僅僅是快照C之後産生的映射關系,這部分關系的恢複,僅需掃描一些局部的實體空間,是以,相對全盤掃描,映射表重建速度大大加快。

我覺得就是提前備份的意思!!!

繼續閱讀