Skip to main content

写入放大

写入放大英语:Write amplification,简称WA)是闪存固态硬盘(SSD)中一种不良的现象,即实际写入的物理数据量是写入数据量的多倍。
由于闪存在可重新写入数据前必须先擦除,而擦除操作的粒度与写入操作相比低得多[a],执行这些操作就会多次移动(或改写)用户数据和元数据。因此,要改写数据,就需要读取闪存某些已使用的部分,更新它们,并写入到新的位置,如果新位置在之前已使被用过,还需连同先擦除;由于闪存的这种工作方式,必须擦除改写的闪存部分比新数据实际需要的大得多。此倍增效应会增加请求写入的次数,缩短SSD的寿命,从而减小SSD能可靠运行的时间。增加的写入也会消耗闪存的带宽,此主要降低SSD的随机写入性能[1][3]。许多因素会影响SSD的写入放大,一些可以由用户来控制,而另一些则是数据写入和SSD使用的直接结果。
在2008年,英特尔[4]SiliconSystems(2009年为西部数据所收购)[5]首先在他们的论文和出版物使用了术语“写入放大”。写入放大通常用闪存的写入与主机系统的写入之比来衡量。没有开启数据压缩时,写入放大不小于1。在使用压缩的情况下,SandForce声称他们的典型写入放大达到了0.5[6],而在最佳情况下,使用SF-2281控制器,此值能低至0.14[7]

SSD基本操作[编辑]

NAND闪存以每页4 KB写入数据,以每块256 KB擦除数据
NAND闪存以每页4 KB写入数据,以每块256 KB擦除数据[2]
由于闪存操作的性质,数据不能像在硬盘中那样直接覆写。当首次向SSD写入数据时,单元都处于已擦除状态,因而数据可以直接写入,一次一(大小通常为4至8千字节(KB))。SSD中管理闪存与主控系统接口的SSD控制器,使用称为逻辑区块地址(LBA)的逻辑到物理映射系统,这是闪存转换层(FTL)的一部分[8]。当新的数据要替换已写入的旧数据时,SSD控制器将会写入新的数据至新的位置,并且更新逻辑映射,将其指向新的物理位置。原位置的数据将不再有效。在可以再次写入之前,它需要先被擦除[1][9]
闪存的编程和擦除次数有限。通常以闪存在整个寿命中最多可忍受的编程/擦除循环(P/E循环)次数来表示。单层单元(SLC)闪存,通常设计为高性能和长寿命,一般能有50000到100000次循环。截至2011年,设计用于低成本应用的多层单元(MLC)闪存,循环次数就大为减少,一般只有3000至5000次循环。自2013年起,已有三层单元(TLC)闪存,其编程-擦除(P/E)循环次数又降至1000。写入放大越低,则越为理想,因为与之对应的是闪存中P/E循环次数减少,所以能延长SSD的寿命。[1]

计算数值[编辑]

即使是在定义术语之前,写入放大就已经存在于固态硬盘中,但直到2008年,才有英特尔[4][10]和SiliconSystems开始在他们的论文和出版物中使用它[5]。所有的SSD都有一个写入放大值,基于当前正在写入的数据及先前已写入到SSD的数据。为了能准确地测量特定SSD的该值,应使选定的测试流程运行足够长的时间,以确保驱动器已达到稳态[3]
一个简单计算SSD写入放大的公式是:[1][11][12][13]
闪存写入的数据量 ÷ 主控写入的数据量 = 写入放大

影响因素[编辑]

SSD的写入放大会受许多因素的影响。下表列出了主要因素以及它们对写入放大的影响。对于变量因素,表中注明了“正面”相关或“反面”相关。如随着预留空间的增加,写入放大将减小(反相关)。如果该因素是一个开关(“启用”或“禁用”)关系,那么它的关系或“正向”或“反向”。[1][8][11]
写入放大因素
因素描述类型关系*
垃圾回收用来挑选用于擦除和重写的最佳块的算法的效率变量反面(小为好)
预留空间分配到SSD控制器的物理容量百分比变量反面(小为好)
SATA的TRIM命令 或 SCSI中的UNMAP这些命令必须由操作系统(OS)发送,可以通知存储设备哪些扇区含有无效数据。可以处理这些命令的SSD能在擦除块时,将包含这些扇区的页作为空闲空间回收,而不是复制无效的数据到干净的页中。开关正向(小为好)
空闲用户容量没有实际用户数据的用户容量百分比;需要TRIM,否则SSD不会从任何空闲的用户容量中获得好处变量反面(小为好)
安全擦除擦除所有的用户数据和相关元数据,将SSD的性能重置到最初状态(直至重新开始垃圾回收)开关正向(小为好)
耗损均衡算法的效率,令每块的写入次数与其他的块尽可能相同变量正面(大为坏)
静动数据分离将数据按修改频率分组开关正向(小为好)
顺序写入理论上,顺序写入的写入放大为1,但其他因素仍会影响此值开关正向(小为好)
随机写入写入到非连续的LBA对写入放大的影响最大开关反向(大为坏)
数据压缩,包括重复数据删除数据压缩和重复数据删除能消除更多的冗余数据,降低写入放大,同时提升SSD速度。变量反面(小为好)
SLC模式使用MLC NAND以每单元1位,而不是以设计的每单元位数(通常为每单元2位)写入数据,以加快读取和写入操作。如果临近SLC模式下的NAND容量限制,SSD必须把旧有用SLC模式写入的数据改写为MLC或TLC模式,才能让SLC模式的NAND空间释放出来,以便容纳更多的数据。然而,通过让经常更改的页面维持在SLC模式,而不是以MLC或TLC模式修改,这种做法也可以降低磨损,因为比用SLC模式,用MLC或TLC模式写入对闪存的伤害确实更大。因此,这种做法提高了写入放大,但当写入模式设为向常写页面上写入时,却可以减少磨损。然而,顺序和随机写入却会加剧磨损,因为这样就没有或少有频繁写入的页是SLC模式,迫使旧数据不断地从SLC模式改写到MLC或TLC。开关反向(大为坏)
*关系定义
类型关系描述
变量正面随着因子增加WA增加
反面随着因子增加WA减小
开关正向当因子开启时WA减小
反向当因子开启时WA增加

垃圾回收[编辑]

页面能一直写入,直至填满区块。然后,当前的数据页被移动至新的区块,旧的区块被擦除。
页面能一直写入,直至填满区块。然后,当前的数据页被移动至新的区块,旧的区块被擦除[2]。(图示:1.四个页面(A-D)写入一个区块(X)。单独的空闲(已擦除)页面可以直接写入;2.四个新页(E-H)和四个替代页(A'-D')写入区块(X)。原来的A-D页现在包含的是无效(过期)数据,但直至整个区块被擦除前,页面都不能重新写入;3.要向含有过期数据的页面(A-D)写入数据,有效页面(E-H和A'-D')被读取并写入区块(Y),然后区块(X)被擦除。最后一步称为“垃圾回收”。)
数据以页面(由多个单元组成)为单位写入到闪存中。然而,存储器只能以较大的单位区块(由多个页面组成)擦除[2]。如果不再需要一个块中某些页内的数据(称为过期页),仅会读取该块中含有有效数据的页面,并重新写入到另一个先前擦除的空块中[3]。因而,由于没有移动过期数据,留下的空闲页就可用来存储新的数据。这一过程称为“垃圾回收”(GC)[1][12]所有的SSD都包含不同程度的垃圾回收机制,但在执行的频率和速度上有所不同[12]。垃圾回收占了SSD上写入放大的很大一部分[1][12]
读取数据不需要擦除闪存,因此通常与写入放大无关。在有限的情况下会发生读取干扰错误,此时会读取并重新写入区块中的数据,但是这不会对驱动器的写入放大造成实质性的影响。[14]

后台垃圾回收[编辑]

垃圾回收的过程包括读取并重新向闪存写入数据。这意味着,主控写入新数据时,就必须先读取整个区块,再写入区块中仍包含有效数据的部分,之后才写入新数据。这显著降低了系统的性能[15]。有的SSD控制器实现了“后台垃圾回收”(BGC),有时也被称为“空闲垃圾回收”或“空闲时间垃圾回收”(ITGC),能让控制器在主控需要写入新的数据之前,使用空闲时间整理闪存块。这使驱动器能维持较高的性能[16]
如果能在需要闪存前,控制器在后台垃圾回收时,就已经收集好了所有的空闲区块,那么就可以直接写入主控要写入的新数据,而无须先移动数据,这样驱动器就总能表现出最佳性能。不幸的是,实际上某些区块上的数据主控并不需要,它们最终将会被删除,但操作系统并没有告诉控制器这些信息。结果,要被删除的数据被重写到了闪存的另一个位置,因而提高了写入放大。在一些OCZ的SSD中,后台垃圾回收仅会清除少量的块,之后便停止,以此限制过度写入的数量[12]。另一种解决方案是配备一个高效的垃圾回收系统,在主控写入的同时同步执行必要的数据移动。在SSD少有空闲的环境中,这种解决方案更有效[17]SandForce的SSD控制器[15]Violin Memory的系统有这项功能[11]

文件系统感知垃圾回收[编辑]

2010年,一些厂商(特别是三星)推出的SSD控制器扩展了BGC的概念,它们会分析固态硬盘上使用的文件系统,以识别出最近删除的文件,及未分区的空间。制造商声称,系统(操作系统和SATA控制器硬件)即便不支持TRIM,也能获得相似的性能。三星实现的操作似乎在假定、并且需要有一个NTFS文件系统[18]。当前,这些厂商生产的SSD是否仍具备该功能不得而知。有报道称,如果没有正确地用MBR和NTFS格式化这些驱动器,将会出现系统数据的损坏[19]

预留空间[编辑]

SSD中的三级预留空间
SSD中的三级预留空间[15][20]。(图示:层级1:7.37%,230和109之间的差距。HDD和SSD基于十进制衡量空间,而不是像内存那样用二进制单位。层级2:0,7,或28%,控制寿命、容量、性能达到期望平衡的比例。SSD由工厂设置层级2的预留空间,以维持基本的性能和寿命。层级3:?%,在SSD的使用过程中波动。(假设支持TRIM)存储的用户数据在变化,空闲空间被自动用作预留空间。)
预留空间(有时简称OP)是闪存的物理容量和操作系统(OS)呈现给用户的可用逻辑容量之间的差值。在SSD的垃圾收集、耗损均衡及坏块映射操作中,额外的预留空间有助于降低控制器写入闪存时的写入放大。[4][20][21][22]
预留空间的第一级来自容量的计算,单位使用吉字节(GB),而不是gibibyte(GiB)。HDD和SSD的厂商都使用术语GB来表示“十进制”的GB,即1,000,000,000(10^9)字节。闪存(象其它大多数电子存储器一样)以二的幂组装,所以SSD的物理容量将以每二进制GB 1,073,741,824(230)字节来计算。两个值之间的差距是7.37%(=(230-109)/109 × 100%)。从而预留0%空间的128 GB SSD提供给用户的容量是128,000,000,000字节。这个初始的7.37%通常不计算在总的预留空间数量中。[20][22]
预留空间的第二级来自制造商。这一级的预留空间大小通常为0%、7%或28%,基于十进制吉字节的物理容量与十进制吉字节的用户可用空间之差。举例而言,制造商发布的规格为100 GB、120 GB或128 GB的SSD,可能它们的实际物理容量都是128 GB。这种差异就是由28%、7%和0%造成的,而这也是制造商声称它们的驱动器有28%预留空间的依据。这不包括额外的十进制和二进制吉字节之间相差的7.37%。[20][22]
预留空间的第三级来自驱动器上的已知可用空间,以获得持久性和性能,前提是报告未使用的部分,和/或以当前或未来的空间为代价。可以借由操作系统使用TRIM命令来确定空闲空间。另外,一些SSD提供了工具,以让最终用户选择额外的预留空间。此外,如果在SSD上没有100%地使用可用空间划分分区布局,SSD也将会自动把未分区的空间作为预留空间使用[22]。还有一个预留空间来源于操作系统的最小可用空间限制;一些操作系统在每一个驱动器上都保留有一定的最小可用空间,特别是在启动或主驱动器上。如果SSD,也许是通过连续使用TRIM命令,能够识别出这些额外空间,那么它就能作为半永久性的预留空间。预留空间往往需要占用用户容量,或暂时或永久,但它能减少写入放大,增加持久性,并提高性能[17][21][23][24][25]
预留空间计算
( 物理容量 - 用户容量 ) ÷ 用户容量 = 预留空间

TRIM[编辑]

TRIM(不是缩写)是一个SATA命令,使得操作系统可以告诉SSD不再需要哪些之前保存过数据的区块。可能这些文件已被删除,或整个分区已被格式化。若操作系统替换了一个LBA的同时覆写了一个文件时,SSD就能知道可以标记原来的LBA为过时或无效,在垃圾回收的过程中就不用再保留那些块。如果用户或操作系统删除一个文件(不只是除去它的一部分),通常只会将该文件标记为已删除,而并未真正擦除磁盘上的实际内容。正因如此,SSD不知道可以擦除文件先前占用的LBA,所以在垃圾回收时仍会保留它们。[26][27][28]
在有操作系统支持的情况下,TRIM命令解决了这个问题,如Windows 7[27]、Mac OS(Snow Leopard、Lion及Mountain Lion的最新版,有些情况下需要补丁)[29]Linux >= 2.6.33[30]。当永久删除一个文件或格式化硬盘时,操作系统依据不再包含有效数据的LBA发送TRIM命令。这可告知SSD可以擦除并重新使用哪些使用中的LBA。垃圾回收过程中需要移动的LBA因此而减少。结果是SSD将有更多的空闲空间,同时获得低写入放大及更高的性能[26][27][28]

限制和依赖[编辑]

TRIM命令也需要SSD支持。SSD固件如果不支持TRIM命令,就不会标记TRIM命令收到的LBA为无效,而仍假设数据有效,并在垃圾回收时继续予以保留。只有当操作系统向这些LBA中保存新数据时,SSD才能将最初的LBA标记为无效[28]。若驱动器中没有内建支持TRIM,SSD厂商可以为用户升级固件,或提供一个单独的实用程序,以从操作系统中提取关于无效数据的信息,再另外TRIM SSD。只有用户每次运行程序后,才能从中获得好处。用户可以设定计划任务,让该实用程序在后台定期自动运行[15]
正因为SSD支持TRIM命令,在收到命令后,它不一定能立即表现出最快性能。TRIM命令释放的空间可能随机散落于SSD中。要经过几轮的数据写入和垃圾回收之后,空间才会逐渐合并,表现的性能才能提高。[28]
即使已配置OS和SSD支持TRIM命令,其他情况也可能会使TRIM无法发挥出它的功效。截至2010年初,数据库和RAID系统还没有配备TRIM感知,因而无法向SSD传递信息。这种情况下,SSD将继续保留那些区块,直到OS将那些LBA用于新的写操作。[28]
实际可从TRIM命令中得到的益处取决于SSD上的空闲用户容量。如果SSD用户容量为100 GB,用户实际在驱动器上存储了95 GB数据,任何TRIM操作为垃圾回收和耗损均衡增加的可用空间都不会超过5 GB。在这种情况下,增加5 GB的预留空间将使SSD的性能更加稳定一致,因为可用空间总会有额外的5 GB,而不必等待OS发来TRIM命令。[28]

空闲用户容量[编辑]

SSD控制器将使用SSD上的任何空闲块以进行垃圾回收和耗损均衡。无用户数据的用户容量部分(或已TRIM,或从未写入)就如同预留空间(直至用户向SSD保存新数据)。如果用户保存的数据仅占驱动器总用户容量的一半,用户容量的另一半看起来就如同额外的预留空间(只要系统支持TRIM命令)。[28][31]

安全擦除[编辑]

ATA安全擦除命令旨在从驱动器中删除所有用户数据。对于没有内置加密功能的固态硬盘,此命令将会把驱动器恢复至其出厂状态。刚开始,它的性能将恢复至可能的最高水平及最佳的(最低)写入放大,但只要驱动器再次开始垃圾收集,性能和写入放大就会逐渐降至先前水平[32][33]。许多任务具能使用ATA安全擦除命令重置驱动器,而且有用户界面。在行业中经常提到的一个免费工具是HDDErase[33][34]GpartedUbuntu live CD提供可启动的Linux系统,上有包含安全擦除的磁盘实用程序[35]
实时加密所有写入数据的驱动器可以以另一种方式实现ATA安全擦除。方法是简单地向其补零,并在每次完成安全擦除后产生一个新的随机加密密钥。这样就无法再读取旧数据,因为无法解密[36]。内置加密的驱动器可能需要发送TRIM命令,以将其设为出厂状态[37]

耗损均衡[编辑]

如果反复地编程和擦写某区块,而其他区块却没有写入,该区块会早于其他的区块而磨损——从而过早地结束了SSD的寿命。由于这个原因,SSD控制器使用称为耗损均衡的技术,以尽可能均匀地将写入分配到SSD的所有闪存区块上。
理想情况下,每一区块都能写入到最大次数,这样它们都能同时失效。不幸的是,耗损均衡操作会要求移动之前写入后就未改变的数据(冷数据),以使频繁变动的数据(热数据)可以写入到冷数据的区块中,让冷数据的区块达到均衡。数据被重定位,而主控却并没有修改它们,这增加了写入放大,而降低了闪存的寿命。关键是要找到最优算法以使两者同时达到最优化。[38]

静动数据分离[编辑]

对SSD控制器来说,静动数据分离并不是一件简单的事。该方法需要SSD控制器将数据不断变化、需要重写(动态数据)的与数据很少改变、且不需要任何重写(静态数据)的LBA分离开来。如果数据混于同一区块,正如当前几乎所有系统所做的那样,SSD控制器在重写时,就需要垃圾回收动态数据(引起重写的原因)和静态数据(不需要任何重写)。任何对操作中未涉及数据的垃圾回收都会增加写入放大。因此分离数据将使静态数据留在原地,如果它永远不会改写,写入放大就能达到最低。[1]

顺序写入[编辑]

当顺序向固态硬盘写入数据时,写入放大等于1,意为没有写入放大。这是因为在数据写入时,依次用来自同一文件的数据填充区块。如果OS确认该文件将被替换或删除,可以标记整个块为无效,也不需要读取它以将垃圾收集到的数据重写入另一个块。它只需要擦除,比随机数据写入所需的“读取-擦除-修改-写入”的垃圾收集过程更易、更快。[8]

随机写入[编辑]

在完全垃圾回收、安全擦除、100%TRIM、或新安装之后,SSD有大量的空闲区块,随机写入性能达到峰值。最大速度将取决于连接到SSD控制器的并行闪存通道数、固件效率及闪存写入页面的速度。在此阶段,写入放大之于随机写入达到最佳,接近1。一旦区块都写入了一次,垃圾收集过程将启动,性能将会被此过程的速度和效率所限制。此阶段的写入放大将增至驱动器经历过的最高水平。[8]

对性能的影响[编辑]

SSD的总体性能取决于许多因素,其中包括写入放大。向闪存设备写入比从它读取所需的时间更长[16]。SSD通常并联使用多个闪存组件,以提高性能。如果SSD的写入放大高,控制器将不得不多次向闪存写入。主控将需要更多的时间写入数据。低写入放大的SSD不需要写那么多的数据,因此能比高写入放大的驱动器更早写入完毕[1][9]

产品声明[编辑]

2008年9月,英特尔宣布了X25-M SATA SSD,声称WA能低至1.1[6][39]。2009年4月,SandForce宣布了SF-1000 SSD处理器系列,报称其WA为0.5,似乎是借由某种形式的数据压缩而达到[6][40]。在此次发布前,曾认为1.0的写入放大是SSD可以达到的最低水平[16]。当前,只有SandForce的SSD控制器使用了压缩。

Comments

Popular posts from this blog

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into ...

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checkin...