隨著電子設備的廣泛應用,NAND閃存和eMMC作為主流存儲介質,其使用壽命受到廣泛關注。本文將探討其損壞的軟件原因,并提供延長使用壽命的實用方法。
?前言
長時間運行后出現NAND或者eMMC損壞,可能的原因有物理損壞如雷擊損壞,也有可能因為頻繁擦寫操作引起壽命到期損壞。下面就應用軟件方面的可能性進行探討,尋求延長NAND/eMMC使用壽命的方法。
?閃存的壽命和計算公式
在NAND閃存中,P/E Cycle也稱為擦除次數,是判斷NAND閃存壽命的關鍵參數。隨著P/E Cycle的增加,浮柵與溝道之間的氧化層被磨損的越來越嚴重,導致浮柵中電子的控制越來越艱難,最終結果就是:NAND的壽命走到了盡頭。每顆NAND閃存,在出廠的那一刻,壽命就固定了。
NAND閃存根據存儲顆粒密度和結構差異,可分為SLC、MLC、TLC和QLC。存儲密度越來越高,容量越來越大,但單位可擦寫次數卻越來越少。SLC的密度最低,擦寫次數最多,使用壽命最長,但現在很少能買到了,特別是大容量閃存,基本都是MLC、TLC甚至QLC了。一般都說MLC的擦寫壽命是3000~10000次,但實際上去咨詢半導體原廠,得到的答案通常都是3000次,哪怕三星、海力士以及Skyhigh這樣的國際品牌,都是這個答案。eMMC實際上是NAND閃存加了控制器,底層存儲還是NAND閃存,所以可在此一并討論。如何延長閃存的使用壽命,確保存儲的數據可靠,是工業產品一直在試圖解決的問題。一個NAND閃存能使用多久,我們先給出一個預測公式:

對于特定的Linux系統,文件系統開銷可看成一個常數,暫時不考慮。根據公式不難看出,預期使用壽命與分區容量大小、可擦寫次數正相關,與寫入放大、每天寫入的次數以及每次寫入的數據量成負相關。在產品設計方案選型階段,容量、可擦寫次數是一個正相關變量,但對于特定的一個產品,閃存一旦選定,可擦寫次數也就定了,如果有條件擴大分區容量,也是能改善使用壽命的,但改善非常有限。要想比較有效的提高閃存壽命,必須從分母的寫入放大、每天寫入的次數以及每次寫入的數據量上面來優化。 ?寫入放大
我們知道,閃存在寫入數據前必須先進行擦除,而擦除操作的粒度與寫入操作相比低得多,執行這些操作就會多次移動(或改寫)用戶數據和元數據。因此,要改寫數據,就需要讀取閃存某些已使用的部分,更新它們,并寫入到新的位置,如果新位置在之前已被使用過,還需連同先擦除;由于閃存的這種工作方式,必須擦除改寫的閃存部分比新數據實際需要的大得多,這就是寫入放大,此倍增效應會增加請求寫入的次數。
寫入放大,簡單的計算公式如下:

影響寫入放大的因素:
垃圾回收,啟用垃圾回收,WA會減小。
預留空間,增大預留空間,能減小WA。
順序寫入,理論上順序寫入,WA為1,當然其他因素會影響到WA。
隨機寫入,寫入到非連續的LBA對寫入放大的影響最大。零散寫入會帶來極大的WA影響。例如寫入一個字節,實際上閃存最小寫入單位是頁,擦除單位是塊,這樣會影響到在這個塊內的所有數據的搬移和寫入,數據量會非常大。
數據壓縮,數據壓縮后再寫入,能減少數據量的寫入。
刪除重復數據,這樣能減少磁盤占用,能減小WA。
從公式來看,減小WA能增加閃存壽命,具體方法有啟用垃圾回收、增大預留空間、盡量順序寫入、進行數據壓縮以及刪除重復數據等。 ?如何計算數據量?
寫入NAND數據量的計算,并不是按照應用程序數據來計算的,這與NAND閃存的結構和擦寫方式緊密相關。
一般NAND閃存內部結構分為多個塊(Block),每個塊包含多個頁面(page),每個頁面又是由有效個數據區和spare area區(即OOB區)組成。NAND閃存以塊為單位進行擦除,以頁為單位進行讀寫。

圖1 NAND閃存結構示意圖
圖1所示的NAND閃存,每個頁面為4096字節,一個塊為64頁,整個器件為2048塊,總容量為4096*64*2048=512MB。
如果產品使用的NAND是這樣的結構,哪怕寫入1字節數據,在計算數據量的時候,也得按4096向上取整,即4096字節,而不是1字節。當然,寫入4095字節也是按4096向上取整,4096字節。同理,寫入4097字節數據,則向上取整為8192字節。
如果不清楚NAND閃存的這些具體信息,可以查看數據手冊或者內核啟動信息:
?改善措施
綜合上述信息,要延長NAND/eMMC的讀寫壽命,就要盡量減少對閃存的擦寫次數,特別是零散數據寫入。歸納一下,可以采取以下措施:
1. 合理分區,動靜分離
動靜數據分離,將數據按修改頻率分組。一般可將系統分區與數據分區分開,確保系統分區不受數據寫的影響。
有效地使用RAM文件系統。系統log信息,以及應用程序的log信息,不要直接寫入閃存,盡量寫在RAM文件系統中,僅對異常log定期寫入閃存,減少閃存寫入次數。
2. 減少數據寫入次數
- 先將數據寫在內存里,可以在系統中生成一個Ramdisk并掛載到某個目錄,將需要寫入到閃存的數據先暫存在這個目錄,到一定時間再寫到閃存里面去。也可以使用系統的ramfs目錄存放暫存數據。
- 將頻繁修改的數據存儲在一塊連續的區域中,并定期將數據遷移到新的區域,以避免在同一區域反復擦寫。
- 進行數據壓縮,減小寫入的數據量,特別是對于海量數據的應用,數據壓縮尤為重要。
3. 避免零碎散數據寫入
確保在寫入數據時,數據塊的大小是擦除塊大小的整數倍,以避免無效的擦除操作。
4. 維持合理的分區占用率
不要寫滿分區,維持較低的磁盤占用率,能有效地提高閃存使用壽命。磁盤占用率管理分兩種情況,采用系統的磁盤配額管理或者應用程序自行管理。
對于eMMC閃存,在使用Ext3/4文件系統的時候,啟用磁盤配額管理,確保磁盤使用率在一個合理的范圍之內。注意,啟用磁盤配額管理,需要普通用戶,建議產品應用程序都運行在普通用戶模式,而不是root用戶來運行。
對于NAND閃存,一般都會使用Yaffs/Yaffs2文件系統,支持不了磁盤配額。這種情況要想維持合理的磁盤占用率的話,可以寫一個磁盤占用率監控程序,當磁盤占用率超過某個閾值,就進行磁盤清理工作,刪除不重要或者陳舊的文件,以保持閃存處于比較健康的狀態。
無論是NAND還是eMMC,都要定期進行數據處理,對于過期的數據要及時刪除,減小無用數據在閃存使用中的搬運和寫入次數。
5. 閃存健康管理
對于eMMC,可以在系統中通過mmc_erase_info文件查看eMMC的擦寫次數,以判斷eMMC的健康狀況。一旦eMMC的擦寫次數已經接近廠商理論值,就要特別留意此閃存上的數據,并做好預案處理。

對于NAND閃存,不能像eMMC這樣方便的查看NAND閃存的擦寫次數,則可以自行統計NAND擦寫次數,并結合壽命預測公式對NAND閃存的健康狀況進行大致判斷。
6. 壞塊檢查和替換
定期進行壞塊檢測和替換,以防止使用壞塊導致的數據丟失和寫失敗。一旦發現NAND壞塊數量超過一定數值,就要對NAND整體健康做重新評估,并啟動數據安全性預案處理。
-
閃存
+關注
關注
16文章
1823瀏覽量
115413 -
NAND
+關注
關注
16文章
1706瀏覽量
137162 -
emmc
+關注
關注
7文章
223瀏覽量
53362
發布評論請先 登錄
相關推薦
Flash存儲芯片:NOR Flash、NAND Flash、UFS和eMMC的比較與解析

評論