全面理解SSD和NAND Flash
Flash Memory又叫做閃存,是一種非易失性存儲器。非易失性是指斷電之后數據不會丟失,這里就涉及到斷電保護(后面詳細講解)。
總體思路
1.NAND Flash的用途。
2.NAND Flash規則介紹。
3.SSD固件(Firmware,FW)包括:映射表(Mapping Table)、垃圾回收(Garbage Collection)、磨損平衡(Wear Leveling,WL)等。
4.補充概念:寫入放大(Write Application)、預留空間(Over Provisioning)、Flash壽命(Program/Erase Count,P/E)等。
5.斷電保護機制。
6.對SSD的評價標準:穩定性、性能、壽命。
1、NAND Flash的用途
HDD是指機械硬盤,是傳統普通的硬盤,包括:盤片、磁頭、磁盤旋轉軸及控制電機、磁頭控制器、數據轉接器、接口、緩存。
SDD(Solid State Drives)是固態硬盤,包括:控制單元、存儲單元(DRAM芯片/FLASH芯片)。
區別:HDD是機械式尋找數據,所以防震遠低于SSD,數據尋找時間也遠低于SSD。SSD(左圖)和HDD(右圖)的模樣區別如下:
(圖片來自百度)
Flash又分NAND Flash和NOR Flash:NOR型存儲內容以編碼為主,其功能多與運算相關;NAND型主要功能是存儲資料,如數碼相機中所用的記憶卡。
現在大部分的SSD都是用來存儲不易丟失的資料,所以SSD存儲單元會選擇NAND Flash芯片。這里我們講的就是SSD中的NAND Flash芯片。
2、NAND Flash的規則
(1)Flash都不支持覆蓋,即寫入操作只能在空或已擦除的單元內進行。
更改數據時,將整頁拷貝到緩存(Cache)中修改對應頁,再把更改后的數據挪到新的頁中保存,將原來位置的頁標記為無效頁;
指定在已有無效數據的位置寫入時,需要先擦除無效頁才能在該位置寫入新數據。
(2)以page為單位寫入,以Block為單位擦除;擦除Block前需要先對里面的有效頁進行搬遷。
(3)每個Block都有擦除次數限制(有壽命),擦除次數過多會成為壞塊(bad block)。
3、SSD固件內容
(1)映射表 Mapping Table
邏輯地址:用戶程序中使用的相對地址;
物理地址:實際存儲單元的絕對地址;
所以,映射表里面存儲的內容是邏輯地址到物理地址的映射信息,利用邏輯地址查詢映射表,找到對應的物理地址,再對實際存儲單元做讀寫訪問。
SSD內部就維護了一張映射表;一般SSD內部會板載DRAM,用于存儲程序運行的臨時數據,斷電會丟失;映射表存放在SDRAM中(方便快速訪問),同時NAND Flash中會存儲幾份映射表(防止斷電后映射關系丟失),而且會定期對NAND Flash中的映射便進行更新。
(2)垃圾回收 Garbage Collection
垃圾回收就是把幾個Block中的有效數據集中搬移到新的Block上去, 然后再把這幾個Block擦除掉。
垃圾回收機制有很多,都是根據不同的側重點提出的,所以沒有***的算法,就像伴侶一樣只有適不適合之說。如:Greedy算法,每次選擇包含最少有效頁的Block來回收,也就是對垃圾的貪心,每次盡可能回收最多的垃圾。還有Cost-Benefit算法(考慮Block的擦除次數)、Cat回收算法、CICL算法等。
另外有兩種回收策略:
被動回收策略:當有寫入請求的時候,首先判斷當前可用空間大小與臨界值大小的比較;如果空間足夠,直接寫入空閑空間;如果空間不夠了,首先啟用垃圾回收,再往空閑區域完成寫入請求。
不足之處:當空間不夠的時候寫請求會被延遲。
主動回收策略:通過固件設定周期性任務,定時檢查可用空間大小,如果需要就執行垃圾回收。
巧妙之處:利用空閑時間提前進行垃圾回收,避免對請求造成不必要的延時。
不足之處:倘若系統一直沒有空閑時間,垃圾回收依舊無法有效執行。
(3)磨損平衡 Wear Leveling
每個Block都是有壽命(Program/Erase Count,P/E值)的,他們的擦除次數是有限的。NAND Flash的壽命類似“木桶原理”,取決于所有Block中的最小壽命。如果拼命對某一塊進行擦除,NAND Flash的壽命將會被縮減到最小。所以引入了磨損平衡,平衡所有Block的擦除次數。
有很多不同的磨損平衡機制,大體可以分為兩大類:動態WL、靜態WL。
動態WL:使用Block進行擦寫時,優先挑選P/E值低的Block。
動態WL:把P/E值低的Block中的數據挪到P/E值高的Block中存放。
4、補充概念
(1)寫入放大 Write Application
寫入放大倍數 = 閃存寫入數據量 / 主控寫入數據量 = 實際寫入數據量 / 要求寫入數據量
例如,現在有一個寫入一頁的請求;即主控寫入數據量為1;
然而這個一頁請求觸發了垃圾回收,當前的寫請求會被延遲,直到垃圾回收完畢后再執行寫入操作;
如果垃圾回收只挪了5頁有效數據,那么實際的寫入量應該為6頁(1頁寫請求,5頁挪動);即閃存寫入數據量為5;
所以寫放大為5/1 = 5。
理想的寫放大為1,但是Sandforce的數據寫入時會進行壓縮寫入,***情況下,寫放大可以為0.5,打破了Intel的“寫放大不可能小于1”之說。
(2)預留空間 Over Provisioning
通過垃圾回收的過程,不難知道,垃圾回收的前提是要提供空閑區域來拷貝,如果連空閑區域都沒有,垃圾回收將無法執行,這時將不再支持任何數據的寫入。為了避免這種情況的發生,提出了預留空間。
預留空間不僅僅只是用來保證垃圾回收的正常完成,還存儲著SSD內部的系統數據(包括:出廠壞塊信息、SSD固件、Mapping Table等)。
所以如果說明存儲大小為256GB,實際上的存儲空間可能只有238GB(一般預留空間為7%)。
另外,OP越大,垃圾回收就會越快,相應寫放大會變小,所以讀寫性能就會越好;但用戶能使用的空間會被縮小。
(3)Flash壽命 Program/Erase Count
前面也已經提及到了,每個Block都是有擦除次數限制的,所以引入了壽命這個說法。
5、斷電保護機制
中控里板載的SDRAM是非易失性存儲器,斷電之后數據會丟失,這個時候SDRAM中的數據主要包括:用戶數據、映射表;
如果沒有斷電保護機制,再次上電時,先去NAND Flash中找上次更新時的映射表,這時拿到的信息并不是***的,是上次更新NAND Flash中映射表時的數據信息,所以發生了大部分數據丟失。
因此SSD板上會加上鉭電容或者超級電容,當檢測到非法斷電時,首先停止數據操作,鉭電容或超級電容開始放電,以保證SDRAM中的數據能夠寫入到NAND Flash中。
至于是用鉭電容還是超級電容,得看具體要保護的數據量;不是電容的容量越大越好,因為只要電容開始放電,就要等待它的電放完之后才可以進行其他操作。假如電容容量過大,用戶只是點了個電腦重啟,這時候SSD的電容會開始放電,放電還沒完成的時候,電腦已經重新上電,這時無法認盤。所以電容電量應該選最時候的。
基于SDRAM中的內容,斷電保護機制主要分為3種:
(1)保存SDRAM中所有數據
再次上電后,相當于斷電前的操作被中斷,重新上電后就可立馬進入待命狀態。
(2)只保存SDRAM中的用戶數據
再次上電后,需要先把上次NAND Flash中保存的映射表提取到SDRAM中,再將保存的用戶數據提取出來,兩者結合更新映射信息,更新完之后才進入待命狀態。
(3)只保存SDRAM中的映射表
再次上電后,需要先把上次NAND Flash中保存的映射表提取到SDRAM中,只是丟掉了用戶斷電前正在操作的數據,無法更新。
6、SSD的評價標準
(1)穩定性:SSD是否穩定,***的影響因素是垃圾回收機制的選擇,恰當的垃圾回收可以提供穩定的讀寫速率;例如主動垃圾回收機制,在空閑的時候做垃圾回收,讀寫速度不會因為延時而波動不定。
(2)性能:預留空間的大小主要決定了SSD的性能,OP大,垃圾回收快,相應寫放大小,讀寫性能就越好。
(3)壽命:所有Block的P/E值越趨近于均衡,SSD的壽命就越趨近于***。