0
本文作者: 李雨晨 | 2017-07-31 17:36 |
雷锋网注:舒继武,现任清华大学教授、 博士生导师。近年来主要从事网络存储、存储安全、网络服务器、并行算法、并行处理技术及并行应用软件技术等方面的研究工作。他还是清华大学计算机科学与技术系分学位委员会委员, 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访问方式可以构建高效的分布式存储系统。新型分布式存储系统的构建需要重新思考分布式存储协议的设计。
雷峰网原创文章,未经授权禁止转载。详情见转载须知。