上一篇讲磨损均衡解决"热点块早衰",这篇往深里拆:动态均衡和静态均衡到底各管什么、什么时候触发、搬数据的开销怎么控制,以及主机侧的写入习惯会怎么影响实际寿命。最后给一个工程上能直接套用的寿命估算示例。
一、动态均衡:写入路径上的"顺手挑选"
动态均衡嵌在正常写入流程里,不额外发起搬移。主机写数据时,控制器从空闲块池分配块,分配策略不是先到先得,而是优先选擦写次数(EC)最低的块。新数据天然落在年轻块上,老块等年轻块用完一轮才有机会被再次分配。
它的优点是零额外搬运开销——数据本来就要写,只是换个落脚点,不产生写放大。局限也很明显:只管得到流动中的数据。块一旦被写入冷数据并长期占用,就退出了空闲池,动态均衡再也碰不到它。只用动态均衡的方案,跑久了会出现明显两极分化:热块EC一路走高,冷块EC原地踏步。
二、静态均衡:主动给沉睡块"换岗"
静态均衡是后台的主动搬运。控制器周期性统计全盘EC分布,当发现最低EC块和最高EC块的差距超过设定阈值(不同厂商策略不同,通常按差值百分比或绝对次数触发),就启动一次搬移:把冷数据从EC最低的块读出,写入EC较高的块,更新映射表,再把腾空的低EC块擦除放回空闲池。
搬数据要擦要写,本身消耗P/E次数,所以阈值不能太激进——搬得太勤,搬移本身就把寿命折掉了。工程上阈值普遍设得比较保守,触发频率低,且多安排在总线空闲时搭GC的便车执行:GC本来就要搬有效数据,静态均衡把目标冷块混进回收批次,额外代价主要是一次读和一次写,摊到长期运行里占比很小。典型嵌入式场景下,这类后台搬移带来的写放大通常在1.1倍上下,换来的是全盘EC拉平,这笔账划算。
三、主机写入习惯:同样的颗粒,不同的寿命
均衡算法再强,也架不住写入模式太极端。顺序整块写入对均衡友好:数据大片流动,动态均衡每次都能拿到完整块,块与块轮换自然均匀。随机小写是另一回事:日志频繁追加删改、小文件反复覆盖,数据在块之间来回倒腾,写放大(实际写入闪存的数据量与主机写入量之比)明显升高,落到颗粒上的擦写量跟着水涨船高。
FAT/FAT32文件系统有个典型热点:FAT表。文件的增删改都要改写FAT链,表所在的逻辑扇区被反复擦写,属于常年高温的热点区;根目录、频繁更新的配置文件同理。应用层能做的优化包括:日志采用追加写加整段删除的模式,让无效数据成片出现,既方便GC回收,也让块整片整片轮换;热点小文件尽量合并、减少元数据改写频率。米客方德SD NAND的控制器固件对小文件随机写入场景做了CMD-Q命令队列优化,但写放大的根本仍取决于主机写入模式——应用层少做随机覆盖,比什么算法都管用,写放大越接近1,实际寿命越接近颗粒标称值。
四、一个工程化寿命估算示例
拿一颗512MB(4Gb)的SLC型SD NAND算笔账。SLC单块P/E为10万次,整盘物理块全部用满一轮,累计写入量约等于物理容量乘以10万次,即约50TB写入总量(TBW,总写入字节),再考虑OP和写放大余量打个折。
假设设备每天写入日志和数据500MB,一年约183GB。有磨损均衡时,写入均匀摊到全盘,理论寿命约50000GB除以183GB,超过270年——理论值而已,实际受数据保持力等约束,工业产品按10年服役期算,写入余量仍然非常充裕。反过来看没有均衡的极端情况:若50MB日志长期集中在约十分之一的块上,这批块每天承受的擦写量是全盘平均的10倍,等效寿命缩到约27年;热点再集中些、日写入量再大些,缩到几年甚至更短都不奇怪。这就是均衡的价值量级:它不改变颗粒的P/E总数,但能避免几十分之一的块提前把额度花光。
实际项目里,比估算更可靠的做法是直接读芯片状态。米客方德MKDV系列SD NAND提供Smart Function,主机可以读出累计写入量、坏块数、剩余寿命、掉电次数,把累计写入量对照颗粒TBW能力,剩余寿命百分比一目了然;工业级SLC型号工作在-40℃到85℃宽温,设计余量足以覆盖五到八年的产品周期。静态均衡在后台把冷块唤醒轮换,主机侧看到的就是剩余寿命曲线平稳下降,而不是某一天热点块突然集体报废。
动态均衡在写入路径上顺手挑年轻块,零开销但管不到冷数据;静态均衡在后台定期搬冷数据,阈值保守、开销可控,负责把沉睡块拉回轮换。两者一主一辅,再加上主机侧合理的写入习惯,才构成完整的磨损均衡。寿命这道题,颗粒给的是基数,算法决定系数,而写入模式决定实际能兑现多少。
225