深刻浅出计算机组成原理学习笔记:第四十七讲

1、引子

一、为何Windows操做系统、用了SSD的系统盘,就不能用磁盘碎篇整理功能?node

若是你平时用的是Windows电脑,你会发现,用了SSD的系统盘,就不能用磁盘碎片整理功能。这是由于,一旦主动去运行磁盘碎片整理功能,就会发生一次块的擦除,
对应块的寿命就少了一点点。这个SSD的擦除寿命的问题,不只会影响像磁盘碎片整理这样的功能,其实也很影响咱们的平常使用。算法

二、读多的场景数据库

咱们的操做系统上,并无SSD硬盘上各个块纸目前已经擦写的状况和寿命,因此它对待SSD硬盘和普通的机械硬盘没有什么区别。网络

咱们平常使用PC进行软件开发的时候,会先在硬盘上装上操做系统和经常使用软件,好比Office,或者工程师们会装上VS Code、WebStorm这样的集成开发环境。
这些软件所在的块,写入一次以后,就不太会擦除了,因此就只有读的需求。ide

三、写多的场景性能

一旦开始开发,咱们就会不断添加新的代码文件,还会不断修改已经有的代码文件。由于SSD硬盘没有覆写(Override)的功能,因此,这个过程当中,其实咱们是在反复地写入新的文件,而后再把原来的文件标记成逻辑上删除的状态。等SSD里面空的块少了,
咱们会用“垃圾回收”的方式,进行擦除。这样,咱们的擦除会反复发如今这些用来存放数据的地方。优化

 

有一天,这些块的擦除次数到了,变成了坏块。可是,咱们安装操做系统和软件的地方尚未坏,而这块硬盘的能够用的容量却变小了。spa

2、磨损均衡

一、磨损均衡

那么,咱们有没有什么办法,不让这些坏块那么早就出现呢?咱们能不能,匀出一些存放操做系统的块的擦写次数,给到这些存放数据的地方呢?操作系统

相信你必定想到了,其实咱们要的就是想一个办法,让SSD硬盘各个块的擦除次数,均匀分摊到各个块上。这个策略呢,就叫做 磨损均衡(Wear-Leveling)。实现这个技术的核心办法,和咱们前面讲过的虚拟内存同样,就是添加一个间接层。这个间接层,就是咱们上面讲给你卖的那个关子,就是FTL这个闪存转换层设计

 

就像在管理内存的时候,咱们经过一个页表映射虚拟内存页和物理页同样,在FTL里面,存放了 逻辑块地址(Logical Block Address,简称LBA)到 物理块地址(Physical Block Address,简称PBA)的映射。

二、FTL闪存转换层

操做系统访问的硬盘地址,其实都是逻辑地址。只有经过FTL转换以后,才会变成实际的物理地址,找到对应的块进行访问。操做系统自己,不须要去考虑块的磨损程度,只要和操做机械硬盘同样来读写数据就行了。

操做系统全部对于SSD硬盘的读写请求,都要通过FTL。FTL里面有逻辑块对应的物理块,因此FTL可以记个擦写次数少的物理块上。

这也是咱们在设计⼤型系统中的一个典型思路,也就是各层之间是隔离的,操做系统不须要考虑底层的硬件是什么,彻底交由硬件的控制电路里面的FTL,来管理对于实际物理硬件的写入。

3、TRIM指令的支持

一、在SSD硬盘的使用上会存在什么问题?

不过,操做系统不去关注实际底层的硬件是什么,在SSD硬盘的使用上,也会带来一个问题。这个问题就是,操做系统的逻辑层和SSD的逻辑层里的块状态,是不匹配的

二、平常的文件删除,都只是一个操做系统层面的逻辑删除

咱们在操做系统里面去删除一个文件,其实并无真的在物理层面去删除这个文件,只是在文件系统里面,把对应的inode里面的元信息清理掉,
这表明这个inode还能够继续使用,能够写入新的数据。这个时候,实际物理层面的对应的存储空间,在操做系统里面被标记成能够写入了。

因此,其实咱们平常的文件删除,都只是一个操做系统层面的逻辑删除。这也是为何,不少时候咱们不当心删除了对应的文件,咱们能够经过各类恢复软件,
把数据找回来。一样的,这也是为何,若是咱们想要删除干净数据,须要用各类“粉件粉碎”的功能才行。

三、SSD硬盘上删除数据的流程是怎样的

这个删除的逻辑在机械硬盘层面没有问题,由于文件被标记成能够写入,后续的写入能够直接覆写这个位置。可是,在SSD硬盘上就不同了。
我在这里放了一张详细的示意图。咱们一块儿来看看具体是怎么回事儿。

 

一开始,操做系统里面有好几个文件,不一样的文件我用不一样的颜色标记出来了。下面的SSD的逻辑块里面占用的页,咱们也用一样的颜色标记出来文件占用的对应页。

当咱们在操做系统里面,删除掉一个刚刚下载的文件,好比标记成黄色openjdk.exe这样一个jdk的安装文件,在操做系统里面,对应的inode里面,就没有文件的元信息。

可是,这个时候,咱们的SSD的逻辑块层面,其实并不知道这个事情。因此在,逻辑块层面,openjdk.exe仍然是占用了对应的空间。对应的物理页,也仍然被认为是被占用了的。

四、操做系统对于文件的删除,SSD硬盘其实并不知道

因此,在使用SSD的硬盘状况下,你会发现,操做系统对于文件的删除,SSD硬盘其实并不知道。这就致使,咱们为了磨损均衡,
不少时候在都在搬运不少已经删除了的数据。这就会产⽣不少没必要要的数据读写和擦除,既消耗了SSD的性能,也缩短了SSD的使⽤寿命。

五、TRIM命令是作什么用的?

为了解决这个问题,如今的操做系统和SSD的主控芯⽚,都⽀持 TRIM命令。这个命令能够在⽂件被删除的时候,让操做系统去通知SSD硬盘,
对应的逻辑块已经标记成已删除了。如今的SSD硬盘都已经⽀持了TRIM命令。⽆论是Linux、Windows仍是MacOS,这些操做系统也都已经⽀持了TRIM命令了。

4、写放大效应

其实,TRIM命令的发明,也反应了一个使用SSD硬盘的问题,那就是,SSD硬盘容易越用越慢。

当SSD硬盘的存储空间被占用得愈来愈多,每一次写入新数据,咱们均可能没有足够的空间。咱们可能不得不去进行垃圾回收,合并一些块里面的页,
才能匀出一些空间来

这个时候,从应用层或者操做系统层面来看,咱们可能只是写入了一个4KB或者4MB的数据。可是,实际经过FTL以后,咱们可能要去搬运8MB、16MB甚至更多的数据。
一、如何解决写入放大

咱们经过“ 实际的闪存写⼊的数据量/系统经过FTL写⼊的数据量=写入放大”,能够获得,写入放大的倍数越多,意味着实际的SSD性能也就越差,会远远⽐不上实际SSD硬盘标称的指标。

而解决写入放大,须要咱们在后台定时进行垃圾回收,在硬盘比较空闲的时候,就把搬运数据、擦除数据、留出空白的块的工做作完,而不是等实际数据写入的时候,再进行这样的操做

5、AeroSpike:如何最大化SSD的使用效率?

讲到这里,相信你也发现了,想要把SSD硬盘用好,其实没有那么简单。若是咱们只是简单地拿⼀块SSD硬盘替换掉原来的HDD硬盘,而不是从应用层面考虑任何SSD硬盘特性的话,咱们多半仍是无法得到想要的性能提高。

不过,既然清楚了SSD硬盘的各类特性,咱们就能够依据这些特性,来设计咱们的应用。接下来,我就带你一块儿看一看,AeroSpike这个专栏针对SSD硬盘特性设计的Key-Value数据库(键值对数据库),是怎么利用这些物理特性的。

首先,AeroSpike操做SSD硬盘,并无经过操做系统的文件系统。而是直接操做SSD硬盘的块和页。由于操做系统里面的文件系统,对于KV数据库来讲,只是让咱们多了一层间接层,只会下降性能,对咱们没有什么实际的做用。

一、AeroSpike在读写数据的时候,作了两个优化

其次,AeroSpike在读写数据的时候,作了两个优化。在写入数据的时候,AeroSpike尽量去写一个较大的数据块,而不是频繁地去写不少小的数据块。
这样,硬盘就不太容易频繁出现磁盘碎片。而且,一次性写入一个大的数据块,也更容易利用好顺序写入的性能优点。AeroSpike写入的一个数据块,是128KB,远比一个页的4KB要大得多。

另外,在读取数据的时候,AeroSpike却是能够读取512字节(Bytes)这样的小数据。由于SSD的随机读取性能很好,也不像写入数据那样有擦除寿命问题。并且,
不少时候咱们读取的数据是键值对里面的值的数据,这些数据要在网络上传输。若是一次性必须读出比较大的数据,就会致使咱们的网络带宽不够用。

二、如何提升响应时间

由于AeroSpike是一个对于响应时间要求很高的实时KV数据库,若是出现了严重的写放大效应,会致使写入数据的响应时间大幅度变长。因此AeroSpike作了这样几个动做:

第一个是持续地进行磁盘碎片整理。AeroSpike用了所谓的高水位(High?Watermark)算法。其实这个算法很简单,就是一旦一个物理块里面的数据碎片超过50%,
就把这个物理块搬运压缩,而后进行数据擦除,确保磁盘始终有足够的空间能够写入。

第二个是在AeroSpike给出的最佳实践中,为了保障数据库的性能,建议你只⽤到SSD硬盘标定容量的⼀半。也就是说,咱们人为地给SSD硬盘预留了50%的预留空间,以确保SSD硬盘的写放大效应尽量小,不会影响数据库的访问性能。

正是由于作了这种种的优化,在NoSQL数据库刚刚兴起的时候,AeroSpike的性能把Cassandra、MongoDB这些数据库远远甩在身后,和这些数据库之间的性能差距
,有时候会到达一个数量级。这也让AeroSpike成为了当时高性能KV数据库的标杆。你能够看一看InfoQ出的这个Benchmark,里面有2013年的时候,这几个NoSQL数据库巨⼤的性能差别

6、总结延伸

好了,如今让咱们一块儿来总结一下今天的内容。

由于SSD硬盘的使用寿命,受限于块的擦除次数,因此咱们须要经过一个磨损均衡的策略,来管理SSD硬盘
的各个块的擦除次数。咱们经过在逻辑块地址和物理块地址之间,引入FTL这个映射层,使得操做系统无需
关心物理块的擦写次数,而是由FTL里的软件算法,来协调到底每一次写入应该磨损哪一块。

除了磨损均衡以外,操做系统和SSD硬件的特性还有一个不匹配的地方。那就是,操做系统在删除数据的时
候,并无真的删除物理层⾯的数据,而只是修改了inode里面的数据。这个“伪删除”,使得SSD硬盘在
逻辑和物理层面,都没有意识到有些块其实已经被删除了。这就致使在垃圾回收的时候,会浪费不少没必要要
的读写资源。

SSD这个须要进行垃圾回收的特性,使得咱们在写⼊数据的时候,会遇到写⼊放⼤。明明咱们只是写⼊了
4MB的数据,可能在SSD的硬件层面,实际写入了8MB、16MB乃至更多的数据。

针对这些特性,AeroSpike,这个专门针对SSD硬盘特性的KV数据库,设计了不少的优化点,包括跳过文件
系统直写硬盘、写大块读小块、用高水位算法持续进行磁盘碎片整理,以及只使用SSD硬盘的一半空间。这
些策略,使得AeroSpike的性能,在早年间远远超过了Cassandra等其余NoSQL数据库。

能够看到,针对硬件特性设计的软件,才能最大化发挥咱们的硬件性能

相关文章
相关标签/搜索