当前位置: 首页 > news >正文

SSD | (四)NAND闪存(中)

文章目录

  • 📚闪存可靠性问题
    • 🐇磨损
    • 🐇读干扰
    • 🐇写干扰和抑制编程干扰
    • 🐇数据保持
    • 🐇存储单元之间的干扰
  • 📚数据可靠性问题的解决方案
    • 🐇ECC纠错
    • 🐇重读
    • 🐇刷新
    • 🐇RAID

📚闪存可靠性问题

🐇磨损

  • 一个闪存块的磨损程度,用擦写次数(PEC)来衡量。

  • 随着擦写次数的增多,存储在浮栅极的数据会变得越来越不可靠。当数据错得连控制器的纠错引擎都纠不过来时,该闪存就已经不可用了。

  • 下图表明随着闪存块擦写次数的增多,闪存原始比特错误率(RBER)逐渐升高。每款闪存,在其规格书里都有厂家标称的擦写次数,比如3DTLC典型的3000次擦写次数,这个数字其实是原厂基于某种纠错算法能力给出的。

    • 如果用户使用更强的纠错算法,是能在原厂标称的擦写次数基础上延长闪存使用寿命的;
    • 相反,如果用户使用的纠错算法的纠错能力小于原厂假设的纠错能力,则闪存的实际使用寿命会缩短。闪存实际使用寿命跟用户使用的纠错算法强相关
      在这里插入图片描述
  • 闪存实际使用寿命还跟数据保持期相关

    • 原厂给出的标称擦写次数是基于一定的数据保持期的。如果用户实际使用闪存的时候,不需要数据有这么长的数据保持期,比如若只是临时保存一些数据,则闪存能达到更高的擦写次数。
    • 相反,如果用户需要更长的数据保持期,标称擦写次数3000次的闪存,可能只能达到2000次。所以,标称擦写次数仅供用户参考,实际闪存使用寿命取决于应用场景。
  • 由于闪存块存在磨损问题,因此在SSD固件算法设计上,我们通常使用损均算法,这种算法的基本思想是让所有闪存块均摊用户的写入,而不是抓着几个闪存块拼命写,否则整个SSD将因为过早出现过多坏块而不能使用。

🐇读干扰

  • 读干扰:在读闪存页的时候,为确保其他浮栅晶体管导通,需要在其他字线上施加 V P A S S V_{PASS} VPASS电压,这会导致这些晶体管遭受轻微“编程”,随着闪存块读的次数越来越多,越来越多电子进人浮栅晶体管,最终可能导致位翻转。如果不采取措施,当翻转的位数超出纠错引擎的纠错能力时,就会出现用户数据丢失的情况。
  • 如下图所示,WL0和 WL2就是这个问题:明明要读的是 WL1,却影响到 WL0 和 WL2。
    在这里插入图片描述
  • 读干扰是由于有额外的注入电子加大了存储单元的阈值电压,从阈值电压分布图来看,受读干扰影响的闪存页整体阈值电压分布是向右移动的
    在这里插入图片描述
    • 实线部分表示原始阈值电压分布,虚线部分是受读干扰后的阈值电压分布。
    • 以读取LP为例:以前我们用 V r e f 1 V_{ref1} Vref1就能区分LP数据;遭受读干扰后,如果再用 V r e f 1 V_{ref1} Vref1去做判别,会发现部分处于“01”状态的存储单元会被误判成“00”状态,导致数据读取错误。
  • 读干扰本身不会影响闪存寿命,只会影响存储在闪存上的数据的可靠性。然而SSD固件算法为解决读干扰问题采用的刷新操作会带来额外的数据写入,造成写放大,因此对闪存寿命会有影响。

🔥目前的研究表明,在读密集型场景下,低可靠性的高密度闪存,例如TLC和 QLC闪存,会因为读干扰问题产生大量的刷新操作,从而使得即使在少量的主机写操作的场景下,也会导致闪存寿命下降。

🐇写干扰和抑制编程干扰

  • 写干扰:对编程所在字线上无须编程的存储单元的干扰。所谓“干扰”,就是不希望注人电子的存储单元被意外注入电子。

    • 如下图所示,我们在对 W L i WL_i WLi上的闪存页编程的时候,在控制极上施加一个较大的电压,需要进行编程的单元(如存储单元A)的对应位线电压为0V,因此在存储单元A的控制极和衬底之间建立了一个强电场,从而把电子注人存储单元A,这是我们所期望的。
    • 但对同一字线上的存储单元B,它不需要编程,或者已经编程到位,相应位线上电压为2V,但由于它控制极上是一个19V的高电压,因此在存储单元B上也会产生一个比较大的电场,使存储单元B注入额外的电子,而这不是我们所期望的。
      在这里插入图片描述

    如果说读干扰是“损人”,只影响非读取闪存页,那么写干扰则是“不利已”,它会让编程页上那些不希望编程的存储单元意外地注入电子,导致目标编程页写人错误数据。

  • 抑制编程干扰:对需要编程的存储单元所在位线上单元的干扰。

    • 如下图所示,存储单元A需要编程,需要在它及它所在位线(BL0)上的其他存储单元(比如C)的控制极上加一个9V的电压,因此在这些存储单元的控制极和衬底间建立了一个较大的电场(电势差为9V),这可能导致这些存储单元被注人额外的电子。
      在这里插入图片描述

    抑制编程干扰纯粹是“损人”,它会导致其他闪存页注人额外的电子,这可能导致已经编程好的闪存页发生位翻转,也可能导致尚未编程的闪存页处于非干净的擦除状态,不管怎样,最终都会影响数据的可靠性。

在这里插入图片描述

🐇数据保持

  • 数据存储在晶体管中,浮栅极上下被绝缘体包围。但随着时间的推移,存储在浮栅极的电子在本征电场的作用下会透过绝缘层“逃逸”,尤其是随着隧道氧化层绝缘效果逐渐变差(擦写次数增多),电子“逃逸”变得越来越容易。

  • 电子“逃逸”数目达到一定量时,会导致位“0”翻转成位“1”,当发生位翻转的数目超出控制器的纠错能力时,就会出现用户数据丢失的情况。
    在这里插入图片描述

  • 虽然数据保持问题和读干扰问题都会导致存储在闪存中的数据发生位翻转,但两者导致的位翻转的方向是相反的:读干扰注入了额外的电子,导致位从“1”翻转成“0”;而数据保持是电子的流失,导致位从“0”翻转成“1”。从阈值电压分布图来看,读干扰使值电压分布整体右移,而数据保持使阈值电压分布整体左移。
    在这里插入图片描述

  • 从数据写入到电子慢慢泄漏,直到数据出错,这个期限称为数据保存期

    • 在SLC时代,这个时间很久,有几年甚至十多年。但是到了TLC时代,数据保存期可能不到一年,有的只有几个月。
    • 数据保持期的长短,除了跟闪存擦写的次数有关(擦写越多,数据保持期越短),还跟闪存温度有关:温度越高,数据流失越快。在谈数据保持期时,一定要跟闪存擦写次数和温度关联起来,否则是不严谨的。

👀友情提示:没事的时候开开机,让SSD固件有机会帮你把数据找回来

  • 如果你的电脑经常处于开机状态,大可不必担心,因为SSD固件会定期对闪存数据块进行扫描,一旦发现闪存比特出错率高于一定值,就会对该闪存块进行刷新(把数据从一个闪存块搬到另一个闪存块),并把数据恢复到原来的样子,所以数据不会因为数据保持问题而丢失。
  • 如果你的电脑长达几个月甚至一两年不开机,那可能真的会有问题:因为数据保持问题跟闪存通电还是断电无关,存储单元的电子不会因为不上电而不流失,但是,SSD固件却会因为断电而没有机会运行,也就是刚提到的刷新动作无法执行。因此不上电,只能任由电子流失。

🐇存储单元之间的干扰

  • 浮栅晶体管的浮栅极材料是导体。任何两个彼此绝缘且相隔很近的导体间都会构成一个电容器。因此,任何两个存储单元的浮栅极就构成一个电容器。某一个浮栅极里的电荷发生变化,都会引起其他存储单元浮栅极里的电荷发生变化,尤其是与之相邻的存储单元。

  • 以下图为例,假设中间那个字线的存储单元4已经编程到目标状态,接下来继续写入下一个闪存页。当往存储单元6~8中注入电子的时候,由于寄生电容的存在,会使前面已经写好的存储单元4的电荷发生变化,这可能导致存储单元4发生位翻转。
    在这里插入图片描述

  • 可以用以下公式来量化存储单元4受周边存储单元的影响: Δ V t = ∑ k ( Δ V k ⋅ C k / C t o t a l ) \Delta V_{t}=\sum_{k}(\Delta V_{k}\,\cdot\,\,C_{k}/C_{\mathrm{total}}) ΔVt=k(ΔVkCk/Ctotal)

    • 其中,k=0~8(4除外), Δ V k \Delta V_{k} ΔVk代表第k个存储单元值电压的变化, C k / C t o t a l C_{k}/C_{\mathrm{total}} Ck/Ctotal代表第k个存储单元跟第4个存储单元之间的归一化寄生电容。
  • 一个浮栅极与其附近的浮栅极之间都存在寄生电容,电容大小与两个浮栅极之间的距离成反比:距离越短,电容越大,表示彼此影响越大。因此,随着闪存制程的减小,存储单元之间的影响越来越大。这也是 2D闪存发展不下去的一个原因:存储单元靠得太近,彼此影响太大。

  • 按一个闪存块中闪存页的顺序去编程,可减少存储单元之间的干扰

    • 以上图为例,如果按顺序编程:WLm-1,WLm,WL, m+1,在写当前WL的时候,它影响最大的是前一个已经写好的 WL,因为它们离得最近。
    • 如果采用乱序写,比如先写 WLm-1和 WLm+1,回头再来编程 WLm,那么在编程WLm 的时候,它会同时影响离它最近的 WLm-1和 WLm+1。如果继续编程 WLm+2,那么它又会再次影响离它最近的Wm+1,即WLm+1遭受了两次无妄之灾。WLm+1抗一次打击可能没有问题,抗两次就不好说了。

📚数据可靠性问题的解决方案

  • 闪存存在各种不可靠性因素。闪存允许发生比特错误,但SSD却不允许用户数据丢失。因此,在系统层面的SSD软硬件上需要采取一些手段来解决闪存不可靠问题,以确保用户数据的可靠性。
    在这里插入图片描述
    • RBER(Raw Bit Error Rate,原始比特错误率):这是直接从闪存中读出,尚未经过SSD主控纠错处理时的数据错误率。RBER反映了闪存的质量,它与闪存的磨损、断电保存时间等因素有关。
    • UBER(Uncorrectable Bit Error Rate,不可修复的错误比特率):这是一种数据损坏率的衡量标准,表示在应用了特定的错误纠正机制后,依然产生的每比特读取的数据错误数量占总读取数量的比例(概率)。

🐇ECC纠错

  • 闪存控制器使用ECC(ErrorCorrectionCode,纠错码)纠错引擎来纠正闪存数据出错位。流程如下所示:
    在这里插入图片描述
    • (1)将用户数据A写入闪存之前,先对其进行ECC编码,并把产生的校验数据A连同用户数据 A一起写入闪存。
    • (2)数据存储在闪存中,由于某些原因(读干扰或者数据保持等因素)导致位翻转,用户数据A变成用户数据 B。
    • (3)读取用户数据的时候,用户数据B和校验数据B经过ECC纠错引擎。如果发生数据翻转的位的个数没有超出ECC的纠错能力,则经ECC纠错后得到的数据为原始的用户数据A;如果数据出错位的个数超出ECC的纠错能力,解码出来的将是别的数据——这意味着如果没有其他纠错手段,用户数据A就丢失了。

  • 早期闪存(SLC或者MLC闪存)质量还是比较高的,发生位翻转的情况不是很多,当时主要用的纠错算法是BCH算法,它只支持硬解码。后来随着闪存变得越来越不可靠,更强的纠错算法LDPC成为SSD中的主流纠错算法,它不仅支持硬解码,还支持软解码,纠错能力与BCH相比上了一个台阶。
  • SSD控制器的一个核心技术就是纠错算法。纠错模块不仅要纠错能力强、功耗低、性能好,还要面积小。

🐇重读

  • 所谓重读,就是当有错误通过ECC纠不过来时,固件再读一次或若干次。注意,重读不是简单地重复读取,而是需要改变施加在控制极的参考电压来重读。读干扰会导致一些闪存页阈值电压整体向右偏移。
    在这里插入图片描述
  • MLC中每个存储单元存储2位数据,一共有4种状态。当4种状态的电压的分布发生偏移后,如果还是采用之前的参考电压去读取的话,每个状态都可能与参考电压发生重叠,导致读取的时候发生状态判别错误,最后导致读取到错误数据。
  • 如果这个时候把读取的参考电压也相应增大,就能完美地把右移后的4个状态区分开来,各个状态不会和读取电压发生重叠,因此能正确把数据读取出来,
  • 但由于导致位翻转的因素很多,在实际场景中阈值电压的分布并不像上述介绍的读干扰一样只是简单右移,因此闪存厂家会提供若干种重读电压选项来帮用户应对各种复杂场景。
  • 尽管如此,重读也不是万能的,比如相邻状态如果重叠在一起,就很难通过重读来恢复了。

🐇刷新

  • 刷新是固件算法中一种防患于未然的手段,即一旦检测到某个闪存页或者闪存块上面数据出错位的个数比较多(但ECC纠错模块能够很快纠过来),就提前把这个闪存页或者闪存块的数据搬移到新的地方,以避免更多位发生翻转导致ECC纠错模块纠正不了。

🐇RAID

  • 如果某个闪存页的数据位翻转得过多,运用各种恢复手段,ECC还是纠正不过来,那么就只能放大招了——RAID(RedundantArrays ofIndependent Disks,独立磁盘冗余阵列),类似磁盘阵列。

  • 固态硬盘内部本质就是一个闪存阵列,所以可以借鉴磁盘阵列技术来确保数据的完整性。固态硬盘的RAID一般采用RAID5。举个例子,如下图所示,某个SSD的闪存阵列由4个Die构成,写入用户数据A-G的时候,通过异或操作生成校验数据: P a r i t y = A + B + C + D + E + F + G Parity=A+B+C+D+E+F+G Parity=A+B+C+D+E+F+G(其中“+”为异或操作),把校验数据存储在闪存上,A-G和Parity组成一个RAID条带。
    在这里插入图片描述

  • 假设后续读取C失败,我们就可以通过读取该RAID条带上的其他数据来恢复C: C = P a r i t y + A + B + D + E + F + G C=Parity+A+B+D+E+F+G C=Parity+A+B+D+E+F+G(其中“+”为异或操作)。

  • 采用RAID5的SSD只能恢复单个ECC不可纠错的数据,如果出现多个ECC不可纠错的错误数据,它就无能为力了。如果需要恢复发生多个错误的数据,就需要采用别的RAID算法了。

  • 不过目前SSD中采用的主要还是RAID5及其变种算法。由于RAID5采用了冗余纠错技术,需要额外的空间来存储冗余数据(校验数据),因此它必然会占用一部分闪存空间。另外,它对读写性能也有一定影响。

  • RAID技术早期只应用在企业级SSD中,但随着闪存质量的下降,为保证SSD产品的质量,消费级SSD也慢慢开始普及RAID。RAID需要软硬件共同实现:

    • 首先,SSD控制器需要支持RAID操作,即支持硬件异或功能,否则用软件去做异或运算会严重影响SSD的写入性能;
    • 其次,SSD固件需要利用控制器的RAID模块,综合闪存失效特征、硬件RAM资源、闪存资源(冗余空间)等因素,设计合适的RAID算法。

  • 参考书籍:《深入浅出SSD:固态存储核心技术、原理与实战》(第2版)

http://www.mrgr.cn/news/50577.html

相关文章:

  • HiT-SR:基于层级Transformer的超分辨率,计算高效且能提取长距离关系 | ECCV‘24
  • Accessibility into Development for Web Developers
  • 标题:民峰金融:全球投资者的智能化财富管理平台
  • 自学网络安全Web安全,一般人我还是劝你算了吧
  • 一文深度学习java内存马
  • vue3 计算字符串的高度与宽度,通过Canvas API的TextMetrics 接口来实现
  • 初识Java: 常见注意事项总结
  • 从零创建苹果App应用,不知道怎么申请证书的可以先去看我的上一篇文章
  • .net core 3.0 与 6.0 有哪些不同
  • web 0基础第六节 表格标签
  • springboot 拷贝了一个module 启不起来
  • kubernetes--资源调度Selector/Deployment/SatatefulSet/DaemonSet
  • 【java】— 类和对象(这一篇就够了)
  • Podman 的一些常用指令
  • 【Next.js 项目实战系列】01-创建项目
  • 匿名管道和命名管道
  • 想高薪!普通人转行做AI,试试这5步!
  • 胤娲科技:Pika 1.5燃爆登场——AI视频特效,让万物“笑”果全开
  • 初级网络工程师之从入门到入狱(四)
  • 每月洞察:App Store 和 Google Play 的主要更新