SSD内部GC简介

SSD内部GC相关特性

由于CDS目前广泛使用的SSD是DC P4500,下面的介绍和分析就基于P4500进行。

P4500读、写、擦除、回收的粒度

P4500内部写是按照物理page 对齐,而擦除是按照物理block对齐,最终GC操作的trim是通过NVME 协议中定义的 deallocate命令(deallocate命令,顾名思义,就是用来告诉SSD控制器哪些page/block里的数据不需要了,
可以被SSD 控制器后续擦除。)为此需要对这些参数有一定了解,避免由于参数不对齐导致的额外的GC代价。

P4500 Nand 相关的参数:

P4500 存储芯片侧的相关参数如下:

属性 Size 含义
物理Page Size 16KB none
物理Block Size 24MB none
deallocate 最小Size 512B none
deallocate 最大Size 4MB none

说明:

  1. 物理Block Size的计算方法:
    page大小是16K ,一个block里面1536个page,因此一个物理block 大小是16K * 1536 = 24MB
  2. 一次deallocate 最大、最小的计算方法:
    deallocate命令属于NVME协议中的data management 类命令, 根据NVME 协议data management 命令的格式,可以看到表示其作用范围的data range字段定义如下:
    SSD内部GC简介

可以看到:当只用一个range,且range 中length in blocks == 1的时候,表示最小的范围即一个LBA 512B;当512个range 都用上,且每个range的length字段全都用上的
时候,可以涵盖的范围是512 16 512B = 4MB。

P4500 FTL 映射的粒度

P4500 控制芯片片侧的相关参数如下:

P4500 FTL映射是page-level 全映射,注意这里的page 是SSD主控芯片侧FTL mapping 的最小单位,在P4500中是4KB。 每8个连续的LBA(默认每个LBA 512B)需要一个4B的FTL mapping table entry。实际使用的DC P4500 容量为 4T, 因此需要1G个entry,占用SSD控制器内部4GB内存。

P4500后台的IO

下表列出了P4500内部后台的IO任务及其频率:

SSD内部GC简介

上表中标亮的部分都是需要占用整盘物理带宽的任务。根据从intel同事的了解以及实际观测写放大的结果来看,上表中的defrage(碎片整理)通常是影响整体性能的主要部分。
defrag 其实就是和下面要介绍的append存储引擎的GC过程类似。

SSD内部的defragment

SS的内部做defragment的时候,是基于greedy/cost-benefit/cost-age-benefit/cost-age-Times或其他算法找到符合条件的块,把找到的块中有效的数据拷贝到其他地方,
直接无效掉之前找到块对应的FTL mapping table entry, 然后更新接受有效数据的块的FTL mapping table entry。如果这样攒够了一个物理block大小到空闲块,
就可以把它erase 掉,然后把整个块设置为free状态。

如下图所示,Block x/Block y 都已经写入了部分数据,中间由于trim或者坏page等可造成部分数据无效,此时如果空间不足,就需要做碎片整理,如下图所示:

SSD内部GC简介

SSD内部的wear leveling

SSD内部需要做wear leveling是由SSD内部存储芯片的介质决定的。SSD内部存储芯片存储一个bit 0的时候,需要让电子穿透一层氧化物并且使之保持在那边;写1的时候,电子又会穿透氧化物会到另外一侧。
如果来回这样频繁跳转,会导致氧化物“变薄”,电子可能跳到非预期的一侧去。 允许这样跳转的次数的上限,就是其对应的寿命。SSD主控芯片为了避免整个SSD 句部由于频繁擦写导致提前老化,需要把写尽量
均摊到所有的NAND空间。这就是wear leveling. 对于某块频繁擦写的物理区域,会拷贝其数据到新的区域去,这会占用整盘的带宽。

SSD内部的Background Data Refresh

cell 可以理解是包括一个很薄的氧化层的半导体管子,是NAND上存储数据的最小单元。通常根据其触发transistor导通或者关闭的电压和阈值电压的比较,来决定齐表示的bit值。 不同于SLC一个cell只能表示0或1,MTL cell的阈值电压可以切分成4段、8段(对应TLC)、16段乃至更多,因此一个cell可以表示多个bit位。由于losing charge (漏电)的存在,导致用默认阈值电压可能无法读到预期的值,这在TLC/QLC中愈发明显。这就需要周期地读这部分数据,或者重新写一遍,或者把它remap到其他位置。这个过程就是refresh,显然它也需要占用一定的系统带宽。特别是在由此造成的retention error 在SSD常见错误占比很高的情况下,这个开销不能忽略。

SSD内部的Read Disturb Data Relocation

在MLC SSD内部存储芯片介质内读一个cell的时候,会把电压逐渐调大,直至cell对应的transistor开关导通或者关闭,然后根据此时电压值所落在最高电压的区间确定其所代表的值。正常情况下,这些电压区间会划分成几个
阈值电压区间。此外,还要求位于同一个bit line上的其他cell的transistor 保持turn on(bypass)状态,这就需要給这些cell施加比较高的Vpass 电压。而这个电压可能触发电子的隧道效应,导致抬高这些cell的阈值电压,
极端情况下根据默认的阈值电压去比较就会导致读出错。为此,存储芯片内部对于这部分阈值电压已经偏移较大的cell上的数据,需要搬移(Relocation)。

SSD内部GC简介

猜你喜欢

转载自blog.51cto.com/xiamachao/2392970
ssd
GC
今日推荐