SCMFS:a filesystem for storage class memory

论文关键点在于:在虚拟memory空间设计了新型文件系统SCMFS,保证每个文件包含的块是连续的,同时重用内存基本设施(MMU和TLB )实现虚拟地址到物理地址的转换。设计目的是尽可能简化文件操作,减少CPU开销,提升文件系统性能。


问题:本文的问题在于怎样在Storage class memory(scm)上实现一个文件系统。scm直接连在内存总线上,按字节寻址,非易失。

实现方法:我们创建了一个文件系统SCMFS,它在虚拟地址空间里被实现。同时,在SCMFS,我们实现了现有内存管理模块,进行块管理,同时保持每个文件的空间总是连续的。


1.Introduce
  非易失存储能够被连接在内存总线上作为主存,也可以作为外存。最先进的非易失存储为PCM,memristor,提供可以同DRAM相比的低延迟,比传统磁盘快几个数量级(ssd是十几毫秒,pcm是几百纳秒)。
  非易失存储放在内存总线上,降低了访问持久存储的延迟。其使得处理器通过内load/store指令能够更简单快速地进行数据存取。但是与disk相比,非易失存储寿命更短。 大量的学术工作在研究在非易失存储上怎样减少写操作,怎样实现磨损均衡。我们调查了怎样通过SCM设备的特征来影响SCMFS的设计。  SCM有低的访问延迟,所以我们将其放在内存总线上。
   将存储设备放在内存总线上,其与主存将共享系统资源,比如内存带宽总线,cpu缓存,TLB表。文件系统的开销会影响整个系统的性能,所以SCM应该考虑到这些因素。
   另一个选择是修改基于内存的文件系统,比如tmpfs,ramfs。这些文件系统被设计使用主存来存储文件,而不是使用持久存储设备。所有的元数据被内存数据结构保存,数据被保存在临时分配的内存块中。重新设计一个新的文件系统是不比修改现有文件系统以适应SCM设备更困难的。
   在本文中,我们提出了一种新的文件系统----SCMFS,它是针对SCM特别设计的。基于兼容性的考虑,这个文件系统像常规文件系统那样导出相同的接口,以便所有现存应用都可以在文件系统上运行。在本文件系统中,我们旨在将文件系统操作的CPU开销最小化。我们构建文件系统在虚拟内存空间?,使用MMU去映射文件系统地址到SCM上的物理地址。
   本文贡献:(a)设计了一个新的文件系统,基于storage class memory;(b)提出了文件系统在linux上实现的原型细节(c)通过benchmark和application评估了它的性能。
2.related work
    BPFS是针对非易失,按字节寻址的新型存储介质,设计文件系统,使用了新型短周期影子分页法来实现更快更细粒度的更新。同时修改硬件,提供顺序和原子性原语,来保证文件系统更新的一致性(BPRAM存储所有的元数据和数据)。而我们的文件系统旨在简化设计,消除不必要的开销来提升性能。DFS需要进一步了解。RIO和C onquest 不是基于完全意义上的非易失存储设计的文件系统,其是把电池备份的RAM作为非易失存储介质。  Rio使用电池支持的RAM去存储文件缓存(非易失的DRAM,数据存在SSD上),避免了刷新脏数据到磁盘,同样的,Conquest使用它去存储文件系统元数据和小文件(不是像DRAM一样存储热点元数据,存储全部的元数据和小文件,数据存储在SSD上)。eNVy storage system,把flash memory附加到内存总线上去实现非易失的内存设备。为了使flash设备按字节寻址,他们用电池支持的RAM缓存设计了一个特殊的控制器。 我们的工作是假设非易失存储介质是足够大的,可以存放所有元数据和数据,我们关注的是在我们设计的文件系统中如何使用内存管理基础设施。
3. SCMFS
   在本文中,我们旨在设计一个基于SCM的文件系统。传统的持久存储设备,IO延迟带来的开销是远远大于文件系统层本身的开销的。所以,存储系统的性能总是依赖于设备的特性和IO调度策略的性能。然而,在存储设备直接附加到内存总线上这种情况,存储设备将和主存一起共享一些关键系统资源。它们将共享内存总线带宽,CPU缓存和TLB表。 我们相信复杂性更低的文件系统能够降低CPU在存储系统上的开销,提升存储系统性能。我们的设计目标是最小化实施文件系统请求的操作数量。
3.1.1 重用内存管理
3.1.2 连续的文件地址
   现有文件系统利用大量的数据结构管理和跟踪分配给文件的空间。这些文件系统必须解决大文件被分割成几个部分,存储在块设备不同位置的情况。比如,ext2fs使用间接块来解决这一问题。如下图所示。当文件很大的时候,要进行间接指针块的read操作,增加文件读写的复杂度。

    为了简化这种数据结构,我们设计文件系统的每个文件逻辑地址空间是连续的。为了实现这个设计,我们将文件系统放在虚拟地址空间,它比实际的SCM更大。我们使用页映射来keep一个文件内所有的块都有连续的逻辑地址。 (逻辑地址连续,物理地址连续吗?) 我们不需要复杂的数据结构去追踪逻辑地址空间,简单地存储起始地址和每个文件的大小就可以了。这样大大简化了读写请求处理过程。为了获取请求数据的位置,只需要把起始地址加上偏移。真实物理地址通过页映射。
   把文件系统放在虚拟地址空间能够简化设计,降低开销。

3.2文件系统布局
   内存映射表,文件系统在mounted的时候需要构建一些内存数据结构,需要内存映射表信息,在运行期间它被内存管理模块维护。任何对这些数据结构的修改都将立马被刷新到这个区域。因为映射信息对文件系统的一致性是非常关键的。剩下的物理空间呗映射到虚拟内存空间,去存储整个文件系统。
   在虚拟内存空间,SCMFS的布局是非常简单的,同时相似于现有的文件系统,它包括了三个部分,第一部分,superblock,包含整个文件系统的信息,比如文件magic number,版本号,块大小,inodes和blocks的总数量,inodes和blocks的计数器等等。第二部分是inode table,包含每个文件或者目录的基本信息,比如文件模式,文件名,所有者id,group id,文件大小,文件最后被访问的时间(atime),文件最后被修改的时间(mtime),文件被创建的时间(ctime),文件数据的起始地址等等,inode table中的第一项inode number为0的项是根节点,总是一个目录。文件系统的所有内容都被存储在第三部分。在我们的原型中,SCMFS虚拟内存空间的总大小2^47bytes(ffff000000000000---ffff7fffffffffff)


   除了普通文件和目录文件,还有一种空文件。在inode table中,我们使用固定大小的项,256bytes。按照这种结构,文件系统在重启之后很容易恢复。首先我们通过magic number和version number来check“metadata”是否有效,然后使用“metadata”和“mapping table”去构建物理地址和虚拟地址之间的映射。一旦结束,我们能从在虚拟地址空间的super block中获取文件系统的信息。物理地址和虚拟地址在mapping table中是相对的,不是绝对的。
   在普通文件系统中,数据块是按需分配的,空间被分配给文件系统只有当其需要的时候,一旦一个文件被删除,被分配的空间将被立刻回收。频繁的分配和回收可能调用很多memory管理函数,很可能会降低性能。为了避免对BLOCKS频繁地分配回收,我们采用了空间预分配机制。我们创建和维护一定数量的空文件在文件系统中。 (文件大小不定,预分配文件空间怎么确定该分配多大的空间,可能会造成空间浪费或者空间不够?)这些空文件没有名字,没有数据,但是被分配了一定物理空间。当我们需要去创建一个新文件的时候,我们总是尝试去找到一个新的空文件。当文件小于预分配的空间时,我们不需要回收未使用的空间。当我们要删除一个现有文件的时候,我们不需要回收空间,但要标记其是个空文件。通过这种机制,我们可以减少分配和回收的步骤,期望可以提升文件系统的性能。
   为了支持这种机制,我们需要为每个文件维持三种sizes。第一是文件的size,这是真实文件的大小,第二,virtual_size是文件被分配的虚拟空间的大小,最后一个是“mapped_size”是









补充知识:逻辑地址,虚拟地址,线性地址,物理地址
                逻辑地址(虚拟地址):是指由程式产生和段相关的偏移地址部分。
                线性地址:逻辑地址到物理地址变换的中间层。程式代码会产生逻辑地址,加上相应的段基址,就生成了线性地址。如果启用了分页机制,那么线性地址会产生一个物理地址,若没有启用分页机制,线性地址就是物理地址。
                物理地址:CPU外部地址总线上的寻址物理内存的地址信号。
                虚拟内存:计算机呈现出比实际拥有的内存大的多的内存量。
                 逻辑地址--->线性地址( 虚拟地址 )--->物理地址
                
  CPU的页式内存管理单元,负责把一个线性地址转换为物理地址。从管理和效率的角度出发,线性地址被分为以固定长度为单位的组,成为页。如果一个32位的机器,线性地址最大为4G,用4KB一个页来划分,整个线性地址就被划分为2^20个页的大数组。我们称之为页目录。目录中的每一个目录项,就是一个地址一一对应的页地址---物理页。


32位地址~指示4G地址空间,若内存存在分页管理机制,一个页4KB,那样有2^20个页,页表项中存放2^20个页的地址,32位,4B。所以页表项空间大小2^20*4B=4MB。
为了节约空间,我们使用二级模式:2^10个页表项,每个页表项指示一个页表的地址,页表中存放2^10个页的地址,地址表示4B。(2^10*4B+2^10*4B)=8KB。

   在linux中,虚拟地址等于线性地址。内存有分页管理机制,所以只需要完成虚拟地址到物理地址的转换。使用上文描述的两级模式。页表项的基址存放在寄存器中,我们通过虚拟地址前p位页表项中页表偏移,加页表项基址,找到页表项中对应页表基址。再根据虚拟地址中间x位页偏移+页表基址,找到对应页表中的物理页地址,加上虚拟地址后q位页偏移,得到相应物理地址。
  所以在Integrating VM with a physically addressed cache这幅图中,processor下发Virtual address到MMU,MMU先下发Page table entry address到L1 cache中,若hit返回页表基址,若miss,则访问内存,将页表项调入L1cache中,然后返回页表基址。MMU将页表基址和页表偏移合成page address下发到L1 cache中,若页hit,将数据返回到CPU,若miss,则从内存中调入相应页数据,再返回到CPU。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值