基于用閃存為儲存的固態(tài)硬盤(Solid State Drive,SSD),與基于用磁性盤片為儲存的傳統(tǒng)硬盤(Hard Disk Drive,HDD)相比較,固態(tài)硬盤具有:(1)無噪音(2)耐震動(3)數(shù)據(jù)讀寫速度快(4)低耗電等等的優(yōu)勢。又隨著各家閃存制造商陸續(xù)推出更多更便宜且高容量的閃存內(nèi)存,在未來傳統(tǒng)硬盤被固態(tài)硬盤所取代將是趨勢。
然因閃存內(nèi)存不像磁性盤片具有可重復覆寫的好處,因此固態(tài)硬盤裝置內(nèi)都需要執(zhí)行一個所謂的FTL(Flash Translation Layer)程序,以維持隨時都有閑置的區(qū)塊(free blocks)可以儲存新寫入的數(shù)據(jù)。而在一個閑置區(qū)塊被用于儲存客戶端的寫入數(shù)據(jù)時,又必須檢查閑置區(qū)塊數(shù)量是否足夠。如果不足,則又需要進行所謂的垃圾回收(Garbage Collection,GC)讓閑置區(qū)塊個數(shù),得以足夠以應付未來從客戶端寫入的新數(shù)據(jù)。
我們知道,較早期的計算機文件系統(tǒng)(File System)對于被刪除的文件之處理,僅僅在文件配制表(File Allocation Table)上,將被刪除文件所使用的叢集(cluster),標示成「未使用狀態(tài)」,這些叢集所相對應的邏輯區(qū)塊地址(Logic Block Address,LBA)上所儲存之數(shù)據(jù)并未被移除,這樣的操作方式對可重復覆寫的傳統(tǒng)硬盤而言是合理適當?shù)?,但對不可重復覆寫固態(tài)硬盤而言卻是不適當?shù)?,而且會需要垃圾回收之處理。因此在較新ATAPI(ATA Packet Interface)命令規(guī)范標準,或是NVMe(NVM express)規(guī)范標準里,都加入了數(shù)據(jù)集管理(Dataset Management)命令,讓較先進的計算機文件系統(tǒng),可以對固態(tài)硬盤下達「將某些邏輯區(qū)塊地址上的數(shù)據(jù)丟棄」,以減少固態(tài)硬盤垃圾回收的處理。不但如此,數(shù)據(jù)集管理命令也降低了固態(tài)硬盤的寫入放大值(Write Amplification Index),使得固態(tài)硬盤的使用壽命得以延長。
然則,數(shù)據(jù)集管理命令為固態(tài)硬盤帶來了好處,但也帶來了不易被察覺的嚴重問題-邏輯物理塊映射表不正確!底下讓我們來描述邏輯物理塊映射表不正確的問題,是如何發(fā)生及問題發(fā)生時的癥狀。
為了簡化問題的描述,我們假設
1 一個物理塊區(qū)塊擁有4個頁面
2 邏輯區(qū)塊地址(LBA)和物理區(qū)塊地址(PBA)的映射表,內(nèi)容為一個數(shù)對,分別代表物理區(qū)塊碼(block number)與頁碼(page number),數(shù)對(0,0)則代表無數(shù)據(jù)
3 固態(tài)硬盤有16個邏輯區(qū)塊地址
因為閃存內(nèi)存不具有「重復覆寫」的特性,一個邏輯區(qū)塊地址的數(shù)據(jù),存放在閃存內(nèi)存的哪個位置是不固定的,因此固態(tài)硬盤里,皆存在著邏輯物理映射表(L2P Table)。這個映像表的功能,是讓FTL程序查出某個邏輯區(qū)塊地址之數(shù)據(jù)被儲存在閃存的哪個位置(包含閃存物理區(qū)塊碼(block number)、頁碼(page number)、偏移量(offset)等)。這一個映像表需要儲存一份在閃存內(nèi)存里,讓固態(tài)硬盤在斷電后再次供電運作時,才能得知最新數(shù)據(jù)在哪里。對讀寫速度要求高的固態(tài)硬盤,會配置足夠的動態(tài)隨機存取內(nèi)存(Dynamic Random Access Memory,DRAM)存放這個映像表,讓FTL程序可以更快速查詢或更新映射表。因此固態(tài)硬盤在開始供電當下,會將儲存在閃存內(nèi)存里的邏輯物理映射表讀到DRAM,如 Fig. 1 所示。(圖中,頁面標示為FFFFFFFF代表此頁面處于抹除狀態(tài);頁面標示為XXXXXXXX代表此頁面曾經(jīng)被寫入數(shù)據(jù)但事后被其他實體地址數(shù)據(jù)所取代或被數(shù)據(jù)集管理指令所丟棄而成為無效數(shù)據(jù))
接下來,客戶端刪除文件,下達了數(shù)據(jù)集管理指令給固態(tài)硬盤,指示將 LBA1~2的數(shù)據(jù)刪除,并且又下了寫LBA13的指令。一般做法,固態(tài)硬盤將會執(zhí)行下列步驟(Fig. 2、Fig. 3 圖示說明):
1. 將LBA1、2 在映射表 (DRAM) 里更新為 (0,0)
2. 要求一個閑置的物理塊區(qū)塊,假設取物理區(qū)塊4, 將LBA13的數(shù)據(jù)寫入物理塊區(qū)4,更新LBA13的邏輯物理塊映像表格。
3. 發(fā)現(xiàn)閑置的物理塊區(qū)塊個數(shù)不足(少于3),啟動垃圾回收,將物理區(qū)塊3上的有效數(shù)據(jù)(LBA3 數(shù)據(jù))寫至物理區(qū)塊4,更新LBA3的邏輯物理塊映像表格,并將物理區(qū)塊3 回收為閑置塊(Free Block)。
如果在固態(tài)硬盤執(zhí)行垃圾回收之后,計算機系統(tǒng)出現(xiàn)不穩(wěn)狀況突然間失去電源供應,固態(tài)硬盤將在下次電源恢復時,執(zhí)行下列步驟(Fig. 4、Fig. 5 圖式說明):
1. 將儲存在閃存內(nèi)存里的邏輯物理塊映射表讀到DRAM。
2. 讀取區(qū)塊4每一頁面內(nèi)容,并根據(jù)頁面內(nèi)容所紀錄對應的邏輯區(qū)塊地址,更改DRAM上的邏輯物理塊映射表。
比較 Fig. 5 與Fig. 3 映射表(DRAM) 的內(nèi)容會發(fā)現(xiàn),邏輯區(qū)塊地址1、2上的物理塊對應地址有差異。也就是邏輯物理塊映射表的正確性以經(jīng)有錯誤了(Fig. 5標示為紅色部分)!
Fig. 5 的邏輯物理塊映射表顯示,邏輯區(qū)塊地址1、2數(shù)據(jù)存在于物理塊區(qū)塊3。實際上物理區(qū)塊3已經(jīng)是一個閑置區(qū)塊,不存在任何數(shù)據(jù)。這樣子的錯誤映像對FTL程序而言是一種嚴重的錯誤。事后,如果固態(tài)硬盤繼續(xù)使用下去,當別的邏輯區(qū)塊數(shù)據(jù)寫入物理區(qū)塊3之后,讀取邏輯區(qū)塊地址1、2會讀到別的邏輯區(qū)塊地址之數(shù)據(jù)。隨著時間的經(jīng)過,不同時間讀又會有不同數(shù)據(jù)寫入物理區(qū)塊3,讀取邏輯區(qū)塊地址1、2數(shù)據(jù)還會隨著時間的不同而改變?;蛟S讀者會問,既然邏輯區(qū)塊地址1、2的數(shù)據(jù)已經(jīng)被客戶端下達數(shù)據(jù)集管理指令刪除了,讀到甚么數(shù)據(jù)并不重要。但讀者要知道,一個儲存裝置必須要有數(shù)據(jù)完整(data integrity)的特性,讀取的數(shù)據(jù)如果會隨著時間的變動而變動,該裝置就稱不上擁有數(shù)據(jù)完整的特性。讀者也許還會續(xù)問,既然邏輯區(qū)塊地址1、2的數(shù)據(jù)已經(jīng)被客戶端下達數(shù)據(jù)集管理指令給刪除了,客戶端就不會再去讀取這些地址的數(shù)據(jù)了。要知道,客戶端系統(tǒng)不勝枚舉,客戶端的程序不會再去讀取這些地址的數(shù)據(jù)是無法保證的。例如儲存裝置被用于組成獨立硬盤冗余陣列(Redundant Array of Independent Disks, RAID),其中一個硬盤發(fā)生了我們所描述的問題,這些被數(shù)據(jù)集管理指令刪除的數(shù)據(jù)就會被讀取.
邏輯物理塊映射表與數(shù)據(jù)的一致性一直都是固態(tài)硬盤設計上存在的問題。市場上充斥著成千成百的固態(tài)硬盤產(chǎn)品,對那些不曾思考過這個問題的設計商,質(zhì)量堪憂。一般的固態(tài)硬盤買家多以訪問速度快慢做為購買的考慮因素。但聰明的讀者在選購固態(tài)硬盤時應該花點時間了解該產(chǎn)品的設計商,是否如大心電子,有固態(tài)硬盤領先的技術質(zhì)量。
-
閃存
+關注
關注
16文章
1771瀏覽量
114768 -
固態(tài)硬盤
+關注
關注
12文章
1444瀏覽量
57222
原文標題:一種引發(fā)固態(tài)硬盤映射表不正確的情境
文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論