视频推荐
长时间运行后出现NAND或者eMMC损坏,可能的原因有物理损坏如雷击损坏,也有可能因为频繁擦写操作引起寿命到期损坏。下面就应用软件方面的可能性进行探讨,寻求延长NAND/eMMC使用寿命的方法。
闪存的寿命和计算公式
在NAND闪存中,P/E Cycle也称为擦除次数,是判断NAND闪存寿命的关键参数。随着P/E Cycle的增加,浮栅与沟道之间的氧化层被磨损的越来越严重,导致浮栅中电子的控制越来越艰难,最终结果就是:NAND的寿命走到了尽头。每颗NAND闪存,在出厂的那一刻,寿命就固定了。
我们知道,闪存在写入数据前必须先进行擦除,而擦除操作的粒度与写入操作相比低得多,执行这些操作就会多次移动(或改写)用户数据和元数据。因此,要改写数据,就需要读取闪存某些已使用的部分,更新它们,并写入到新的位置,如果新位置在之前已被使用过,还需连同先擦除;由于闪存的这种工作方式,必须擦除改写的闪存部分比新数据实际需要的大得多,这就是写入放大,此倍增效应会增加请求写入的次数。
垃圾回收,启用垃圾回收,WA会减小。
预留空间,增大预留空间,能减小WA。
顺序写入,理论上顺序写入,WA为1,当然其他因素会影响到WA。
随机写入,写入到非连续的LBA对写入放大的影响最大。零散写入会带来极大的WA影响。例如写入一个字节,实际上闪存最小写入单位是页,擦除单位是块,这样会影响到在这个块内的所有数据的搬移和写入,数据量会非常大。
数据压缩,数据压缩后再写入,能减少数据量的写入。
删除重复数据,这样能减少磁盘占用,能减小WA。
一般NAND闪存内部结构分为多个块(Block),每个块包含多个页面(page),每个页面又是由有效个数据区和spare area区(即OOB区)组成。NAND闪存以块为单位进行擦除,以页为单位进行读写。
图1所示的NAND闪存,每个页面为4096字节,一个块为64页,整个器件为2048块,总容量为4096*64*2048=512MB。
如果不清楚NAND闪存的这些具体信息,可以查看数据手册或者内核启动信息:
1. 合理分区,动静分离
动静数据分离,将数据按修改频率分组。一般可将系统分区与数据分区分开,确保系统分区不受数据写的影响。
有效地使用RAM文件系统。系统log信息,以及应用程序的log信息,不要直接写入闪存,尽量写在RAM文件系统中,仅对异常log定期写入闪存,减少闪存写入次数。
3. 避免零碎散数据写入
确保在写入数据时,数据块的大小是擦除块大小的整数倍,以避免无效的擦除操作。
不要写满分区,维持较低的磁盘占用率,能有效地提高闪存使用寿命。磁盘占用率管理分两种情况,采用系统的磁盘配额管理或者应用程序自行管理。
对于eMMC闪存,在使用Ext3/4文件系统的时候,启用磁盘配额管理,确保磁盘使用率在一个合理的范围之内。注意,启用磁盘配额管理,需要普通用户,建议产品应用程序都运行在普通用户模式,而不是root用户来运行。
对于NAND闪存,一般都会使用Yaffs/Yaffs2文件系统,支持不了磁盘配额。这种情况要想维持合理的磁盘占用率的话,可以写一个磁盘占用率监控程序,当磁盘占用率超过某个阈值,就进行磁盘清理工作,删除不重要或者陈旧的文件,以保持闪存处于比较健康的状态。
无论是NAND还是eMMC,都要定期进行数据处理,对于过期的数据要及时删除,减小无用数据在闪存使用中的搬运和写入次数。
5. 闪存健康管理
对于eMMC,可以在系统中通过mmc_erase_info文件查看eMMC的擦写次数,以判断eMMC的健康状况。一旦eMMC的擦写次数已经接近厂商理论值,就要特别留意此闪存上的数据,并做好预案处理。
对于NAND闪存,不能像eMMC这样方便的查看NAND闪存的擦写次数,则可以自行统计NAND擦写次数,并结合寿命预测公式对NAND闪存的健康状况进行大致判断。