try ai
科普
编辑
分享
反馈
  • 磨损均衡:延长闪存寿命

磨损均衡:延长闪存寿命

SciencePedia玻尔百科
核心要点
  • 磨损均衡是一种将写入操作均匀分布到所有闪存单元的技术,以避免过早失效并最大化存储设备的寿命。
  • 闪存转换层 (FTL) 是一个关键的控制器组件,它通过透明地将来自操作系统的逻辑地址映射到闪存芯片上的不同物理位置来管理磨损均衡。
  • 写入放大,即物理写入量与主机写入量之比,是衡量 SSD 耐用性的一个关键指标;它通过高效的垃圾回收和预留空间等技术进行管理。
  • 动态磨损均衡是一种高级策略,它会移动“冷”数据(很少修改的数据),以确保整个驱动器的容量都用于吸收写入,从而在实际工作负载下极大地提高使用寿命。

引言

现代数字存储,从您笔记本电脑中的 SSD 到手机中的存储器,都依赖于一种具有潜在脆弱性的技术:闪存单元会磨损。每个单元在失效前只能被写入和擦除有限的次数。这种有限的耐久性提出了一个根本性挑战——我们如何用一种本质上脆弱的介质构建可靠、长寿命的设备?本文旨在通过探讨名为“磨损均衡”的巧妙解决方案来填补这一知识空白。这是一个关于智能算法和巧妙系统设计协同工作,共同创造出完美、不知疲倦的存储器错觉的故事。

接下来的章节将引导您从微观走向宏观。在“原理与机制”中,我们将剖析磨损均衡背后的核心概念,从闪存转换层 (FTL) 的作用到写入放大的挑战以及用于应对它的策略。然后,在“应用与跨学科联系”中,我们将看到这一基本原理如何远远超出一个芯片的范畴,影响文件系统、RAID 陣列的设计,甚至我们处理数据安全的方式,揭示了磨损均衡作为现代计算中一种统一的理念。

原理与机制

要理解现代存储背后的魔力,我们必须首先认识到其构建材料本身的一个根本性、或许令人惊讶的限制。这是一个关于不完美、巧妙欺骗以及效率之美妙数学的故事。

数字抄写员渐逝的记忆

想象你有一张纸和一支带橡皮擦的铅筆。你可以写点东西,擦掉,然后再写。但你不能永远这样做。每一次擦除,纸张纤维都会变弱,橡皮擦也会磨损。最终,纸会撕裂,或者铅笔印记变得无法擦除。闪存,即固态硬盘 (SSD)、U盘和智能手机内部的技术,其行为方式与此惊人地相似。

闪存芯片中的每个微小单元,以一包俘获电子的形式存储一位信息,只能被写入和擦除有限的次数。这个限制是一种基本的物理属性,称为​​耐久性​​,通常在数据手册中以数千或数万次​​编程/擦除 (P/E) 周期​​来规定。一旦一个单元超过其耐久性极限,它就会变得不可靠;它再也无法被信任来保存您的数据。

考虑一个简单的数据记录器,设计用于每30分钟将传感器读数记录到一个非易失性存储芯片中。如果设备天真地每次都写入完全相同的位置,那么该位置的命运就已经注定了。对于一个耐久性为 120,000 次周期的芯片,那个单一的位置将在大约 6.8 年后磨损殆尽。这听起来可能挺长,但如果数据每分钟记录一次呢?寿命将骤降至仅几个月。

但是,如果我们有更多的空间呢?如果我们不只有一个位置,而有一整页可以书写呢?在问题中的场景里,系统有一个 4 千字节的块,可以容纳 256 个单独的日志条目。控制器不是覆盖同一个位置,而是先写入第一个条目,然后是第二个,依此类推,直到所有 256 个位置都填满后才返回第一个。现在,每个位置每 256×30256 \times 30256×30 分钟才被写入一次。这个简单的分散工作的方式将设备的寿命乘以 256 倍,将其从几年延长到理论上超过 1700 年的寿命!这,以其最基本的形式,就是​​磨损均衡​​的原理:将写入操作均匀分布到物理内存中,以避免任何单个部分过早磨损。

智能欺骗的艺术:闪存转换层

这个简单的策略立即引发一个问题。您的计算机操作系统 (OS) 并非设计成一个游牧的抄写员,为每次写入去寻找一块新的内存区域。它像一个有着严格卡片目录的图书管理员一样运作,期望数据位于一个固定的逻辑地址,就像书架上一本特定的书。如果它将文件写入“地址123”,它期望回来时能在“地址123”找到它。我们如何调和操作系统对稳定地址的需求与内存对游牧式写入的物理需求呢?

答案是一种被称为​​闪存转换层 (FTL)​​ 的工程欺骗杰作。FTL 是运行在 SSD 内部专用处理器上的复杂软件。它在操作系统的逻辑世界和闪存芯片的物理世界之间扮演着一个狡猾的翻译官。当操作系统命令“将此数据写入逻辑地址123”时,FTL 会拦截该请求。它会查阅自己的记录并说:“啊哈!一个对地址123的写入请求。我上次为它使用的物理块已经被写入了500次。但这边,我有一个只用了两次的新块。我会把新数据写入那个新块,然后更新我的映射表,记住逻辑地址123现在指向这个新的物理位置。”

这种​​逻辑到物理地址映射​​是所有现代闪存存储的核心机制。FTL 维护着一个庞大且不断更新的映射表,这本质上是驱动器的秘密知识。然而,这种智能并非没有代价。映射表本身必须存储在某个地方,而寻找磨损最少的块的逻辑需要处理能力和專用的数字电路,例如用于跟踪地址和擦除次数的寄存器。在某些情况下,系统设计的优雅体现在美妙的权衡之中。例如,如果用于磨损均衡的管理数据(如映射表本身)也会导致磨損,那么最优设计通常是能够完美平衡写入用户数据造成的磨损和写入管理元数据造成的磨损的设计。

更新的暴政:写入放大

FTL 的工作因闪存的另一个深层怪癖而变得复杂:你不能简单地擦除单个字节。要擦除数据,你必须清除一个更大的区域,称为​​擦除块​​。一个块可能包含数百个独立的页,而页是你能写入的最小单位。

这带来了一个重大挑战。想象一个块包含 256 个页,都充满了有效数据。现在,操作系统只想更新其中一个页的内容。由于 FTL 无法只擦除并重寫那一个页,它必须执行一次​​异地写入​​。它将该页的更新版本写入另一个块中一个全新的空页。旧块中的原始页随后被标记为“陈旧”或无效。

随着时间的推移,块会变成有效数据和陈旧数据混杂的混乱棋盘。为了回收陈旧页占用的空间,FTL 必须执行一种称为​​垃圾回收​​的操作。它会识别出一个陈旧页比例很高的块,小心翼翼地将剩下为数不多的有效页复制到一个新块中,然后,最后,擦除整个旧块,使其可用于未来的写入。

注意这里发生了什么:为了完成一个来自主机的写入请求,驱动器必须执行额外的内部写入来复制有效数据。这种现象被称为​​写入放大 (WA)​​。它被定义为物理写入闪存的总数据量与主机最初请求写入的数据量之比。

WA=写入闪存的总字节数主机写入的总字节数WA = \frac{\text{写入闪存的总字节数}}{\text{主机写入的总字节数}}WA=主机写入的总字节数写入闪存的总字节数​

WA=2.0WA=2.0WA=2.0 的写入放大意味着您每保存 1GB 的数据,SSD 精密的闪存单元实际上就要承受 2GB 的写入操作。由于耐久性是有限的,写入放大是 SSD 寿命的克星。最小化它是 FTL 最关键的任务。

以 TB 计的寿命:耐用性的宏大方程

我们现在可以将这些概念组合成一个单一、优雅的方程,它决定了 SSD 的寿命。从用户的角度来看,驱动器的耐用性通常以​​写入太字节 (TBW)​​ 来衡量——即在驱动器预计变得不可靠之前,用户可以向其写入的总数据量。该值取决于三大支柱:

  1. ​​总物理容量 (CCC):​​ 可用的闪存总量。更大的容量允许磨损更均匀地分散。
  2. ​​原始单元耐久性 (EEE):​​ 每个物理单元在失效前可以承受的 P/E 周期数。
  3. ​​写入放大 (WAWAWA):​​ FTL 管理的效率,它作为一个开销因子。

能够物理写入硅片的数据总量是容量和耐久性的乘积,即 C×EC \times EC×E。用户可见的寿命 (TBW) 是这个总的物理潜力,再除以写入放大的低效率。这给了我们 SSD 耐久性的基本方程:

TBW=C×EWATBW = \frac{C \times E}{WA}TBW=WAC×E​

这个简单的关系式是闪存存储的罗塞塔石碑。对于一个拥有 1.2 TB 闪存、3000 次周期耐久性、写入放大为 1.5 的 SSD,其额定的用户寿命将是 (1.2×3000)/1.5=2400(1.2 \times 3000) / 1.5 = 2400(1.2×3000)/1.5=2400 TBW。它完美地阐释了物理化学(更高的 EEE)、制造工艺(更大的 CCC)和算法设计(更低的 WAWAWA)的进步如何共同促成更长寿命的设备。

现实的不公:热数据与动态均衡

到目前为止,我们的讨论都 implicitly 假设所有数据都是均匀写入和重写的。现实要混乱得多。你的一些数据是​​“热”​​的——频繁变化的文件,如操作系统日志、浏览器缓存或数据库索引。你的大部分数据是​​“冷”​​的——你的照片档案、已安装的应用程序和音乐库,它们被写入一次后很少(如果曾经)被修改。

这种偏斜的工作负载构成了重大威胁。一个简单的 FTL 可能只实现​​静态磨损均衡​​,即它只在当前空闲、已擦除的块池中进行磨损均衡。问题在于,包含你冷数据的块就那样静静地待在那里,完全有效,从不进入空闲池。因此,热数据的所有写入和擦除活动都集中在驱动器总块数的一个小得多的子集上。这对寿命来说可能是灾难性的。正如一个假设模型所示,将工作负载集中在驱动器仅 23% 的块上,其寿命可能会比均匀工作负载缩短 10 倍以上。

为了应对这种情况,先进的 FTL 实现了​​动态磨损均衡​​。这种更智能的策略监控所有块的擦除次数,而不仅仅是空闲块。当 FTL 注意到持有冷数据的块比热数据循环中的块“年轻得多”(磨损更少)时,它会主动干预。它会小心地将冷数据从年轻、健康的块复制到一个旧的、磨损严重的块(它可能会再次在那里不受干扰地存放),然后擦除那个年轻的块,将其引入活动池中,以帮助承担热写入的负担。

这个过程更复杂,但它确保了驱动器的全部物理容量都参与到磨损均衡中,从而在真实的、偏斜的工作负载下显著提高寿命。定量模型显示,对于 90% 的写入针对仅 12.5% 数据的工况,动态策略相比静态策略可以将驱动器寿命延长 7 倍以上。

“浪费”空间的智慧:预留空间

你是否曾注意到,一个 SSD 可能被宣传为拥有 240 GB 的容量,而不是像 256 GB 这样的 2 的幂次方整数?那“丢失”的 16 GB 并非凭空消失;它被制造商在一项称为​​预留空间 (OP)​​ 的实践中有意地预留了出来。这部分隐藏空间对用户不可见,但却是 FTL 的私人游乐场,并且是增强性能和耐久性最强大的工具之一。

关键在于预留空间为垃圾回收器提供了更多的喘息空间。如果一个驱动器几乎满了,几乎每个块都装满了有效数据。为了回收哪怕是一点点空间,FTL 被迫对那些仍然大部分是满的块执行垃圾回收,这导致大量的内部数据复制,从而产生非常高的写入放大。

通过提供一个永久的空块储备,预留空间允许 FTL 更具策略性。它可以等待更长时间再清理一个块,让其中更多的页自然地变为陈旧状态。这意味着当垃圾回收最终发生时,需要复制的有效页更少,写入放大率也随之骤降。这在模型中得到了形式化,这些模型显示写入放大与可用空间量成反比;一个假设性但富有洞察力的模型预测,写入放大可以表示为 WA(u)=1uW_A(u) = \frac{1}{u}WA​(u)=u1​,其中 uuu 是驱动器中作为可用空间留下的比例。

当然,这创造了一个有趣的工程权衡:更多的预留空间意味着更低的写入放大和更长的寿命,但也意味着客户可用的容量更少。工程师必须找到最佳平衡点。值得注意的是,数学模型可以指导这一决策,有时会导出优雅的解决方案,精确定位理想的“浪费”空间量,以最大化驱动器的整体健康和 longevity。从一个简单、脆弱的存储单元到我们手中坚固、高性能的存储设备,这段旅程证明了这些层层叠加的智能算法,它们协同工作,管理不完美,创造出一个完美、不知疲倦的数字抄寫员的幻象。

应用与跨学科联系

现在我们已经窥探了闪存单元的微观世界并理解了其脆弱的本质,我们可以开始看到其斗争的回响无处不在。有限耐久性的挑战,即一个组件会随着使用而磨损,这个问题无法被 neatly 包含在单一芯片的硅片之内。它是一个基本的约束,其涟漪会向上穿过计算机系统的整个层级。我们发现的原理——磨损均衡,即分散负载的艺术——成为一种指导哲学,影响着我们如何设计软件、架构大规模存储系统,甚至保护我们的数据。这是一个物理限制如何在最小尺度上激发最大尺度上优雅解决方案的美丽例证。

软硬件的精妙之舞

想象一个操作系统就像一位城市规划师,在一片广阔的存储设备景观上规划道路和建筑。如果不知道脚下土地的性质,规划师可能会无意中制造问题。例如,文件系统通常会维护一个索引——一个目录表——来定位文件的数据。由于每次文件更改时这个索引都会更新,固态硬盘 (SSD) 上存储这个索引的物理块就成了一个“热点”,一个繁忙的市中心,其交通流量远超安静的郊区。如果 SSD 的闪存转换层 (FTL) 天真地持续写入相同的物理块,它们会以灾难性的速度磨损掉,就像一条单独的道路在整个城市的交通重压下崩溃一样。在这里,FTL 的磨损均衡就像一个不知疲倦的交警,不断地将写入重定向到更安静、磨损更少的街道,以均衡损害。

但如果城市规划师——我们的软件——能够变得更聪明呢?如果它能预见到硬件的需求呢?这就引出了“感知闪存”软件的概念。考虑一个日志文件系统,这是一项了不起的发明,可确保在突然断电期间数据不会丢失。它通过先将任何更改写入日志(或称 journal),然后再将其应用到最终位置来实现这一点。但在 SSD 上,这意味着每次元数据更新都被写入了两次——一次到日志,一次到它的最终位置。这使得该元数据的磨损增加了一倍!然而,一个感知闪存的文件系统可以玩一个聪明的把戏。它可能会使用“自适应组提交”,将许多小的更改批处理成一个单一的、更大的日志条目,以减少簿记开销。更优雅的是,它可以执行“通过重映射实现检查点”。它不是物理地将数据从日志复制到其最终位置,而可以简单地告诉 FTL:“你刚才写入日志的那些数据?那就是新的最终位置了。”它完全避免了第二次写入,通过一个简单的观念转变就将磨损减半。

这个想法在像日志结构文件系统 (LFS) 这样的设计中达到了顶峰。LFS 是一个从头开始构建的、像闪存一样“思考”的文件系统。它完全放弃了固定“家”位置的概念,并将整个磁盘视为一个巨大的、循环的日志。每一次写入,无论是新数据还是更新,都 просто追加到日志的末尾。这将来自应用程序的一场混乱的小型随机写入风暴,转变为磁盘上一股温和的、顺序的写入流——这正是闪存所钟爱的工作负载类型。该系统的效率,以及设备的寿命,因此与它清理旧的、无效日志条目的能力直接相关,这是高级软件设计与磨损物理学之间一个美丽的联系。

这就提出了一个深层的架构问题:谁应该负责管理磨损?我们应该依赖一个不透明的 FTL 在幕后处理一切,为操作系统提供一个简单的块接口吗?还是操作系统应该自己承担责任,在原始闪存上使用像 JFFS2 这样的系统?FTL 提供了简单性,但它是盲目的;它无法区分频繁更新的“热”数据(如数据库索引)和很少接触的“冷”数据(如存储的照片)。一个感知闪存的操作系统,拥有这种语义知识,可以物理地将热数据和冷数据隔离到不同的擦除块中。这使其垃圾回收效率大大提高,因为它不必为了从少数更新的热页面中回收空间而不断地重新复制静态的冷数据。这种直接控制可以显著减少写入放大并延长设备寿命,但代价是操作系统复杂度的增加。没有唯一的正确答案;这是简单性与量身定制的完美之间的权衡。

向上扩展:跨系统的磨损均衡

磨损均衡的原理并不止于单个驱动器的边界。它可以向上扩展,为架构整个存储系统提供蓝图。考虑一个 RAID(独立磁盘冗余阵列)阵列。一个简单的 RAID 4 设置使用一个专用驱动器仅用于存储奇偶校验信息。对于数组的每一次小写入,这个单一的奇偶校验驱动器也必须更新。它成了一个巨大的瓶颈,一个不仅影响性能,也影响耐久度的单点故障。那一个 SSD 将承受所有其他驱动器写入流量的总和,导致它更快地磨损。

解决方案是 RAID 5,它将奇偶校验块轮换分布在阵列中的所有驱动器上。一种为解决性能瓶颈而发明的技术,却有一个美妙的副作用:它是一个完美的、系统级的磨损均衡方案!通过分散奇偶校验写入,它确保了阵列中的所有驱动器以大致相同的速率磨损,从而显著增加了整个系统的寿命。

这种系统级协作的主题至关重要。思考一下 TRIM 命令,操作系统通过它告诉 SSD哪些块不再需要。在一个 RAID 5 阵列上会发生什么?如果操作系统为一个仅是 RAID 条带一部分的小区域发送 TRIM 命令,RAID 控制器必须执行一个昂贵的“读-改-写”操作来为该条带中剩余的有效数据重新计算奇偶校验,从而导致性能抖动。然而,如果操作系统很聪明,并且将其 TRIM 命令批处理以与 RAID 条带的完整宽度对齐,控制器就可以在一个高效的操作中使整个条带——数据和奇偶校验——失效。这需要跨层级的通信和理解:操作系统必须了解 RAID 的几何结构,才能发出不仅对 RAID 逻辑高效,而且对底层 SSD 的垃圾回收和磨损均衡算法最为有益的命令。

系统级磨损管理的终极教训来自现代非易失性随机访问存储器 (NVRAM),它模糊了内存和存储之间的界限。想象一个系统有一个非常热的工作负载——比如,一个数据库事务日志——它猛烈冲击一个大型 64 GiB64\,\mathrm{GiB}64GiB NVRAM 设备上的一个小小的 1 GiB1\,\mathrm{GiB}1GiB 区域。如果我们天真地划分设备并将这些写入限制在一个固定的物理区域,结果将是迅速而彻底的灾难。一个简单的计算表明,这个小区域将在几个月而不是几年内耗尽其全部耐久性极限,使整个昂贵的设备变得无用。唯一可行的策略是​​全局磨损均衡​​:将整个 64 GiB64\,\mathrm{GiB}64GiB 视为一个单一的池,并将来自那个微小热区域的写入分布到它的全部空间。这是一个强有力的证明,当工作负载偏斜时,磨损均衡不能是局部事务;它必须是一个全局的、系统范围的策略。

意想不到的联系与统一的原则

一旦你头脑中有了磨损均衡的概念,你就会开始在最意想不到的地方看到它。它不仅适用于高性能 SSD。考虑一个不起眼的物联网 (IoT) 传感器,每分钟将温度数据记录到一个写入耐久性非常有限的小型 EEPROM 芯片上。为了使这个设备达到其五年的目标寿命,设计者不能只是反复写入同一个内存位置。解决方案是其最纯粹形式的磨损均衡:他们将内存划分为多个“插槽”,并以简单的轮换方式写入新记录,循环使用这些插槽。结合校验和以确保电源故障不会留下损坏的记录,这个循环日志确保了可靠性和 longevity,用一个优美简单、古老的想法解决了一个复杂的问题。

这个原则甚至影响我们如何改编经典的计算机科学算法。“伙伴系统”是一种古老的内存管理算法,通过分配2的幂次大小的块并将相邻的空闲“伙伴”合并成更大的块来工作。你会如何改编它来管理闪存设备上的擦除块呢?你不能 просто合并任意两个空闲的伙伴。如果一个已经被擦除了 100 次,而它的邻居已经被擦除了 100,000 次,合并它们将创建一个具有危险的高磨损不平衡的“超级块”。解决方案是教这个老算法一个新技巧:为合并添加一个新条件。你只能在两个伙伴都空闲并且它们的磨损计数彼此接近时才能合并它们。这种“感知磨损的合并”是进化我们的算法思维以尊重新的物理现实的完美例子。

也许最令人惊讶和深刻的联系是磨损均衡、数据压缩和密码学之间的相互作用。想象一下你想安全地存储你的数据,所以在写入 SSD 之前对其进行加密。一个好的加密算法,比如 AES,旨在使生成的密文看起来完全随机——它必须没有可辨别的模式。但在这里我们遇到了一个有趣的悖论。现代 SSD 具有内置的压缩和重复数据删除引擎,以减少它们需要写入的物理数据量,这反过来又减少了磨损。这些引擎的工作原理是寻找模式!

因此,我们对安全的追求与我们硬件对效率和 longevity 的追求直接冲突。看起来随机的密文没有可压缩的模式,并且因为每个加密块都是独一无二的,所以也找不到重复项。SSD 的巧妙功能变得毫无用处。解决方案是一个纯粹智力优雅的时刻:按正确的顺序做事。首先,压缩数据。这挤出了所有的冗余。然后,加密更小的、压缩后的数据。发送到 SSD 的最终输出仍然是一个看起来随机的安全流,但它是一个短得多的流。我们通过理解信息论、密码学和将一位数据写入闪存单元的物理行为之间的深刻联系,获得了加密的全部安全好处和压缩的全部磨损减少好处。

从物联网传感器到 RAID 阵列,从文件系统的日志到加密信息的本质,磨损均衡的原理证明了它远不止是一种固件技巧。它是一种基本的设计哲学,迫使我们全面地思考我们的系统,欣赏软硬件之间的精妙之舞,并在将物理约束转化为工程创造力源泉的过程中发现美。