场景:客户原来采用某款高端磁盘阵列的时候,处理某个作业,需要花费10个小时。后来采用了全闪存阵列,同样处理该作业,只需要1个小时就可以完成。闪存带来的性能优势非常的明显。可是运行了一段时间之后,忽然有一天,客户发现处理作业用了1小时20分钟。于是,问题来了,客户一方面觉得1小时20分钟比10小时还是快多了,一方面也会想,为啥比起1小时,我现在处理作业的时间慢了1/4?
。。。继续往下看。。。
SSD是由SSD控制器,FLASH存储阵列,板上DRAM(可选),以及跟HOST接口,诸如SAS、SATA、或者PCIE也就是我们通常说的NVMe磁盘。它的结构图如下:

上面的NandFlash表示的是Flash颗粒,SSD控制器通过若干个主控通道并行操作这些Flash颗粒,就像RAID0一样,这样可以提高数据写入的并行性以及效率。每一个Flash颗粒又进一步细分为多个block(块),每一个block又包含多个page,在SSD内部,SSD控制器和Flash之间的最小访问单元粒度是page。一般一个page的大小为4k,一个block包括16/32/128个pages。在写入数据的时候,像raid0的工作机制一样,同时并行地将数据写入到每个Flash颗粒的一个block中的可用的page中,当一个block写满之后会接着写下一个block 。
目前磁盘的分区格式大都变为GPT(也就是EFI)了,也就是将整个磁盘按照线性地址空间组织起来,通过LBA(Logical Block Address,逻辑地址)来寻址,每个LBA代表一个Sector。操作系统一般会以页的方式来访问SSD,当用户写入一页数据时,SSD控制器会从block中找到一个page来存放这些数据,并且同时将用户的LBA和flash颗粒中的page这种对应关系纪录下来,作为一条记录加入到SSD内部维护的一张映射表(Map Table),当有数据修改时,会更新映射表中的相应记录。当用户要读取相应的数据时,SSD首先会去查找Map Table中找到存放数据的pages,然后从中将数据读取出来返回给用户。关于映射表,不同的SSD是存在不同的地方的,对于有DRAM的,直接将映射表存放在DRAM里,而没有DRAM的,则将这些映射关系也存储在了flash颗粒了。
当使用机械硬盘时,文件系统可以直接将新数据写入到旧数据存储的位置,即可以直接覆盖旧数据。在固态硬盘中境况有所不同。如果想让存储无用数据的块写入新数据,就需要先把整个块删除,才可以写入新的数据,也就是说固态硬盘并不具备直接覆盖旧数据的能力。对于固态硬盘来说,垃圾回收是指把现存数据重新转移到其他闪存位置,并且把一些无用的数据彻底擦除的过程。上面介绍了,数据写入的方式以page为单位写入,但是要想删除数据却需要以块为单位。因此要删除无用的数据,固态硬盘首先需要把一个块内包含有用的数据先复制粘贴到全新的块中的页面内,这样原来块中包含的无用数据才能够以块为单位删除。擦除后,才能够写入新的数据,而在擦除之前是无法写入新数据的。
相比于常规的读取和写入操作,擦除有2个特点。
第一,擦除的速度比读写要慢。
第二,擦除的处理单位要比读写大。

回到文章一开始客户遇到的性能下降25%的问题,在我们了解完闪存垃圾回收的过程之后,就很容易理解了。一台40TB容量的闪存运到客户现场,起始都是“干净”的空白小块,写入速度很快。但随着数据的不断更新,或早或晚必然会出现区块间数据搬运,数据擦除等后台垃圾回收的相关操作,从而提供“干净”的小块给后续的写入操作。这些操作和前端应用程序并行,导致了性能的下降,我们称之为“写悬崖(Write-Cliff)”。
“写悬崖”仅仅是垃圾回收带来的问题之一。垃圾回收还带来的另外一个问题,叫做“写放大”。我们都知道闪存的每个Cell(颗粒)都是有写入次数的寿命限制的。垃圾回收导致了额外的Cell写入,加速了Cell寿命消耗。我们称之为“写放大(Write-Amplification)”
写悬崖和写放大都是闪存介质与生俱来的特性,无论是SSD固态硬盘,还是目前的全闪存阵列厂商,都无法避免这两个问题。
闪存厂商一般会通过介质材料,算法以及架构的优化等手段,来将这两种影响控制在一定的范围内。同时,对该问题处理的效果,也是衡量闪存阵列能力的因素之一。
写悬崖带来了全闪架构存储的性能损耗,写放大带来了全闪架构存储盘的寿命损耗。
比如目前业界市场占用率很高的某闪存阵列厂商,宣称通过以下手段来优化写悬崖的问题:
首先,采用“超供给”方式,通过提供更多的颗粒数量(比如用户可见容量40TB,而实际物理容量超过67TB),用于减缓整体闪存寿命的磨损,并实现更为灵活的预防性垃圾回收。
同时,采用了“带外”的垃圾回收处理机制,也就是为垃圾回收配置了专门的处理引擎,从而不占用处理前端应用数据IO的硬件资源。
此外还有均衡磨损算法,监测机制等手段,来优化缓解这两个问题。





