Nandflash的磨损均衡(wear-leveling)

1. 磨损均衡的重要性

磨损均衡的目的是防止一些块过早的坏掉,从而降低容易。尽量将擦除操作平均分配到不同的块上去,从而让他们几乎同时走到寿命的尽头。

通常闪存是通过文件系统去管理的,而文件系统对存储介质的容量是有要求的。比如说一个4GB的文件系统,加上一些文件元数据,可能要求存储介质的容量最近是4.1GB。如果恰巧你的SSD中某些快速坏掉,则可能造成SSD的容量不足,这时文件系统就会损坏,无法提供正常的读写。

比如说你闪存设备有4096个块,文件系统做小一些,支持2.5%的坏块依然能满足容量要求。你有3个各占50个块的文件,十分钟更新一次。如果你的磨损均衡做得不好,使得擦除操作一直局限在200个块里面,则一年之后,这200个块可能就都坏掉了。这时你的实际存储空间坏掉了5%。随然其他块还没有使用过,你的文件系统却不能正常工作了。

2. 磨损均衡的基本方法

磨损均衡通常是在SSD控制器上做的。CPU发过来的块地址称为逻辑块地址(LBA, logical block address),SSD控制器里有一个块翻译表,将逻辑块地址翻译成物理块地址(PBA, physical block address)。

2.1 静态磨损均衡和动态磨损均衡

系统中的数据分为静态数据和动态数据,也叫冷数据和热数据。比如说操作系统镜像通常一次写入后再就不会修改,这部分数据就是静态数据(冷数据),则一个word文档可能要不停的修改,就是动态数据(热数据)。

动态磨损均衡仅会对动态数据做磨损均衡,主要思想是主控芯片在收到新的写入请求、需要擦除时,会优先选择"较新(lowest erase count)"的没有数据的闪存块进行擦除写入,不动静态数据。

这种方式的优点在于,算法简单粗暴,主控处理压力小,占据的资源小,而缺点就很明显,算法太过一刀切,优化不够,精细化程度不够导致无法全面覆盖和实现所有颗粒的磨损均衡。

静态磨损需要判断数据的冷热,就是主控芯片在执行擦除写入的命令时,从文件的角度出发,优先把长久不用的冷数据从较新的闪存颗粒中提出来,放入较老的闪存颗粒中,并将写入的新数据放在较新的闪存颗粒中,以实现均衡化。

这样的方式优点也很明显,算法更加优化,从数据角度出发更全面的实现了磨损均衡,并提高了颗粒的寿命,而缺点在于算法的复杂,给主控带了相当的压力,因为写数据时可能涉及冷数据的搬移而增加写延迟从而占有了更多的读写资源,并影响部分写入速度。

2.2 静态磨损均衡和大智慧

业界研究的磨损均衡方法通常是动态磨损均衡。动态磨损均衡有很多种方法,并且还持续有新的方法提出。

传统的磨损均衡是内置在SSD的控制器里面的,它的磨损均衡算法可以维持一个SSD内部存储空间的磨损均衡。

一些互联网公司则希望把磨损均衡做到数据中心级。以数据中断为单位来划分冷热数据,从而可以做到更好的静态磨损均衡。他们称这种方式为大智慧。

业界研究的磨损均衡方法通常是动态磨损均衡。动态磨损均衡有很多种方法,并且还持续有新的方法提出。

3. 参考资料

1. Wear-Leveling Techniques in NAND Flash Devices