认识SSD

SSD越来越火,性能提升比较快,成本也有所下降,是未来的方向和主流,这里认识和学习一下SSD相关知识,以便更好的理解和应用SSD的特性。

固态硬盘(Solid State Disk)用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。 一块SSD,核心部件是一颗控制器和多颗Flash颗粒,一般还会有一些内存和超级电容。

  • 控制器主要作用是提供高效的手段来访问这些Flash颗粒。
  • 内存的作用主要是表项管理和读写CACHE。
  • 超级电容的作用是在异常下电时保证关键数据不丢失。
  • Flash颗粒是SSD最重要的器件,其相关特性决定了SSD的实现方式。

3.1. 定义和分类

闪存是一种不挥发性( Non-Volatile )内存,在没有电流供应的条件下也能够长久地保持数据,其存储特性相当于硬盘,这项特性正是闪存得以成为各类便携型数字设备的存储介质的基础。 Flash颗粒是SSD最重要的器件,其相关特性决定了SSD的实现方式。

目前业界主要有两种类型的Flash技术:NOR(Intel开发)和NAND(东芝开发)。由于这两种技术在如下方面的一些差异:

  • NOR的读取速度略快于NAND;
  • NOR的写入速度远低于NAND;
  • NOR的擦除速度远低于NAND;
  • NOR的擦写次数约为NAND的1/10;
  • NOR的单元尺寸约为NAND的2倍;

导致1~16M的闪存市场主要采用NOR颗粒(主要用于保存嵌入式设备的程序),而更大容量的数据存储(例如SSD)则主要选择NAND颗粒。

3.2. SLC和MLC

NAND FLASH芯片,flash颗粒有两种类型:SLC和MLC

  • SLC:Single Level Cell,每个存储单元均只能存储1个bit的数据。只包含0和1两个电压符。
  • MLC:Multi Level Cell,每个存储单元能够存储2个bit或者更多bit的数据。包含四个电压符(00,01,10,11)。

3.2.1. SLC和MLC的比较

  • MLC容量比SLC大,且价格便宜。
  • SLC更简单可靠;
  • SLC读取和写入的速度都比MLC更快;
  • SLC比MLC更耐用,MLC每单元可擦除1w次,而SLC可擦除10w次。

一般而言,SLC主要用于企业级市场,MLC主要用于消费级市场。

下表显示了SLC和MLC两种Flash颗粒的一些性能指标:

比较项	SLC	MLC
随机读	25us	50us
擦除	2ms	2ms
编程	250us	900us
擦除次数	100k	10k

一颗NAND Flash颗粒,其内部被划分为若干block,每个block又包含若干page。page的大小一般为2k/4k/8k(同一颗Flash颗粒内的page大小是固定且相同的)。

Flash的一个特点是:不能对任意bit位进行0/1互转,只能按照一定的颗粒度进行擦除和编程操作;

  • 擦除 —— 颗粒度为block,是将指定block中所有的bit位全部设置为1;
  • 编程 —— 颗粒度为page,是将指定page中指定的bit位设置为0;

因此,对SSD进行写的操作实际上对需要写的Page所在的Block全部完成“擦除”(全部bit位置1)后,才能对指定的Page进行“编程”(部分bit位置0)。PS:实际上SSD硬盘在出厂时,厂商都会把所有Block完成擦除操作。

每一个IO读写都是下发给一个地址,这个地址称为LBA(Logic Block Address),其真正对应在磁盘上的地址称为PBA(Physical Block Address),和传统机械硬盘中LBA到PBA的映射通过磁轨、磁道、扇区来进行唯一对应不同的是,SSD的LBA到PBA的映射通过一张映射表来记录。

LBA的粒度是扇区,而Flash颗粒的擦粒度是block,写粒度是page,均为扇区的若干倍,在这种条件下,如果仍以扇区为粒度进行映射,虽然理论上可行,但是显然是增加实现难度和性能的.

同时,如果强制以扇区为粒度进行映射,会导致所需要的映射表空间超过物理内存的限制,这就直接决定了不可能以扇区为粒度进行映射。

即使以page为粒度进行映射,也可能存在物理内存不够用的情况(现在正在使用的SSD盘即属于这种情况),所以需要以更大一些的粒度进行管理。

这个粒度成为”小块(Sub Block)“,是SSD进行擦除和编程的最小单位。每个block中,均包含多个sub block;每个sub block,由多个page组成;每个sub block,可能的状态包括:有效、垃圾、空白:

  • 有效:该小块中的数据正在被引用;
  • 垃圾:该小块中的数据没有被引用;
  • 空白:该小块可用于写入新的数据;

SSD的写要先进行整个Block的擦除,然后才能对指定的Sub Block进行编程。实际上,如果某一个写操作需要修改一个Sub Block的内容,是无法直接进行修改的,而是写到一个新的Sub Block中,把该LBA的映射指向新的这个Sub Block,同时把原来数据所在的Sub Block标记为“垃圾”。

这样,随着SSD使用时间的越来越长,新的未被编程过的Sub Block越来越少,后面新的写请求则只能重新擦除所有Sub Block均为垃圾的Block才能再次写入,这样必然会造成写操作的性能降低,因此,在SSD内部引入了一个重要的机制——垃圾回收(Garbage Collection),用以提升SSD长期写入操作的性能。

垃圾回收的工作:

  1. 找出合适的block
  2. 将该block中的有效小块迁移到别的地方,同时更改映射表
  3. 将该block擦除,并放入空白块表

所谓“最合适进行回收的block”,是指这个block的垃圾小块足够多、有效/空白小块足够少。垃圾回收算法是否高效,与该SSD的性能有很强的联系。

上面说过,每个Flash颗粒中Block的可擦除次数是有限制的,如果颗粒中的某些Block很快达到了擦除次数上限,而其他大部分都几乎没有被擦除过,则会很快的造成整个SSD失效。而磨损均衡(Wear Leveling)则是通过各种手段,保证整个SSD所有的block的擦除次数是相近的从而延长SSD的使用寿命。

磨损均衡分为 动态磨损均衡静态磨损均衡.

  • 动态磨损均衡:是指在外部力量的驱动下,自然完成磨损均衡。这里外部力量,包括写IO和垃圾回收。
  • 静态磨损均衡:是指磨损均衡功能模块主动地查找那些长时间没有变化的数据,将这些数据搬移到其他位置,以便释放出擦除次数较少的block,使其投入到擦除/编程的循环之中。

虽然一个block擦写次数只有100k(SLC),但是因为动态映射、磨损均衡等机制的存在,使得SSD的寿命远不止写入100k个IO。 计算SSD寿命的方式,一般是先确认一个block在其生命周期内能够写入多少数据量,再乘以该SSD具有的block数量,再除以一个估计的写入带宽,最后得到寿命值。 以x自研的100G SLC SSD为例,16片Flash颗粒,每片颗粒拥有32k个block,每个block拥有64个4k的page,每个block可以被擦除100k次:

16 x (32 x 1024) x 64 x (4 x 1024) x 100000 = 12500 TB

12500 TB,这是当所有block同时达到擦除次数上限时,可以写入的数据总量。

按照用户平均每秒钟写入10MB的数据进行计算:

(12500 x 1024 x 1024) / (10 x 60 x 60 x 24 x 365.25) = 41.5 年

41.5年,这是在10MB/s的压力下、持续不断地向SSD写入数据的使用寿命。考虑到其他一些因素的影响,一块SLC SSD的使用寿命,10年是可以保证的。

9.1. SSD与传统磁盘相比

  • 第一是没有机械装置;
  • 第二是由磁介质改为了电介质。
  • 在SSD内部有一个FTL(Flash Transalation Layer),它相当于磁盘中的控制器,主要功能就是作地址映射,将flash memory的物理地址映射为磁盘的LBA逻辑地址,并提供给OS作透明访问。

9.2. 读方面

9.2.1. 随机读

SSD没有传统磁盘的寻道时间和延迟时间,所以SSD可以提供非常高的随机读取能力。

类型	参数
SLC类型的SSD	超过35000的IOPS
传统15k的SAS磁盘	最高160个IOPS。

9.2.2. 连续读

SSD连续读的能力相比普通磁盘优势并不明显。传统磁盘连续读,并不需要寻道时间:

类型	参数
SLC类型的SSD	超过35000的IOPS
传统15k的SAS磁盘	最高160个IOPS。

9.3. 写方面

Page为最小的读写单位,Block为最小的擦除/编程单位,其中1个Page为4KB,1个Block由256个Page组成,1个Plane由2048个Block组成,2个Plane组成1个Die,也就是最小的芯片(4GB)

向一个空白的page写入信息时,可以直接写入而无需擦除,但是如果需要改写某个存储单元(page)的数据,必须首先将整个block读入缓存,然后修改数据,并擦除整个block的数据,最后将整个block写入。SSD改写数据的代价很高,SSD的这个特性,我们称之为erase-before-write。因为这个特性,引入“写放大”的概念。

比如你想改写4K的数据,必须首先将整个擦除块(1024KB)中的数据读出到缓存中,改写后,将整个块一起写入,这时你实际写入了1024KB的数据,写入放大系数是256。写入放大最好的情况是1,就是不存在放大的情况。

在长时间写入后,MLC随机写IO下降得非常厉害,而SLC表现则比较稳定,可以稳定在3000 IOPS,而MLC随机写IOPS甚至降低到300。

当某个单元长时间被反复擦写时(比如Oracle redo),不仅会造成写入的性能问题,而且会大大缩短SSD的使用寿命。所以,引入磨损均衡算法(wear leveling)。

  • storage/深入认识ssd.txt
  • 最后更改: 2019/04/16 18:31
  • (外部编辑)