本文共 7568 字,大约阅读时间需要 25 分钟。
雷锋网注:舒继武,现任清华大学教授、 博士生导师。近年来主要从事网络存储、存储安全、网络服务器、并行算法、并行处理技术及并行应用软件技术等方面的研究工作。他还是清华大学计算机科学与技术系分学位委员会委员, SNIA China(全球网络存储工业协会(中国))专家委员会委员,“高效能服务器和存储技术国家重点实验室”(浪潮集团)学术委员会委员。国家863计划信息技术领域“海量存储系统关键技术”重大项目总体专家组副组长。
6月14-16日,中国计算机学会学科前沿讲习班在北京开讲。作为数据存储方面的专家,清华大学计算机系教授舒继武在CCF-ADL第79期讲习班上为学术青年们带来了现有存储系统软件层的一些研究进展。舒继武教授本次的演讲主题为《闪存存储系统的软件层优化》。
以下为舒继武演讲内容,雷锋网进行了不改变原意的编辑。
磁盘自从2000年以来,带宽100兆左右,没有太大的变化,延时也没有太大的变化,往后我觉得即使有优化也不会很大。
另外一个,IBM 2020年要构建一个大的存储系统,它有2 GIOP/sec,需要500万块磁盘,占地超2000平方米,能耗高达22兆瓦。
现在PCIe的带宽,它的延迟有一个很大变化。如果基于这种来构建IBM2GIOP系统,用SCM存储的话,只需要8000个模块,占地面积大幅缩减,能耗近1000瓦。
自从1984年日本东芝推出闪存这个东西以来,应该来说变化很大,从当时的盘到卡,到现在的各种阵列,再到各种大的分布式系统。
那我们来看看在结构上有什么变化?另外一点我想说明,闪存来构建外存储系统有哪些优势?第一个是低延迟、高带宽;另外一个是成本优势,IOPS来构建的话本身因为它的高带宽、低延迟,所以它得到的单位IOPS应该比磁盘大得多。它从成本上来讲应该是比磁盘便宜的。
另外一个因为它是电子的,不是机械的,所以可靠性、能耗都不用说了。从早期Flash的扩展卡到现在应用的情况下,盘这个东西大家都知道,包括我们现在很多的小卡,那像这种东西它的接口问题,容量问题等得不到解决,所以这个肯定是一个基础的问题。
后来就发展到卡,那就是说PCIe的这种闪存卡,把它插到这个主机上来构成一个系统,它的好处是什么?利用这个本身强大计算能力和超大内存,所以这个卡能够得到很大的发挥。
还有就是它的很多driver,在这些主机上,它能够做到很多的异地更新,包括对于系统的开放,能够做很好的一些针对性的开放。而且在这个发展过程当中也经历过一个过程,从早期这种卡的应用,这种大的盘应用,要提供很多层,到后来卡的应用当中,它把很多层给跳过去了。
那当然它里面很简单的一个问题是它容量做不大,你一块卡现在1T、2T,另外一个,这个卡的散热非常成问题,我们有早期的,2013年、2014年从华为拿到的卡,可以达到七八十度,把鸡蛋放在上面都能够烤熟,所以这个都是它的一些问题。
那因为它的容量做不大嘛,它的可靠性也有问题。后来就发展到成为SSD的阵列,这样它的容量就可以变得很大,可靠性也会做一些提升。那做阵列的话有两种方式,像SSD这种规格,就像用磁盘一样的模式,那这样的话有很多问题,就是磁盘长大。从工业化的角度来看它不用做太多的事情,当然它肯定要SSD要做一些优化。
当然也存在会发生那种性能上突然下降等类似的问题,它只是对控制器做了优化,但是还远没有发挥SSD本身的一些特点。
后来有一个厂商就说,做一个全新的磁盘阵列控制器,重新设计这个控制器,完全是面向SSD的,那在这里面要考虑很多东西,它的控制器得考虑到SSD本身的垃圾回收,包括新的一些操作,并发的一些操作,完全是一个全新的,不像这种只是优化的,因为这个还是在磁盘的基础上做一些改进,像这种就是完全不考虑磁盘,面向SSD的,那它的性能应该来说有一个量级的变化。
你要构建一个大系统可能还是不够。磁盘阵列达到几十T也就了不起了,后来有一个分布式闪存阵列,这一个是CMU,它考虑角度不一样,前面的磁盘阵列它是考虑IO子系统的性能和可靠性。
它一直考虑的是怎么把性能做一个匹配,所以基本上用的是低主频的CPU来构建分布式的闪存集成系统,所以在这方面做了很多的应用。
后来UCSD他们也构建了一个系统,但是这个系统跟前面的不一样,它主要考虑的是性能和匹配的问题,这个考虑的是能耗问题,就是在单个板子上级成了256GB的Flash和2G的DRAM来构建这么一个东西,做了很彻底的一个优化和一个重新设计。在这个重新设计主要是考虑并发的。
从结构来看,我们从盘到卡到阵列,到现在构建分布式的存储系统,应该来说还是有一个很大的并发的,应该来说这个能够在真正的大型卡上能够用的东西。
当然这是从结构的并发来看,但是问题来看是软件的问题。
我这里举一个例子,这个是大家都能够看到UCSD曾经在2012年发布的这么一个东西,我们早期的磁盘因为比较慢嘛,那你这个软件的话慢一点它显现不出来。我们认为现在用PCIE这种Flash的话,软件开销能够达到21.9%。
那么我们来看看在这方面,应该有很多应用,按照层次我简单画了一下,当然这不是一个很严谨的图,就是我们做闪存系统,可能下面有一些闪存的硬件的东西,当然这个也可以是阵列,也可以是裸的。
在这之上可能有一些接口,还有包括FTL,当然有的FTL可能在这里面不包含,把它合到上面去了等等,有一些新的转化层,包括上层有一些文件系统还有一些数据库,再上面有一些应用。
再一个就是文件系统,做得就更好了。再就是这个闪存的KV存储等等,在这方面应该有很多的事情做。我们还在这方面做了一些事情,这个红色的是我们团队做的一些事情。
这是大概说一下,这是软件层的一个变化,需要做一个很革新的变化。我们来看看要做哪些变化。
因为传统的这种磁盘的模式很慢,CPU给一个信令,CPU就处理(还不能干其他的事情),完了以后再来弄。但是现在你的硬件快了,你还用这种中断方式的话,上下文切换就很耗时间,所以CPU这么切换,它可以用其他的一些方式,。所以在这种情况下,传统的这种终端方式代价很高。
另外一个就是存取路径,那传统的磁盘结构文件系统,包括内存拷贝了几次,两次拷贝过了等等,那在这个过程当中可能你的路径要缩短,甚至要把一个层级合并。打个比方,文件系统,你的文件系统要做存储管理,你的FTL也要做存储管理,你认为就完全是一种重叠的,是不是可以把这一层给处理掉,这样的话你的IO能够大大缩短匹配这个命令时间。
另外一个就是软件接口,因为磁盘和这个SD还是不一样,包括它还有日志等等这些东西,所以在这方面提出了很多的一些相关领域软件接口,这是事务方面的事情。
下面我就谈谈这个事务方面处理,闪存的事务处理这方面有很多研究,它有利用闪存的异地更新特性在存储设备中提供原子写入接口,避免双重写入。
这里面有几个层,这个是PCIE上的一个文章,就是你这个事务,如果说我在这个过程中系统崩溃了,他会去扫描,如果这有一点事务写完了,我这个就好弄。这是一种它的指针,我把这个事务串起来,我最后来解读这些指针是否是闭环,当然这个是串行,这个可以同时扫描,可以并行来做,那它处理事务就快。
那按我们的方法就是,我用一个窗口,事务即使在窗口中崩溃了,也只是回到这个串口里,所以通过这种模式,使得我们这个事务应该比传统的要快一点。
那么我们这个接口的话,在一致性考虑的情况下,我们这个性能提高20%多左右。
在这个基础上我们也进一步做了优化,对这些做一个差异事务处理,当然在这里面我们考虑了一些事情,就是说异地更新,在这里面有最早的这种东西,日志管理到事务本身的一些特性。
那么再就是讲一下文件系统,刚才讲文件系统的问题很大,第一个我刚才讲了,文件系统要管理,到了这个FTL,你要在上面做优化根本很难,这不是你想象的,是一个很大的危害。
另外就是哪怕它是一个逻辑的东西,你没有那么容易,所以你在上面做一些优化的话很难。
再一个就是我们所有这些东西,都是这个特性的考虑。因为它是异地更新,异地更新既有它不好的地方,好的地方是能够在这个磁盘上有两个版本。
我们来看看从FTL,包括单层开始,怎么来用它,实际上FTL这个东西是一个很好的东西,Flash构建这种磁盘在系统中用。
那后来就把它用到我们的服务器上,那服务器上就相当于用了一个FTL像磁盘来用,那这样用起来很好、很方便的。但是这个事情我就说存在着几个问题。
这里面很重要的一个事情就是冷热(数据)分组,这是个很关键的基础。那么在这里面有一个NAT的表,因为在这里面会有不停地更新,这个很耗性能,也是产生很大的一系列延迟型问题。
另外一个就是有地址对齐的这么一个方式,使得它对这个效率能够得到更高,而且能够保证它的一致性。那这个现在已经开源了,大家可以在上面拓展一下。在这个方面它有一定的性能上的提高,比如说F2FS上面,在SATASD的环境下,能够提高2.5倍,在PCIESD的环境下能够达到1.8倍的提高。
那这个工作虽然是在这方面,三星做了一些优化,但是依旧还有很多问题没有解决,而刚才说的文件系统那些都还没有考虑。后来FusionIO做了一个事情,说你现在FTR是在这个磁盘上,后来就有人把这个FTR放到服务器主机上来做,这还是有差别的。
你想想一个磁盘阵列,它阵列上的内存很小,FTRSD上面的内存很小,它的计算能力虽然有芯片,但是计算能力很弱。如果我们把FTR放到服务器上的话,它可以利用主机强大的计算功能和大内存,使得这个FTR的能力变得很强,这样的话,它的性能、很多功能也能够提升很高。
而其他的设备,你没办法做很多的优化,它上面把裸的东西挪上去了,能够在上面知道下层的一些分布,以及对应的通道都能够识别得出来,包括角度都能够在这上面做,所以这应该来说是一个很大的改进。FusionIO和普林斯顿做了这么一个文件系统,就是这个文件系统和和你的FTR功能有一些冗余。另外一个就是它对FTR做了一些简化。
我们来看看FISHIO提出了DFS这么一个文件系统,这里面主要是提到了这么一个接口,使它能够提供一些原子性。另外一个有底层的log机制,使得不要做额外log机制。另外这个文件系统的块分配操作,就是文件系统的管理全部交给地层完成,这是FusionIO的一个思想,就是把FTR拿到上层来做,主机层和文件系统融合在一起,这样的话性能提升还是很明显的,这使得EST3它的直接读写性能够提高20%左右,缓存性能能力提高1倍多。
但是这个思想的话也存在一定问题,它上面是没有考虑闪存文件系统寿命。那么我们在这方面曾经做了一些工作,包括这三个方面,我们提出了一个对象,就是把每个系统分为两块儿,一个是命名空间管理,一个是存储管理,那这个存储管理就是像把FTR也拿上来,和文件系统的存储管理合在一起,提出来一个对象式FTR,是一个对象存储管理。另外一个对这个文件系统命名空间也做了一些管理,里面一些消息,一些目录的频繁更新,我们做了很大一些优化。
另外一个我们对这个闪存底层芯片并发处理我们也做了一些优化,这个发表在FAST13和FAST14,以及ATC16上面做了一些事情,包括怎么考虑它的耐久性,怎么根据闪存的特征对它设计新目录树管理来做优化。
我们来看看这三个步骤里的第一个步骤,就是做了一个对象式的FTL这么一个稳定性,把它拿到文件系统里面的管理来,那么在这个里面有一些相关技术,提出来一个接口,能够获得上层更多信息。另外一个我们在这里面做了一些压缩,能够减少它的一些写入量和寿命;还有就是在这个理论的管理上也做了一些优化。
我们做了一个测试,在同步的情况下,这个写入量, OFSS平均写入数据量为ext3的15.1%,ext3的52.6%,btrfs的10.6%;在异步情况下,OFSS平均写入数据量为ext36%,而et2的80.2%,btrfs的15.1%。
那么下一步的工作就是我们怎么来利用优化Flash的命名空间管理,在这个里面讲这个目录树有时候更新一页或者一块,这个过程的话很多它都是小写,也是很频繁。那么在这里面就是说目录树怎么来构建,把它做了一个分离,当然这个过程当中为了维护它的一致性,我们用了嵌入式的反向指针。另外一个在这里面做了一些压缩,使得它能够很快速地持久化,就是优化它的命名空间。那么这个工作的效果是这样,从性能和寿命跟已有的做了一个比较,在性能、寿命上也得到了一定的提升。
那么下面一个是我们的第三个工作,怎么来感知内存内部的并发,因为FLASH系统有很多带、有很多block等等,实际上这些东西都可以并发的,当然在这方面也做了一些相关的工作。
另外一个就是我在这个里面考虑到与固定协同的垃圾回收,就是相当于这里面的并发感知请求调度,而且是在这里面做分配的时候,我可以对它做一些调度,而且能够优化这些调度,甚至并发感知来做这么一个事情,这是我们做这个事情的三个思想。
那这个思想的话,我们也做了一些测试,效果还不错,能够取得达到1到2倍的最好性能,而且跟三星公司也做了比较性能比较。
好,刚才讲的就是文件系统,文件系统还不止这些。只是现在我个人认为还没有说哪个文件系统把这些问题都彻底解决,或者说很成熟地在用,所以在这个方面应该还有一些事情在做。
另外一个就是在上面的话,还有一些做KV数据库的一些事情。这个是北大他们做的一个系统,能够给你提供来绕开这个文件系统,这样你的IOlogging就明显地缩短。另外一个就是它这个是一个基于裸闪存的KV数据库。
那么,这是2016年威斯康星做的一个KV系统,它就是把K和V分离出来,传统的K和V是存在一起的,但是要是K很小,就是4个字节,那你这个东西如果要做一个排期的话,那把KV都这么导进来,一个性能慢,一个是还要里面有寿命的问题,所以就要把K和V来做一些分离,来解决它写放大的问题。
但是它这种思想就很好地能够发挥到闪存随机读的特性,而且它的这个效果也不错。这是它的一个比较,就是传统的LSM-tree构建的KV系统,它一般的带宽也就是2兆到4兆,但是它这种分离了之后,它的性能呈这么一个显示,1KB它能够达到100多,所以说这个性能应该是有一个很大的变化,威斯康星提出来这个key value还是一个很了不起的一个工作。
ATC有一个工作,就是对闪存的接口来做一些扩展,,传统的KV系统中有这些东西,你要做这个logging,你甚至还要mapping,还要在这里面做一些垃圾回收、做一些处理,那你的FTR不是也有这些东西吗?它就把这里面的两块儿有重叠的做了一些简化,做了一个合并,同时还提供了一个接口,使得它的FTR得到一个可扩展的接口,把这个移植到FTR中,这是它的一个思想。
那这也是一个很重要的思想,它的结构是这样的,所以说这里面的KV的logging就短了很多。那像这种情况下可以看到它结果的比较,叫做NVMKV的系统,它的性能明显有一个大的变化。
所以这是刚才讲的软件存储系统里面的工作,主要讲的就是里面的这个接口,就是通过这个机制传到终端,那你现在还能用终端吗?还是会用更好的方式。再一个就是它的IO logging的层次,再就是接口问题,它的事务处理问题,主动说了一下它的文件系统和KV系统,所以说它的这个软件还是有很多的优化。只是现在来说应该还是一个热点,还有在做。
就我了解,真正的大闪存,在很多的应用中还没有说真的把它用上,这也是作为一个磁盘阵列或者说作为一个缓存,作为它的一个部分,它还真正没用上,这是因为这些软件还是不成熟。
那么我们这刚才讲了,这些软件要做,你要构成分布式的这种闪存系统,分布式的协议是很重要的。这应该是微软他们提出来的叫做CORFU的这么一个协议,它把那些闪存作为一个裸闪存,当然这个闪存是经过定制的,它有网口接口。
为什么说它有网卡的接口,它不是说把一个阵列或者说一个服务器弄到网上,一般就是把服务器上有很多的闪存卡或者说磁盘阵列构建这么一个分布式系统,它把这些闪存直接放在网上,用一个网连成一个大的存储池,在这个过程当中它的协议就不一样了。那传统的要经过服务器那些层次,它是将闪存直接连到网络上。
另外一个为了保证它的强一致性,在里面也做了一些工作,这是它的一个构建,当然优点就是很节能,就是卡嘛,但是你一个服务器的话达到250瓦。
这是另外一个低延迟,它读写延迟低于1ms,而且故障恢复也很快,它保证了一些性能的事情。当然问题就是因为你这个卡是要挂在网上,它做了一些定制,有网卡在这个里面。
当然用起来还是比较受限,它的这个协议还是性能的问题,所以微软在这个基础上又进一步地做了优化,那么这种情况下提出了一个in memory的数据结构,这个结构主要是提供一个接口,使得你这个闪存中间能够发挥它,而且底层协议能够得到进一步的简化,它这个就是利用树结构做了很多的抽象。所以这个协议开销是相对于刚才的CORFU来说有一个大的降低,而且他这里面也做了一致性、持久性、原子性、隔离性。
那么,它的问题就是可扩展性的问题,还要受环境的一些制约,特别是在里面做checkpoint的时候,这个客户开销比较大。
实际上在协议上面我们也做了一定的工作,我在这里面因为做得比较简单,就没有放在这里面讲。实际上我个人认为,真正的将来要用上,这个协议应该来说是一个很大的变革,现在这个东西应该是基本上都认可了它的低延迟。怎么来跟它结合,我会在下一阶段提到这一点,它应该来说还有一些值得研究的事情。
刚才讲的就是怎么来构建外层,我再讲一点构建外层的一个展望,就是我个人的定义。
第一个就是软件管理,软件的问题应该来说是里面一个很重要的问题,接入PCIE的SFlash,下面就是磁盘的0.31%,软件开销不得不重视,它包括很多方面的内容。另外一个,我们传统磁盘的这种系统,软件经历了几十年的发展,有很丰富的一些功能,那这个功能应该来说也希望在这种面向闪存的存储中也应该得以保留,而这些功能又存在一些冲突和矛盾,怎么来处理这些东西,然后希望能够把发展几十年的功能在新构建的环境下用得上,在这里面应该是一个很大的挑战。
这里面存在一个软件的低开销和这些管理功能之间的矛盾,这是一个值得考虑的事情。
此外,这种系统的变革应该来说是颠覆式的,外层的系统怎么来重新审议。那么内层的系统,现在新的存储系统除了闪存之外,应该发展了有十多年了。现在像新的PCM这个东西发展出来,那它肯定是要去做内存,它的性能应该更好,更能解决内存的一些特性,而怎么来构建,应该来说也是一个很大的挑战。