磨损均衡(Wear Leveling)是 NAND Flash 存储中的寿命管理机制,通过把写入和擦除分散到不同物理 block,避免少数 block 被频繁擦写而提前失效。
在 eMMC、UFS 和 SSD 中,磨损均衡通常由 闪存控制器 和 FTL(闪存转换层) 自动完成。
核心问题
NAND block 的 Program/Erase cycle 有上限。文件系统层面看起来只是反复更新日志、数据库或配置文件,但如果这些逻辑地址总是落到同一批物理 block,那些 block 会比其他区域更快老化。
磨损均衡要解决:
- 热数据反复更新导致局部 block 过度磨损。
- 冷数据长期不动,占住低磨损 block。
- 空闲 block 池需要同时满足性能和寿命目标。
- 坏块增长后仍要维持可用容量和可靠性。
核心对象
| 对象 | 含义 | 工程关注点 |
|---|---|---|
| erase count | 某个 block 被擦除的次数 | 寿命估计和搬迁决策 |
| hot data | 经常更新的数据 | 日志、数据库、状态文件 |
| cold data | 长期不变的数据 | 系统镜像、只读资源 |
| static wear leveling | 静态磨损均衡 | 偶尔搬迁冷数据,让低磨损块参与使用 |
| dynamic wear leveling | 动态磨损均衡 | 新写入尽量选择低磨损空闲块 |
| over-provisioning | 预留空间 | 给控制器做搬迁、垃圾回收和替换 |
核心机制
动态磨损均衡的直觉是:
choose block with low erase_count from free_block_pool
write new data there静态磨损均衡还会处理长期不动的数据:
if cold_block.erase_count is much lower than average:
move cold data to a more worn block
free the low-wear block for future hot writeserase_count是 block 的擦除次数。free_block_pool是控制器可选择的空闲 block 集合。cold data搬迁看似多余,但能让低磨损 block 重新进入可写池,避免热写集中在少数块上。
这不是简单平均分配,因为控制器还要同时考虑性能、坏块、数据冷热、垃圾回收成本和掉电一致性。
工程用途
- 延长 eMMC/UFS/SSD 的可用寿命。
- 缓解日志、数据库、OTA 状态分区等高频写区域的局部磨损。
- 配合只读 RootFS、独立数据分区、日志限额和 tmpfs 策略降低写压力。
- 通过设备寿命字段判断是否接近磨损风险。
嵌入式系统中,常见做法是减少无意义日志写入、给数据分区保留余量、避免长期满盘运行,并把高频临时数据放到 RAM 或专用分区。
边界与常见坑
- 磨损均衡不能消除寿命限制:它只能分散磨损,不能让 NAND 无限写。
- 满盘会削弱磨损均衡:空闲块不足时,控制器选择空间变少,写放大增加。
- 小随机写更伤寿命和延迟:会触发更多映射更新和垃圾回收。
- 只读系统也可能有写入热点:日志、时间同步、数据库、OTA 标记和崩溃转储都可能持续写。
- 寿命字段通常是粗粒度估计:不能把它当作精确倒计时。