写放大(Write Amplification Factor,简称WAF)是NAND Flash存储器件的一个核心参数,直接决定了芯片的实际使用寿命。很多工程师在选型时只看P/E次数(擦写次数)和容量,忽略了WAF的影响,结果实际寿命跟理论计算差了一大截。这篇就把SD NAND的WAF系数和寿命评估方法说清楚。
WAF是什么?简单讲,主机要写1MB数据,Flash内部实际写入的数据量可能不是1MB,而是1.5MB甚至更多。这个实际写入量与主机请求写入量的比值就是WAF。WAF=1是理想状态,意味着没有额外写入开销。WAF越大,Flash颗粒的实际擦写次数消耗越快,芯片寿命就越短。
为什么会产生写放大?原因有几个。首先是磨损均衡(Wear-Leveling):Flash的每个块有有限的擦写次数,控制器需要把写入操作分散到不同块上,避免某些块被过早写坏。为了实现磨损均衡,控制器可能需要在写入新数据前先把旧块中的有效数据搬移到其他块,这个搬移过程产生了额外的写入。其次是垃圾回收(Garbage Collection):当需要擦除一个块来腾出空间时,如果这个块里还有有效数据,控制器需要先把有效数据搬走再擦除,也产生额外写入。再次是ECC纠错数据的写入:每页数据都附带ECC校验码,这些校验码也占用Flash空间。最后是文件系统元数据的更新:FAT表、目录项等元数据的频繁修改也产生写放大。
WAF对不同Flash类型的影响差异很大。SLC颗粒P/E次数10万次,即便WAF=3,实际有效擦写也有3.3万次,对于大多数嵌入式应用来说寿命仍然充裕。但MLC只有5千次P/E,如果WAF=3,有效擦写就降到约1600次,在高频写入场景下可能不够用。TLC更少,所以对WAF控制的要求更高。
MK米客方德的SD NAND在WAF控制方面做了不少工作。内部控制器集成了AI算法和优化的CMD-Q设计,针对不同的写入模式(顺序写、随机写、小文件写入等)动态调整策略。在eMMC产品线中,TLC型号的WAF标称值为1.15,这个数字在同类型产品中算是控制得不错的。SD NAND虽然官方没有给出统一的WAF标称值(因为WAF跟写入模式强相关),但内部的磨损均衡算法和坏块管理策略都经过优化,在顺序写入和追加写入场景下WAF表现合理。
实际评估寿命的方法:假设使用MKDV8GIL-AST(8Gb SLC,约1GB容量),P/E次数10万次。理论总写入量(TBW)= 容量 × P/E次数 ÷ 1024 = 1GB × 100000 ÷ 1024 ≈ 97.6TB。如果WAF=2,实际可用TBW ≈ 97.6 ÷ 2 = 48.8TB。假设应用每天写入500MB,一年约182GB,那48.8TB的理论寿命约268年。当然这是理想计算,实际还要考虑温度加速老化、异常断电等因素,但即便打个很大折扣,SLC的寿命对绝大多数嵌入式应用来说都绑绑有余。
pSLC型号的评估方法类似。MKDV032GIL-SSP(32Gb pSLC,约4GB),P/E 3万次,理论TBW ≈ 4 × 30000 ÷ 1024 ≈ 117TB。WAF=2的话约58TB,每天写入1GB的话理论寿命约159年。MLC型号MKDV064GCL-STP(64Gb MLC,约8GB),P/E 5千次,理论TBW ≈ 8 × 5000 ÷ 1024 ≈ 39TB,WAF=2时约19.5TB,每天写入1GB约53年寿命。
怎么降低WAF的影响?从应用层面来说,尽量采用顺序追加写入而非随机写入,让控制器能更好地利用顺序写入的局部性。批量写入比频繁小量写入的WAF更低,因为减少了垃圾回收的触发频率。如果应用场景允许,适当对齐写入地址到页或块的边界也能帮助降低WAF。SD NAND内部已经做了这些优化工作,但应用层的写入模式配合得好,效果会更佳。
选型时建议根据实际写入量和寿命需求倒推合适的Flash类型。写入量小、寿命要求高的场景选SLC;写入量中等选pSLC;写入量大但寿命要求不高的场景可以选MLC或TLC。关键是要把WAF纳入寿命计算,不能只看P/E次数。