wordpress 中文 图片,宁波搜索引擎优化seo,地板网站代码,哈尔滨网络建设网络优化文章目录 #x1f4da;垃圾回收#x1f407;垃圾回收原理#x1f407;写放大#x1f407;垃圾回收实现#x1f407;垃圾回收时机 #x1f4da;解除映射关系#x1f4da;磨损均衡 #x1f4da;垃圾回收
#x1f407;垃圾回收原理 ✋设定一个迷你SSD空间#xff1a; 假… 文章目录 垃圾回收垃圾回收原理写放大垃圾回收实现垃圾回收时机 解除映射关系磨损均衡 垃圾回收
垃圾回收原理 ✋设定一个迷你SSD空间 假设迷你SSD底层有4个通道通道0-3每个通道上各挂了1个DieDie0-3它们可并行操作假设每个Die只有6个闪存块块0-5所以一共有24个闪存块。每个闪存块内有9个小方块每个小方块的大小和逻辑页大小一样。24个闪存块中我们假设其中的 20个闪存块大小为 SSD 容量就是主机端看到的SSD大小另外4个闪存块是超出SSD容量的预留空间我们称之为OP。 ⭐️顺序写入顺序写入4个逻辑页分别写到不同通道上的Die上这样写的目的是增加底层的并行度提升写入性能。用户继续写入数据固件把数据交错写入到各个Die上直到写满整个SSD空间。 ⭐️SSD容量写满后启用OP假设还是从逻辑页1开始写入。由于闪存不能在原位置原地更新这个时候SSD会把新写入的逻辑页1-4写入SSD预留空间OP。如下图出现了深色方块是因为逻辑页1-4的数据已更新原位置上的数据就变为了垃圾数据。 ⭐️整个内存空间写满继续顺序写入深色方块越来越多垃圾数据越来越多。当所有内存空间都写满如下所示后SSD内部就需要进行垃圾回收了。 ⭐️垃圾回收顺序写就是把某个闪存块上的有效数据读出来并进行重写然后把该内存块擦除从而得到新的可用闪存块。 如下图所示块x上面有效数据为A、B、C块y上面有效数据为D、E、F、G其余方块为无效数据。垃圾回收机制就是先找一个可用块z然后把块x和块y的有效数据搬移到块z上这样块x和块y上面就没有任何有效数据了将它们擦除就得到两个可用的闪存块。 我们用不到一个闪存块的代价获得了两个可用的闪存块这就是垃圾回收的价值。 当我们采用的是顺序写入如上述垃圾集中在块0上上面没有任何有效数据我们把它们擦除就可以腾出新的写人空间——SSD内部可以把新的数据写入垃圾回收完成的块0上了。顺序写即使是闪存空间写满后的写性能也是比较好的因为垃圾回收可以很快完成也许只要一个擦除动作。 ⭐️垃圾回收随机写 现实中用户还是可能随机写入数据这个时候垃圾回收是挑选垃圾比较多的闪存块来回收。因为有效数据少要搬移的数据少这样腾出空闪存块的速度快付出的代价也小。 由于我们是同时往4个通道写数据需要每个通道都有一个空闲的闪存块因此我们做垃圾回收时不是回收某个闪存块而是所有通道上都要挑一个。一般选择每个Die上块号一样的所有闪存块做垃圾回收。如上所示块0上的垃圾数量最多因此我们挑选块0作为垃圾回收的闪存块。回收完毕我们把之前块0上的有效数据重新写回这些闪存块这里假设回收的有效数据和用户数据写在一个闪存块但在实际实现中它们可能是分开写的。 此时有了空闲的空间用户就可以继续写入数据了。 SSD越写越慢是有科学依据的 可用闪存空间富裕时SSD无须做垃圾回收因为总有空闲的空间可写。SSD使用早期由于没有触发垃圾回收机制无须额外的读写操作所以速度很快。之后SSD变慢了主要原因是SSD需要做垃圾回收。 SSD的垃圾回收性能跟用户写入数据的模式也有关 如果用户是顺序写垃圾比较集中利于SSD做垃圾回收如果用户是随机写垃圾比较分散SSD做垃圾回收相对来说就更慢所以性能没有前者好。
写放大 垃圾回收的存在会引入写放大问题用户要写入一定量的数据SSD为了腾出空间写这些数据需要额外做一些数据搬移工作也就是进行额外写导致的后果往往是SSD往闪存中写入的数据量比实际用户写入SSD的数据量要大。因此SSD中有一个重要参数——写放大系数计算公式 写放大系数 W A 写入闪存的数据量 / 用户写的数据量 写放大系数WA写入闪存的数据量/用户写的数据量 写放大系数WA写入闪存的数据量/用户写的数据量对空盘来说未触发垃圾回收写放大系数一般为1即用户写入数据量与SSD写入闪存的数据量相等这里忽略了SSD内部数据的写入如映射表的写入。在SandForce控制器出来之前写放大系数最小值为1。但由于SandForce控制器内部具有实时数据压缩模块它能对用户写入的数据进行实时压缩然后再写入闪存因此写放大系数可以做到小于1。举个例子用户写入8KB数据经压缩后数据变为4KB如果这个时候还没有垃圾回收那么写放大系数就只有0.5。 WAF计算以前面介绍的垃圾回收为例 我们挑选每个Die上的块0做垃圾回收一共36个方块其中有12个有效数据方块我们做完垃圾回收后需对这12个有效数据方块进行写回操作后面还可以写入24个方块的用户数据。因此为了写这24个方块的用户数据SSD实际写了12个方块的原有效数据再加上该24个方块的用户数据总共写入36个方块的数据由写放大系数的定义可知 W A F 36 / 24 1.5 WAF36/241.5 WAF36/241.5。 写放大系数越小越好越小意味着对内存损耗越小闪存寿命越长。因此SSD设计的一个目标是让写放大系数尽量小。减小写放大系数的三条思路压缩办法由主控决定顺序写可遇不可求取决于用户写入负载、增大OP这个可控。 ⭐️增大OP减小写放大系数 O P 比例 ( 闪存空间 − 用户空间 ) / 用户空间 OP比例(闪存空间-用户空间)/用户空间 OP比例(闪存空间−用户空间)/用户空间以前述SSD空间为例。假设SSD容量是180个小方块当OP是36个小方块时整个SSD闪存空间为216个小方块OP比例是 36 / 180 20 36/18020% 36/18020。那么180个小方块的用户数据平均分摊到 216个小方块时每个小方块的平均有效数据为 180 / 216 0.83 180/2160.83 180/2160.83一个闪存块上的有效数据为 0.83 x 9 7.5 0.83x97.5 0.83x97.5也就是一个闪存块上面平均有7.5个浅色方块和1.5个深色方块。为了写1.5个用户数据方块需要写9个方块的数据原有7.5个有效数据方块加1.5个用户数据方块写放大系数是 9 / 1.5 6 9/1.56 9/1.56。如果整个SSD闪存空间不变还是216个小方块调整OP至72个小方块那么SSD容量就变成144个小方块。144个小方块的用户数据平均分摊到 216个小方块时每个小方块的平均有效数据为 144 / 216 0.67 144/2160.67 144/2160.67一个闪存块上的有效数据 为 0.67 x 9 6 为0.67x96 为0.67x96写放大系数是 9 / 3 3 9/33 9/33。上面说的都是最坏情况垃圾数据平均分排到每个闪存块上。现实情况是垃圾数据更多时候并不是平均分配到每个闪存块上有些块上的垃圾多有些块上的垃圾少实际进行垃圾回收时挑选闪存块挑的是垃圾多的因此实际写放大系数是小于前面的计算值的。 OP越大越好OP越大意味着写放大系数越小意味着SSD写性能和耐写性越好。但OP加大意味着需要提供更多的额外闪存空间也就意味着SSD成本要加大。 消费级 SSD对成本敏感不追求稳态性能和延时即允许一边写入一边做垃圾回收因此它们的OP比较小一般为7%左右。企业级 SSD追求稳态性能和延时为有好的稳态性能它们一般都提供比较大的 OP一般为百分之几十。因此一个SSD最终OP的选择需要在成本和写放大之间做平衡。 ⭐️影响写放大系数的因素主要有OP大小、用户写入的数据模式随机写与顺序写、垃圾回收策略在挑选源闪存块的时候如果不是挑选有效数据最少的块作为源闪存块就会增加写放大系数、垃圾回收的时机理论上越晚做垃圾回收写放大系数越小因为闪存块上的一些数据可能被后续用户重写从而变成垃圾数据越到后面垃圾数据越多需要搬移的有效数据越少写放大系数越小、磨损均衡为均衡每个闪存块的擦除次数需要搬移数据、数据刷新数据搬移会增加写放大系数、主控带压缩和不带压缩。
垃圾回收实现
⭐️Step1挑选源闪存块 挑选源闪存块常见算法是挑选有效数据最少的块贪婪算法绝大多数SSD采用的策略这样需要重写的有效数据最少写放大系数自然最小回收一个块付出的代价最小。迅速找到有效数据最少的那个块需要固件在写用户数据时做一些额外的工作即记录和维护每个用户闪存块的有效数据量。 用户每往一个新的块上写入一笔用户数据该闪存块上的有效数据计数就加1同时还需要找到这笔数据之前所在的块如果之前该笔数据曾写入过由于该笔数据写入到新的块那么在原闪存块上数据就变为无效状态了因此原闪存块上的有效数据技术应该减1。 除贪婪算法外还有其他的选源算法。比如有些SSD在挑选源闪存块时还把闪存块的擦写次数考虑其中这其实就暗藏了磨损均衡算法后面会详细介绍。好处可以把损均衡算法做到垃圾回收中来不需要额外提供磨损均衡算法缺点这不是一种只看有效数据策略的垃圾回收由于挑选的闪存块可能有效数据很多因此写放大系数更大垃圾回收性能更差。 ⭐️Step2把数据从源闪存块读出来 【法①位图表】前面提到固件在往一个闪存块上写入逻辑页时会更新和维护闪存块的有效数据量因此可以快速挑中源闪存块。再进一步固件不仅更新和维护闪存块的有效数据量还给闪存块一个位图表用于标识哪个物理页式有效的。在做垃圾回收的时候固件只需根据位图表的信息把有效数据读出来然后重写即可。 固件把一笔逻辑页写入某个内存块时该内存块上对应位置的比特位就置1。一个闪存块上新增一笔有效数据就意味着这笔数据所在的前一个闪存块上的数据变为无效因此需要把前一个闪存块对应位置的“比特位”置0。如用户空间写满后继续写入4个逻辑页对应的位图表如下 由于有了闪存块上有效数据的位图在进行垃圾回收的时候固件就能准确定位并读取有效数据。位图存在的好处就是使垃圾回收更高效但固件需要付出额外的代价去维护每个闪存块的位图。 在上述例子中每个闪存块只有36个逻辑页但在实际中每个闪存块有可能存在一两千个闪存页每个闪存页可以容纳若干个逻辑页因此每个闪存块的位图需要占用不小的存储空间这对带 DRAM的SSD来说可能不是问题。对使用DRAM-less的SSD来说由于SRAM 受限只能加载部分闪存块的位图到SRAM中因此还需要进行位图的换入换出操作这会给固件带来不小的开销实现起来没有想象中那么简单。 【法②读取所有数据】如果没有每个闪存块的有效数据位图SSD固件做垃圾回收的时候可以选择读取所有数据这时需要明确哪些数据需要重写。SSD 在将用户数据写入闪存的时候会额外打包一些数据我们称其为元数据MetaData它记录着该笔用户数据的相关信息。 垃圾回收的时候SSD固件把数据读取出来获得与该笔数据对应的LBA逻辑地址。要判断数据是否无效需要查找映射表获得与该LBA对应的PPA物理地址如果该地址与该数据在该闪存块上的地址一致就说明是有效的否则该数据就是无效的。 以上图为例我们在某个源闪存块位置PPA x上读取数据获得元数据从而得到存在该位置的逻辑地址为LBA x然后我们用LBA x查找逻辑地址到物理地址的映射表得知最新数据存储在PPA y上。然后检查PPA x和PPA y是否一致如果一致说明存储在PPA x位置上的是与LBA x对应的最新数据即为有效数据否则为无效数据垃圾回收时无需搬移。 把源闪存块里的数据全部读出来的方式的缺点是显而易见垃圾回收做得慢。 不管数据是否有效都需要读出来然后还需要查找映射表来决定该笔数据是否有效。这对带DRAM的SSD来说问题不大因为其所有映射表都在DRAM中但对 DRAM-less SSD来说很多时候都需要从闪存里面把映射关系读出来这是灾难性的。 这种方式的好处就是SSD固件实现起来简单不需要维护闪存块有效数据位图等额外内容也不需要额外的 RAM 资源和固件开销。 【法③P2L表】还有一个折中的办法就是在L2PLogical to Physical映射表外再维护一张P2LPhysical to Logical表。 该表记录了每个闪存块写入的 LBA该 P2L数据写在该闪存块某个位置或单独存储。当回收该闪存块时首先把该P2L表加载上来然后根据上面的LBA依次查找映射表以决定该数据是否有效。有效数据会被读上来然后重新写入。采用该方法不需要把该闪存块上的所有数据一股脑儿地读上来但还是需要查找映射表以决定数据是否有效。因此该方法在性能上介于前面两种方法之间在资源和固件开销上也是处于中间的。 ⭐️Step3重写有效数据即把读出来的有效数据写入目标闪存块。
垃圾回收时机
当用户写入数据时如果可用的闪存块小于一定阈值这个时候就需要做垃圾回收以腾出空间供用户写。这个时候做的垃圾回收为前台垃圾回收(Foreground GC)。这是被动方式的是由于没有足够多可用的闪存块才做的垃圾回收。与之相对应的是后台垃圾回收BackgroundGC它是在SSD空闲的时候SSD主动做的垃圾回收这样在用户写入的时候就有充裕的可用闪存块不需要临时抱佛脚从而改善用户写入性能。但是出于功耗考虑有些SSD可能不支持后台垃圾回收当SSD空闲后直接进入省电模式或者做少量的垃圾回收然后进入省电模式。 上述两种垃圾回收是由SSD自已控制的。2015年8月15日OCZ发布了一款采用SATA接口的企业级SSD——Saber1000HMS它是首款具有主机管理SSDHost Managed SSDHMS功能的SSD。所谓 HMS就是主机通过应用软件获取 SSD的运行状态然后控制SSD的一些行为。 在 SSD内部运行着一些后台任务比如垃圾回收、记录SSD运行日志等。这些后台任务的执行会影响SSD的性能并且使SSD的延时不可预测。HMS技术使主机能控制SSD的后台任务比如控制后台任务执行或者不执行什么时候执行什么时候不执行。企业级的SSD相比消费级SSD对稳定的性能和延时更加关注。后台任务的存在使得 SSD性能和延时很难保持一致。HMS技术的出现使得整个系统具有更稳定的性能和可预测的延时。
解除映射关系
对一个文件File A来说用户看到的是文件操作系统会为文件分配逻辑块最终文件会写入SSD的闪存空间。当用户删除文件File A时其实只是切断用户与操作系统的联系即用户访问不到这些地址空间而在SSD内部逻辑页与物理页的映射关系还在文件数据在闪存当中还是有效的。 用户删除文件的时候如果主机不告诉SSDSSD就不知道那些被删除的数据页是无效的必须等到主机要求在相同的地方写入数据时才知道那些数据是无效的才可以放心地删除。由于SSD不知道这些删除的数据已经无效在做垃圾回收的时候仍把它当作有效数据进行数据的搬移这不仅影响垃圾回收的性能还影响SSD的寿命写放大系数增大。用户删除文件时系统需要发出一些特殊命令来及时告诉SSD哪些数据已经不需要了。在 SSD主机协议中有相应的命令来支持该功能比如ATA中的Data Set ManagementTrim命令、SCSI里面的UNMAP命令等。一旦SSD知道哪些数据是用户不需要的在做垃圾回收的时候就不会搬移主机删除的数据。⭐️举个例子。 主机通过 Trim命令告诉 SSD逻辑页0-7数据删除了你可以把它们当垃圾处理了。收到 Trim命令之前逻辑页0-7有以下映射它们分别写在物理地址PBA a~h上。 一般FTL都有3张表 FTL映射表记录与每个LBA 对应的物理页位置Valid Page Bit Map(VPBM)表记录每个物理块上哪个页上的数据是有效数据Valid Page Count(VPC)表则记录每个物理块上的有效页个数。 SSD 收到Trim命令后为了实现数据删除固件要按顺序执行如下所示步骤1~4。 Trim的基本实现逻辑就是这样不同的SSD在实现时可能略有不同比如如果没有有效数据位图就没有步骤2。需要说明的是上图所示步骤5~7是处理Trim命令后完成垃圾回收的操作它们不是Trim命令处理的部分。Trim命令是不会触发垃圾回收的。
磨损均衡
磨损均衡就是让SSD中的每一个闪存块的磨损擦除都保持平衡。⭐️为什么需要做磨损均衡 闪存都是有寿命的即闪存块有擦写次数限制。一个闪存块如果擦写次数超过一定的值那么该块就变得不可靠了甚至变成坏块。如果不做磨损均衡则有可能出现某些闪存块被频繁擦写这些闪存块很容易寿终正寝。随着数据不断写人越来越多的坏块出现最后导致SSD在保质期前就挂掉了。相反如果让所有闪存块一起来承担用户数据的写入则能经受更多的用户数据写入。 ⭐️一个闪存块寿命有多长呢 从SLC 的十几万擦写次数到MLC的几千擦写次数然后到TIC的一两千甚至几百次擦写随着闪存工艺不断向前推闪存的寿命是越来越短——SSD对磨损均衡处理算法的要求越来越高。 冷数据用户不经常更新的数据比如用户写入SSD的操作系统数据、只读文件数据、视频文件等。热数据用户更新频繁的数据。频繁更新会在SSD内部产生很多垃圾数据新数据写入导致老数据失效。年老的块擦写次数比较多的闪存块。年轻的块擦写次数比较少的闪存块。 ⭐️动态磨损均衡 基本思想将热数据频繁更新的数据写入年轻的闪存块以避免频繁写入年老的闪存块从而保持闪存块擦写次数的均衡。 ⭐️静态磨损均衡 需求原因冷数据不经常更新的数据一旦写入某个闪存块由于有效数据多很少被选作垃圾回收导致这些块的擦写次数增加缓慢。而其他块由于经常写入用户数据擦写次数增加迅速造成擦写不均衡。基本思想将冷数据移动到擦写次数较多的年老闪存块上让这些年老的块得到休息同时让年轻的块承担更多的写入操作。实现方法固件通常使用垃圾回收机制来实现静态磨损均衡选择冷数据所在的闪存块作为源块并将有效数据读取后写入擦写次数较多的目标块。复制方式也可以采用复制的方式将冷数据从年轻块复制到年老块不论数据有效性都原封不动地搬移。这种方法实现简单不需要更新映射关系但可能会移动一些无效的垃圾数据。对于冷数据块来说这种代价是可以接受的因为这些块中的垃圾数据通常不多。 参考书籍《深入浅出SSD固态存储核心技术、原理与实战》第2版