标签归档:清华计算机系舒继武

清华计算机系舒继武 CCF-ADL 讲习班下篇:持久性内存存储系统的研究与挑战

雷锋网注:舒继武,现任清华大学教授、 博士生导师。近年来主要从事网络存储、存储安全、网络服务器、并行算法、并行处理技术及并行应用软件技术等方面的研究工作。他还是清华大学计算机科学与技术系分学位委员会委员, SNIA China(全球网络存储工业协会(中国))专家委员会委员,“高效能服务器和存储技术国家重点实验室”(浪潮集团)学术委员会委员。国家863计划信息技术领域“海量存储系统关键技术”重大项目总体专家组副组长。

雷锋网消息,2017年6月14-16日,中国计算机学会学科前沿讲习班在北京开讲。作为数据存储方面的专家,清华大学计算机系舒继武教授在 CCF-ADL 第 79 期讲习班上为广大学术青年们带来现有存储系统软件层的一些研究进展。舒继武教授的演讲主题为“基于非易失存储器的存储系统软件层优化”。

闪存技术逐渐成熟并得到广泛部署,且一些新型非易失存储器件如3D XPoint、PCM等也得到相当的发展。然而,闪存及其他新型非易失存储器件与传统的磁盘和DRAM都有着相当大的差异,例如在易失性、寿命、读写性能、寻址、存储密度等方面表现出不相同的特征。现有的存储系统软件层次均面向磁盘和DRAM设计,并不能充分发挥非易失存储器件的特性,甚至可能严重影响非易失存储器件的寿命与性能。

在这节课上,舒继武教授和大家谈到了持久性内存存储系统目前的研究进展以及面临的问题和挑战。

以下是舒继武教授演讲内容,雷锋网作了不改变原意的编辑

存储系统成为计算机系统的性能瓶颈

闪存相对来说比较成熟一点,已经到了应用阶段了,从盘到卡到阵列到现在构建分布式的闪存。内存我们现在用的是DRAM,现在新的器件,特别是一些电子材料的发展,它们有一些好的性能,这个对我们计算机做系统的人应该是一个很大的冲击,那怎么把它用上,所以我下面来谈一谈在这方面的一些研究和挑战。

这是 IDC 2014年的预测图,现在 DRAM 的存储器性能的年增长率是7%,处理器的性能发展能够达到52%,处理能力与存储性能差距年平均增长50%,存储系统成为计算机系统的性能瓶颈。

这个瓶颈使得新器件的产生。新器件的硬件变化了,软件也要做一些变化。我个人认为应该是一个颠覆性的需求。现在我们大数据、云存储、云计算等很多应用的并发的发展,怎么构建一个存储系统成为新的需求。另外一个就是新器件的发展怎么能够使得我们构建系统的时候把它的优点发挥出来。这是我们构建存储系统要考虑的两个问题:对上我们怎么能够满足一些新的需求,对下我们要怎么样把它的特点给发挥出来。

新型非易失固态存储器件的优点我想简单地说一下,低功耗,这是一个。另外一个是它的高可靠、抗振动,掉电保护等等。

另外一个特点是潜在的高性能,为什么说潜在的?因为它的性能现在毕竟还不如DRAM,相差一个数量级,这些芯片器件的发展应该来说还是很有优点的。这些优点一旦用到我们的系统当中,对我们的计算机发展还是有很大的变化,特别是克服我们已有的内存弱点和它的步骤,缓解内存性能的等等。

另外的特点是零功耗和集成度高,就是在相同面积的情况下,用DRAM来做的话,可能做到2G、4G,但是如果你用PCM做的话,能够做到6G、8G,所以它的集成度能够做到更大,这是它的优势。

但是它的问题就是性能,这个性能还不均衡,所以这是它的一个挑战。另外一个就是器件寿命的问题,它的器件包括它在里面收到的一些其他干扰,都会对性能错误和寿命产生影响。

所以,传统的面向磁盘和DRAM的存储架构,应该说跟现在这种新的器件严重地不匹配,所以说软件的各个层次都要设计,而这种设计要把它的优点发挥出来,避开这些弱点,这就是我们下面要解决的问题。

我们首先来看一下内存结构的变化,就是DRAM到后面的磁盘,这是2G的结构,那这个2G的结构一掉电就没了。现在就是没有外存,我专门构建一个大的内存,这个内存可以是混合的,也可以是不混合的。它是持久性的,所以它的边界是在这个地方。这个简单的边界变化应该还是很大的,传统文件系统的模式,内存里面的数据格式,要把它写到磁盘上,内存的格式要把它变化成外存文件的格式,这里面涉及到页的转换,路径的问题还有系统调用的开销等等。但这个完全可以用store访问内存的方式来访问这个持久性的内存,所以这是一个变化。

这个红色的是我们在这个内存的空间管理以及持久性的模型上做的一些工作。

持久性内存编程模型面临的挑战

编程模型挑战性来自于几个方面:

方面一:软件接口,怎么提供一个访问的接口。接口是要考虑的,以访问内存的方式访问NVM。

方面二:指令集,既然是STORE的方式来访问的话,就要保证它的一致性。

方面三:为了提供一个好的模型接口,肯定要把这些东西暴露给你,让用户来用这个东西。虽然现在有NVML,但是还没有得到广泛的承认。

另外我要提供一些编程模型,像易用性,要考虑这个编程模型的复杂度,要更安全不容易出错,所以说在这个内存的编程模型上面,来自于这几个方面的挑战。

这里面要解决的问题就是一致性的问题,里面所有的操作、数据要很及时地持久化下去,持久化的顺序要求对于一致性来说是一个很大的开销。

为了提高性能,对数据进行重排,这个数据的顺序就变化了,在磁盘上不存在这个问题,因为它的一致性没问题,在这种NVM上一旦出了问题以后,恢复就存在问题了。所以像这种传统的缓存模式在这种情况下是不适用的。当然为了保证它,可以用传统的缓存再加上一些指令,像clflush等等指令来强制地做下去,来保证它尽快地得到持久化。

当然这个里面也存在问题,我们前几年做过测试,clflush指令的延迟能够达到100纳秒,如果加上mfence指令,延迟将达到250纳秒,所以说这个开销还是很大的。在这个方面就是怎么在保证一致性的情况下减少开销的问题。当然后面会提到节省开销来自于两个方面,它的开销来自于顺序化、持久化。

这是关于编程模型方面的一些挑战。那么内存空间管理的挑战,首先就是内存管理,当然这里能够看得出一个很经典的DRAM结构,或者说加了面向NVM的一个编程模型的结构,这样可以在这里面类似于提供这种DRAM的内存的一些访问接口,像PMack和Pfree这种情况,实际上对这种持久性内存可以做分配和回收。

另外一个就是内存,它可以做持久性内存,也可以不做持久性的内存,我也可以当做普通性的内存来用,那这里面怎么来对它做管理,这里面就存在这几个方面的挑战。

挑战一:NVM的内存分配操作需要考虑一致性,会带来额外的持久化开销,软件延迟更显突出。如何降低NVM分配器的分配开销?

挑战二:如何提供内存容量的扩展性,充分发挥DRAM性能和NVM持久性的优势。如何设计混合主存的管理和数据分布?

我们现在来看看文件系统方面的一些问题。文件系统方面,跟刚才讲的面向FlassSD的文件系统类似,就是说你原来针对的设计是基于SD或者说基于磁盘的,它的软件开销20%几,现在达到90%几,那这个东西就是软件一个非常重要的瓶颈。所以软件必须得做,这点不做好的话,最后将来这个系统的性能都被软件给吃掉。

传统的东西,在这个过程当中还需要这些内存和块的拷贝吗?到底需要哪些功能块?还有哪些新增的东西,都是在你这个软件的系统当中考虑的,否则DDR NVM 94.1%的软件开销是降不下来的,或者降得很少。还有一个就是要考虑NVM的耐久性,要考虑这个模型均衡,否则的话会加剧器件的磨损,影响它的寿命。

刚才讲的问题以及挑战,我下面分别讲一讲这几个方面的一些相关的研究情况。

新型编程模型

编程模型有几种:

  • 第一种:提供一个编程接口,这个编程接口比较早的Mnemosyne 。当然他们要求的是一致性应该满足ACID,就是可靠性里面的东西。

  • 第二种:一致性的协议就做得更多了,到现在的2017年有了Eurosys、ASPLOS这些文档来解释怎么来节省一致性的开销。

工业界也做了很多的一些事情,这是英特尔现在还一直在做的,提供非易失性编程库NVML。这个库里面包含了很重要的几个库,当然这些库是建立在一个持久性的库的基础上。那么这个方面的话,它这个是构建在一个PMFS上,基于C当然也提供JAVA。

他这个东西也带来很多好处、有很多的优点。英特尔也能够支持一些厂商,所以说这些厂商它里面CPU的一些指令能够放进来保证持久化,例如像Cflash、Mface等等这些。

另外他本身就支持C/C++,它不需要提供一些编程的支持。另外相对来讲,它的功能对比较全面,这是它的一些优势。

它面临的挑战就是较为复杂的编程接口,一致性编程容易出错。再一个是性能的问题,尤其在内存分配和事务原子性支持等方面。

刚才我们说编程模型里面考虑一致性的问题,那一致性的问题考虑就是开销的问题。开销来自于哪方面?一个是顺序化、一个是持续化。因为你要保证它的顺序不乱的话,我要按照顺序把它都写清楚,顺序错了以后,写进去的东西就带来一致性的问题。这个顺序性往往就是要求你这个东西只有一步步去做。

另外一个持久性,就是说你最后要把它挪到这个NVM上,在开销上做一些事情,这里面有几个事务,这事务是缓存,这是持续性的。如果说按照要求性管理的话,首先这个事务完了以后再把它刷下来,这是很严格的一致性的关系,性能肯定高不到什么地方去。

在这方面做的工作也很多,目前来说大概有这么几个纬度。一个是从软件的角度去做,一个是从硬件的角度去做。另外一个角度就是说怎么持久化和顺序化,因为这来自于两个方面:顺序化的开销,持续化的开销。

怎么把顺序化和持久化的开销减下来,还有就是从软件和硬件的角度做。

我们来看看它的第一个工作,这个是英特尔2009年做的——在处理器缓存中增加新原语,由硬件保证写入顺序。将程序执行用持久化屏障分成多个执行单元;执行单元内部可以乱序执行、写合并、执行单元之间有序持久化。

当然这个工作应该来说还是很不错的一个工作,但它仅仅是顺序化,持久化的开销没降低,那我们在这里面也做了一定的工作,怎么来持久化,怎么把它乱序,怎么把开销降低。那在这个方面当然我们主要有两个关键的技术:

  • 技术一:提交协议,什么时候来提交,对这个事务的提交状态做一些延迟,减少提交时刻的等待。

  • 技术二:主要是用固定的格式,来协商这个日志数据。另外就是怎么来预测持久化,在这里面来维护多个版本,跟踪事务的依赖关系。

这是另外一个工作,按照它的逻辑来讲,首先要对它来做一个持久化,这就相当于一个串行的执行。这个工作相当于把没有关联的东西并行做。所以说就是把多个无依赖关系的I/O操作也可以并行写回。相比于epoch Persistency,进一步放松顺序约束,更降低了它的开销。

这个是ASPLOS的2016年工作,它主要是利用了英特尔本身的一些指令集,因为在里面扩展了很多的指令集,像CFLUSHOPT就是按照一定的弱的顺序刷出操作。当然这个只是把它刷出来,没有保证这个东西写下去。虽然CLWB把它刷出来,而且是它里面的版本不让它失效,这样的话有可能就存在多个版本,这样使访问也能够提高性能。

前面的几个工作都是基于硬件而且是在缓存这个界面来做的。这个工作相当于是在内存控制器级别来对顺序化做一些减弱,或者说不让他那么严格。事务放在哪个地方,内存是很清楚的,它能够做的更灵活。所以他在里面提出了一些宽松的、一致性的模型来实现缓存的持续性,能够在这里面做到执行和逆执行和持久化,做一些分离,另外一个就是做到用户的调度。

这是ASPLOS的2017年的工作,相当于在指令集里面,对持久化和顺序化做一个分离,在这里面增加了一个持久化的Buffer,追踪更新的数据。

刚才讲的是如何降低一致性机制的顺序化开销,下面来谈谈怎么来降低持久化的开销。

降低一致性机制的持久化开销

持久化的开销就是需要数据能够把它及时地写回持久性的内存中,从硬件的角度需要做的两个工作如下:

一种方法是通过后备电源等硬件技术提供系统掉电后的数据备份,避免了数据因一致性导致的写回开销。另外一个是宾州大学做的,缓存也有非易失的,这样的话整个系统中没有易失性的器件,就不存在易失和非易失的边界,这样就降低了它的持久化开销。

从软件的角度来说,目前主要是基于写前日志(WAL)来做好这个事情,为了保证它的一致性,数据要到执行池里面,然后还要到日志池里面,最后再把它写回等等,这里面就存在多次刷clflush的命令。因为要保证它的持久化,这样的话开销就会很大,刚才讲的需要增加250纳秒的延迟。

那么通过持续化的工作,我们提供了内存数据库里面的两个指令,类似steal或no-force的缓存管理。这样就使得处理的数据少了一次拷贝,通过这个来降低持久化的一些开销。

当然这里面我们用了两个技术:

  • 一个就是相当于是在日志内来执行XIL,就是通过它的重组日志,使得没有提交的数据可以被写回这个NVM中;

  • 另外一个是对这个模糊边界做一个辅助的持久化。那么在这个里面我们通过这个日志中的持久化的版本来覆盖写一个东西,这样的话来减少它的持久化开销。

这是2017年的一个文章,他把这个持久化的过程分为三个阶段:第一个是如何把易失的数据写到易失的log里面;然后再从易失的log写到持久性内存里面;从持久性内存里面再写到持久性的data里面。

通过这三个阶段,而且在这个里面提供不同级别的持久化。尽量地避免undo log或redo log的一些操作,这是他的一个思想,来降低它的去耦合的持久化过程。

Eurosys 2017年的工作是说在这个过程当中要保证它的持久化,数据一要拷贝,而数据的拷贝都是发生在关键路径上。这个工作就是把数据拷贝到后台异步去做,即把它移出关键路径,这是它的一个思想。所以说Kamino-Tx还是个不错的方法。而且当然他也有其他的一些方法来保证这个事情,那这样的话数据拷贝的存储开销以及其他的一些开销也就降低了。

所以刚才讲的这个工作就是,在辩证模型下,怎么提供一个编程结构,给前面来用,那么这里面有几个工作,一个工作是提供一个内存文件系统,这上面导出一个数据结构供上面用,这个上面用存在着问题,所以存在很多的系统调用,这些东西都是保证它的一致性的问题。

一致性的开销来源于两个方面:数据怎么按照数顺序把它写进去,免得数据不一致;到比较的时候,这个数据一定要把它写回持久性内存中。

所以说这两方面的开销怎么来做,就是刚才讲的从硬件的角度、软件的角度考虑怎么降低它的持久性,顺序性的开销的问题。

持久性内存空间管理优化

刚才讲的编程模型,后面我再讲一下持久性内存空间管理方面的事情,主要是要考虑几个方面

  • 怎么考虑它的一致性的问题;

  • 另外一个就是混合内存扩展的问题,因为混合内存的数据肯定要利用各方面的优缺点,那么数据怎么来判别、怎么来存放这些东西

  • 最后的目的就是怎么能够更高效地发挥它的混合储存的优势。

那么这里有几个代表性的工作,2016年的Makalu,PVM,还有Thermostat这是ASPLOS2017年的工作,这三个工作简单地说一下。

这个工作就是主要是提供一个高性能的内存分配器,在这个过程当中,就会尽量Root一个512的一个集合。所以所有的数据在这里面写,都在这个阶段后面,都能够从这个后面能够访问得到,这是它的思想。

当然这里面主要是解决的两个问题:

  • 第一个,内存分配器的元数据修改;

  • 第二个,需要持久化指针指向分配数据。 

所以这是他的思想有四点:

  • 相当于是用了512个ROOT的集合,使得都能够找到元数据;

  • 另外他通过NVM分配器来简化了他的元数据设计,降低NVM分配的开销;

  • 快速的NVM分配器重建;

  • 有效的内存垃圾收集模型。

这个工作(持久化虚拟内存管理)就相当于一个内存的扩展,也就是说这个DRAM可以有它的管理器。那这个持久性的内存,可以把它分为两半,一部分是做持久性,一部分就是像DRAM一样来使用。那像这样的话,管理怎么来做。所以在这个里面,传统的在这方面的话,CPU的缓存和TLB的列表利用率都不高,所以他提出了一种方法,来使得他做了这么一个事情,实现了高效对象的接口。对于CPU的缓存和他的TLB利用率比较高,而且提供了一个自动扩展,就是我到这个不够还能够自动地来扩展它作为一个易失性的缓存。

那么这是ASPLOS今年的一个新工作,他这个工作就是相当于是怎么对用户透明的2MB大页设计和管理,就是考虑动态的冷热页区分技术,这是他的一个思想。

另外就是利用这两个的优点,就是把不频繁访问的数据,放在NVM上。这是一个内存的空间的这么一个优化的工作。

实际上来说,这上面仅仅是从某一个角度分别去解决,从你这个混合的管理,包括减少它的内存的分配的开销等等这些角度去做,实际上应该还有一些事情可做。

持久性内存文件系统构建

刚才讲的就是这个内存的空间管理的方面的一些现状和已有的一些研究工作。那么下面我简单地说一下,就是内存稳定系统的构建。

应该来说这是一个很重要的事情。

因为传统的文件系统有很多优点,所以能不能把传统的系统梳理成一个块,默认成一个块的设备,这样传统的文件系统无需修改,照样可以在上面能够用起来。

它的好处是RAMDISK的形式使得传统的文件系统快速受益于内存级的数据持久化,相比于外存性能有数量级的提升。

不足之处是软件层的开销巨大,无法充分利用持久性存储介质的优势。

这是一类,第二类是改造传统的文件系统。那这个改造当然是要考虑到NVM的一些特点。因为传统的文件系统是经过时间考虑的,是比较成熟的东西。这个是韩国做的工作,他们这边做了有三点:

第一点,他在这个VFS上面做了一个轻量级的优化工作,对它的一致性做了一个处理,使得一致性的开销尽可能低;

第二点,在Cache命令里面,原来是同步更新,现在变成了异步更新;

另外在这里面也做了一个multi-versioning的区域,使得能够在这里面做一些异步的处理。

当然这个工作有一个基本的假设,假设就是这个里面的,全都是持久性的文件系统。

其实,无论第一种、第二种方式还都是远远不够的。

那么最理想化的就是,完全针对一个持久性的NVM,来设计一个字节粒度的文件系统,在这方面的工作就很多。主要是怎么来考虑它的这个细粒度的数据访问,再一个就是把内外存做一个融合管理。

还有NVM本身的一些直写的东西,可以直接访问。不像传统的这种我还要有双层拷贝,还有块层的开销等等,来发挥NVM的一些优势。

这里面有几个代表性的工作,第一个就是微软的,他们在2009年提出的字节寻址的持久性内存文件系统。再就是英特尔曾经做了一个轻量级的持久化的内存文件系统PMFS等等。

持久性内存存储系统展望

以上的报告主要讲的就是,从编程模型、内存管理到文件系统,这三个方面。 那么这三个方面,应该来说还有很多的工作来做。我们也做了不少的工作,当然要真正形成一个系统,应该来说还是任重道远。

这里我觉得有一些东西可以值得去讨论和展望。

一、存储结构的创新与优化方面,存在几个问题:

如何在现有的存储层次结构中选用合适的存储器件、设计相应的管理方式?

以及如何优化或变革现有存储层次,包括多级持久化存储的设计?

同时,如何协同非易失性存储与多核处理器的机制设计?

二、精细化软件系统设计

持久性存储硬件性能相比传统磁盘存储的性能提升极大。存储系统中相应的软件开销显得尤为突出。所以针对软件的系统优化,采用软硬件结合设计以及细粒度精细化软件设计,将是未来存储系统的研究方向之一。

三、新型分布式系统构建

新型高速存储硬件和高速网络硬件动摇了传统分布式系统中存储与通信的条件假设,且这些硬件均提供了新的访问特性和访问模式。

例如结合RDMA与NVM访问方式可以构建高效的分布式存储系统。新型分布式存储系统的构建需要重新思考分布式存储协议的设计。

雷锋网

清华计算机系舒继武 CCF-ADL 讲习班上篇:闪存存储系统的软件层优化

雷锋网注:舒继武,现任清华大学教授、 博士生导师。近年来主要从事网络存储、存储安全、网络服务器、并行算法、并行处理技术及并行应用软件技术等方面的研究工作。他还是清华大学计算机科学与技术系分学位委员会委员, 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这个东西发展出来,那它肯定是要去做内存,它的性能应该更好,更能解决内存的一些特性,而怎么来构建,应该来说也是一个很大的挑战。

雷锋网后续还将发布后续演讲内容,敬请期待。

雷锋网