数据的存储介质-固态存储SSD

照章节目录,本周的主题是SSD。在外面,介绍SSD的文章很是之多,在个人文章里面就不重复其余地方介绍过的知识了。赶在睡觉时间以前发出来,但愿你们可以轻轻松松了解点知识,而后合眼睡觉~算法

在本篇文章中,我想着重的分析如下几个问题:后端

1.在不一样厂商的实现中,SSD的读写iops为何会有如此之大的差距?缓存

2.SSD的优点在于没有寻道时间了,为何4K随机写还会是个性能大瓶颈?ide

3.FLASH控制器,看来成败就看他了!把他扔在那里最合适呢?性能

在不一样厂商的实现中,SSD的读写iops为何会有如此之大的差距?测试

第一个问题是我第一次接触SSD的时候就一直不大理解的问题,由于厂内也作了ssd相关的尝试,所以也接触了几类厂商的ssd成品。在整个测试中,性能指标的差距很是之大,让我印象很是深入,所以也一直有一个疑问,为何在不一样的ssd存储产品中的性能差距会这么大呢?这个问题我也问过不少人,也看过很多资料。在下面,我来尝试回答一下这个问题:优化

首先须要先介绍一些固态磁盘的基础知识,目前主流的ssd,使用的存储颗粒是NANDFLASH,他主要由以下几个关键的组件组成:线程

1.协议转换层(可选),主要是把ata/sata/scsi/ide这样的磁盘读写协议转换为针对NANDFLASH的读写访问请求。这个开销可控,不是咱们今天要介绍的内容。设计

2.FLASH芯片控制层,是整个ssd最重要的部分,也是本章的主角儿~,直接决定了ssd的一切。有一些实现中,须要SDRAM来作缓存支持,并有本身独立的CPU。对象

3.NANDFLASH芯片,存数据的地方

首先来看看NANDFLASH芯片

NANDFLASH芯片主要由Single-levelcell(SLC)/(Multi-levelcell)MLC两种。

从名字看来,彷佛MLC比SLC要高级,其实不是--,简单来讲,SLC就是一个单元只存一个电位,所以SLC一个单元能够表示一个bit,而MLC则会存储两个甚至三个电位,所以MLC一个单元能够表示2或者3个bit。表示的bit越多,存储相同数据所消耗的存储单元就越少,所以价格就越便宜,不过由于单元自己写入有次数限制,而一个单元表示3个bit,也就意味着其中只要变化一位的数字,单元就必须进行一次擦写,所以MLC的寿命会低不少。

MLC和SLC在控制层中的优化方式可能有很大的不一样,不过为了简化,咱们以SLC做为后续谈论的主要对象,来看看SLC的一些具体的技术特性。

对于用户来讲,闪存要求用户一次读取4Kb的数据,用时4微秒。而向其写入4Kb的数据,用时为250微秒。通常的,咱们将4Kb的数据称为一页(page)

对闪存来讲,删除是个特殊的操做,须要作一下详细的解说,由于几乎闪存中大部分的复杂性都来源于NAND删除操做的特殊特性:

对于NAND来讲,删除是个很是耗时的操做,所以,为了取得最高的时效,NAND要求一次删除的最小单元是256KB,也就是64个Page要一块儿删除掉,为了描述方便,咱们把64个page合并到一块儿,称做一个块(block)。这样能够取得最好的删除效能。耗时约2000微秒。NAND自己没有“更新”这个概念,对于它来讲,一次更新等于一次删除加一次插入。后面咱们在分析flash控制器的时候会使用到这些特征,请多看几回:)

了解了NANDFLASH芯片的特性以后,就请随我一块儿进入FLASH控制器的领域,来尝试回答一下:在不一样厂商的实现中,SSD的读写iops为何会有如此之大的差距?这个问题吧~

让咱们来看看FLASH控制器主要在承担的职责有哪些:

1.协调多块NAND芯片,使用并行技术,提高整块磁盘的读写吞吐量和IOPS

在上面,咱们已经知道一块NAND可以实现的写入和读取性能实际上是有限的,而若是可以将多块NAND合理的组织到一块儿,使用PARTITION技术进行数据写入的切分(好比按照key取模,或者使用映射表)和并行执行,就能够充分的利用多块NAND,达到提高读写吞吐量和IOPS的做用了。

2.处理写入放大问题

NAND芯片要求一次必须删除64个页。而这些页内颇有可能出现一些尚未被标记要删除的数据,这时候若是咱们要往这些空间中写入数据,就须要将这64个页一块儿读出到缓存中,而后调用NAND的接口删除这个块(block)。很明显的,这里会有一些额外的誊写操做,这就形成了没必要要的的浪费,为了衡量这个浪费的严重程度,因而就有了一个指标叫:写入放大倍数,写入放大倍数=闪存中实际写入的数据量/用户请求写入的数据量

而这里,最理想的状态下,应该是全部页内的数据都是已经被标记为删除的数据,那么这样就不须要进行誊写了,这时候写入放大的倍数是1。也就是没有写入放大。

3.磨损平衡WearLeveling(WL)

NAND芯片自己都有写入寿命限制,为了保证让全部芯片均衡磨损,须要将全部写入和擦除均衡的分配到全部的block中。这就须要记录下每一个块的擦写次数,并尽量平衡全部块的擦写次数。

由于FLASH存储产生的时间比较短,从上世纪80年代至今也才三十几年,直到最近几年才有爆发式的增加,因此在控制器上面的积累远远没有成熟。差一些的控制器,受到成本和技术的限制,在并行写入程度以及处理写入放大问题上不大成熟,以致于在一些很便宜的芯片上,写入放大比率甚至高达4以上,彻底没法发挥出SSD的性能优点。

同时,从成本上考虑,在一些实现中可能会采起更少的RAM,更便宜的处理器来下降成本,RAM变少,会让SSD在进行写入以及垃圾回收中受到更大的系统资源限制,从而可能没法作出最优的写入策略。

以上这些也就解释了目前各类ssd在性能上差距如此明显的缘由所在了,由于整个产业尚未彻底成熟,各家的还在尝试寻找最好的软件算法和硬件搭配来让NAND可以更符合咱们的实际使用场景须要,所以就致使了性能上的巨大差距。

SSD的优点在于没有寻道时间了,为何4K随机写还会是个性能大瓶颈?

“在一些SSD产品中的随机写入性能比磁盘还要低”第一次看到这样的介绍的时候,相信有不少人也会马上眉头紧锁,这不是很奇怪么?在传统磁盘结构中,致使随机写性能降低的元凶是随机寻道,而在ssd中明明已经没有了磁头和随机寻道这些致使随机写性能降低的元凶,为何随机写仍是个这么严重的问题呢?

下面咱们就来深刻的进行一下分析:

若是用一个成语来形容ssd的随机写性能下降的话,那就是狼前虎后,通过了这么多年的努力才解决了磁头的随机寻道代价很高的问题,但还没来得及高兴几天,发现新的存储也存在着影响随机写的硬件限制。

这限制就是写入放大,而引发写入放大的元凶就是ssd的数据擦除成本很是高昂(请浏览前面NAND芯片介绍部分)

对于数据的操做,综合来看应该有如下这么几类:

4k插入:直接找个新的空页进行写入便可

4k删除:标记某个页已经被删除,由于真正的删除操做代价很高,因此最理想的状态下,应该是尽量将块删除操做延后,这样一个块内就会有更多的数据页有可能被标记为删除。当一个块中有足够多的页被标记为删除后。就能够进行真正的块删除操做了。

4k更新:NANDFLASH不支持原位更新,所以全部的更新都被处理为一次4k删除和一次4k插入。

块删除:(重要!)由于在实际的场景中,一块内的64个页中可能还有一些数据并未被标记为删除,为了保证这些未被标记为删除的数据不会丢失,须要要先把整个块都读取出来,而后将块内还没被删除的数据誊写到新的空块后,调用NAND的块删除命令来清除整块操做。天然的,若是誊写的数据越多,意味着用户的一次写入操做对应了屡次系统写入操做和块删除操做。

一旦块的回收速度赶不上用户进行插入/删除请求的速度,那么整个ssd磁盘的延迟就由单块写的延迟250微秒,变为删除加写入的延迟2250微秒。

这个延迟的上升就致使iops的陡降,并且降低后若是不给ssd恢复和整理的时间,那么整个ssd盘的性能就受限于删除延迟,从而出现了随机写入的瓶颈。

而若是应用是简单的顺序写和顺序删除,则全部数据只须要以块为单元进行删除和写入就好了,不存在写入放大问题,所以iops瓶颈在写入延迟,因而就不会出现特别夸张的性能陡降的状况了。

彷佛看起来问题还不大复杂,好比若是我设计一种策略,让一个后台进程尽量快的按期将被删除的数据比率很高的块进行回收就能够解决问题了不是么?若是只是如此简单那就太好了。。惋惜实际的生活远远不会天随人愿。。

SSD是有寿命限制的,所以若是回收进行的过于频繁,虽然对写入性能有极大帮助,但可能会致使ssd的寿命更快的耗尽。

所以,必须找到一个比较好的算法,可以平衡用户对ssd的实际性能需求,块的回收,以及磁盘的擦写寿命。

这也就是各家Flash控制器性能如此不一样的主要缘由之一了~

由于这里涉及到各家的核心技术,我是确定不可能有太深刻的了解的,不过经过合理的知识迁移和猜想,应该!可能!可以大概的描述处理这个问题的一些核心思路。

首先,随机写问题比较好的解决方案就是把全部的随机写变成顺序写,针对这个场景,在90年代以后已经有比较成熟的一套理论体系来解决这类问题了,它就是Log-structuredMergeTree,咱们在后面的章节会详细的介绍这套体系的理论基础,在这里只是作个入门。

这套体系的核心思路就是,你的全部更新和删除操做,都会被转换为一个log并被追加到文件尾部,这样就能够将全部的原位更新都转换为顺序写入,代价则是更多的读取次数,不过由于NAND的读取不是瓶颈,因此代价是能够接受的。

同时,后端有一组线程,从文件头开始顺序的读取全部的块,将块中未被标记为删除的数据找出来,凑够64个页后写到新的块中,而后调用块删除命令,清除那些已经完成誊写的数据块。

其他的问题就是考虑ssd的磨损平衡问题,尽量将誊写的那些数据放到擦除次数比较少的那些块内。

最后是经过各类实际的测试,找到一个最佳的均衡点,可以兼顾到性能,响应时间和NAND寿命。估计这个配置模型的价值应该能超越等值的黄金XDDDDDD.

FLASH控制器,看来成败就看他了!把他扔在那里最合适呢?

控制器要作的事情所须要的计算资源其实远远超出咱们的想象,举个最简单的例子,一个页4k大小,那么对于120G的SSD来讲,单单只是存储每一个页是否有数据这件事,就须要30’000’000个标记位,完成其余功能也须要不少计算资源和存储资源。

一个好的控制器既然如此影响性能,放在什么地方,由谁来负责进行计算和存储就天然而然的成为了一个很重要的问题。

在大部分的实现里面,控制器是一个专门的芯片,封装了本身的算法和存储芯片。

不过在最近,有一些公司走出了不一样的道路,尝试使用用户的CPU来进行计算和数据存储。

这两种方式各有优劣。

若是你使用了专门的控制器,那么好处是不会占用宝贵的中央处理器资源。而坏处则主要是升级有必定难度,而且计算资源会受到板载硬件的限制。

而若是你与用户共享中央处理器,那么好处是升级容易,用户甚至能够直接经过修改厂商提供的硬件驱动的方式增长更符合本身实际业务场景的写入策略,但坏处是会占用中央处理器资源。

目前来看,两种方式各有优点,后续也会相互借鉴进而更加完善,目前尚未哪一方可以彻底占据市场,在可见的将来应该也不会。

很容易能够看到,NAND芯片会随着产能的提高而进一步下降价格,而且Flash控制器的也会随着时间和用户数的增加而更加完善。目前在intel比较新的控制芯片中,写入放大倍数甚至已经可以在某些场景下达到1.1左右了,几乎不是太大的问题了,随着这些问题的解决,随机写性能将有进一步的提高空间,而成本将进一步下降。

能够预见,在将来,对于追求iops的数据读写类应用来讲,将用户常常访问的热点数据所有从传统磁盘搬到ssd上面应该是个趋势。自此,磁盘将是新的磁带,闪存是新的磁盘,内存为王。

相关文章
相关标签/搜索