Non-Volatile Main Memories File Systems(2)


Better I/O Through Byte-Addressable, Persistent Memory

0x00 基本思路&设计

这篇Paper在PMEM / NVM上面的文件系统研究算是比较早的,发表在SOSP ‘09上面。这篇Paper主要是提出一种short-circuit shadow paging去解决基于PMEM的文件系统更新的原子性问题。文件系统更新的原子性常见的方法是使用CoW or journaling的方法。两种方式各有优劣。这里的BPFS提出的方法就是根据PMEM的特点,在数据更新可以是原子更新的时候,使用in-place更新的方式,一般这个大小是8 byte。在其它时候根据情况使用append的方式 or CoW的方式。BPFS将文件系统组织为一种树行的结构,这里实际上是一种基数树。如果每个Block的大小设置为4KB,指针大小为8byte,树高为5的时候,可以支持256TB大小的数据。回来的PMFS的结构基本和BPFS这里很类似。更新分为三种情况,如下图所示:

  • in-place write。这种情况在写入的大小不超过8byte。这种情况下就直接执行in-place更新。比如在后面新append一个block的数据,将这个数据更新大元数据的时候。或者是更新一个文件不超过8byte的时候;
  • in-place appends,这种情况利用元数据更新才实际反映了文件大小之类的特点。比如在文件最后一个block append数据的时候,即使append的数据超过了8byte。如果没有超出这个block,这个时候也可以直接append。在append完成之后再去更新file size的元数据信息。如果在append的过程中crash了,由于file size没有更新,append的数据相当于不存在。而file size为8byte大小,可以原子更新。
  • Partial copy-on-write。更新设计多个Block的时候,需要分配新的空间来处理写入。在写入的时候,向树的上面处理,如果不能原子更新的数据,一只使用CoW的方式。在能够原子更新的时候,就直接使用in-place更新即可。

这篇Paper核心的几个地方就是这里的更新机制,另外提到的关于BPFS的设计没有太多特别的地方[1]。BPFS的缺点在Paper中也有提到,这个提到缺点的比较少见,2333[1].

0x01 评估

这里的具体信息可以参看[1].

Performance and Protection in the ZoFS User-space NVM File System

0x10 基本思路

NVM的文件系统设计上面,主要有这样的几种实现方式:一种是实现在Kernel中, 优点是容易实现原来的文件系统特性,比如同样的接口语言和一样的权限控制、隔离特性,缺点是不能很好地发挥出NVM的性能。另外的一种思路是实现在user space中,有点是能够更好地发挥NVM的性能,缺点是在权限控制、隔离性上面可能和传统的文件系统不一样。还有一些是Hyhrid的设计,这里的ZoFS也是提出来一种主要在User-Space实现文件系统逻辑,但是也结合Kernel实现的一些思路的方式。ZoFS的出发点是实际的文件系统,一个目录项目的文件、目录有相同的owner和permission。这里根据这个提出来一种新的抽象,称之为coffer。coffer本质上就是一组有相同的owner和permission权限的集合。是整个文件系统的一个部分,而一个coffer是这个文件系统整个文件系统树形结构的一个树形的一个部分。哟个coffer也有一个root节点,如下图所示,

0x11 基本设计

在这个Coffer的思路上面,这里提出来一个Treasury的文件系统架构。Treasury架构将一部分的全局的元数据管理放到了Kernel中,比如Coffer的元数据,以及全局的空闲空间管理等。而将和具体的一些目录、文件的管理放到User-Space来实现。在User Space,这里提供一个FSLibs,向外提供一些接口。比如关于Coffer的接口,fs操作的一些接口。包括如下的一些。coffer的接口保护对coffer进行创建、删除、扩大、缩小、映射/解除映射等。另外的fs的接口用于挂载 or 解除 挂载一个文件系统实例。file mmap和file_execve两个接口用来处理mmap和execve两个syscall无法在user space实现的问题,

Operation
coffer_new       Create a new coffer under the given coffer. 
coffer_delete    Delete an existing coffer. 
coffer_enlarge   Allocate and assign more pages to a coffer. 
coffer_shrink    Free some pages from the coffer. 
coffer_map       Map a coffer into the process’ memory space.
coffer_unmap     Unmap a mapped coffer.
coffer_split     Split a coffer into two.
coffer_merge     Merge two coffers into a single one.
coffer_recover  Recover a coffer.
 
fs_mount         Register a new FSLibs instance.
fs_umount        Deregister the FSLibs instance.

file_mmap        Map a file.
file_execve      Map a file.

Treasury架构的文件系统整体设计如下。Paper中特意提到了其中的protection问题怎么处理,主要讲到了下面的几个问题:

  • Stray writes,这个问题又有其它的名称,比如说猜内存。这种情况出现一般是因为软件的bug,改写了不应该改写的数据。由于Treasury架构的文件系统的逻辑实现在user space中,这里处理起来回更麻烦一些。这里还是使用了PMFS中的思路,使用了intel的MPK的机制。在应用请求将一个coffer内的数据映射到address space的时候,会设置不同的MPK参数,同时禁止不必要的数据访问权限,

      When KernFS maps a coffer to a process, KernFS will mark the coffer pages in a different MPK region from the process’s runtime memory. KernFS will also disable access to the coffer’s MPK region in the thread’s PKRU register, before returning to user space.
    

    另外,在使用的时候使用如下的一些思路,只有在FS中的处理逻辑的时候才打开访问的权限,在离开FS处理逻辑的关闭访问权限。也就是说在运行其它部分代码的时候关闭,无法改写coffer的数据。

  • Graceful error return and fault isolation。在FS处理发生问题的时候,syscall会返回一个错误码(现在的文件系统实际上在这里处理上也不是完美的),而这里由于在user space运行。在遇到SIGSEGV这样的问题的时候,可能导致进程直接被杀。这里使用了segmentation fault handler来处理这个问题,

    ... invoke sigsetjump at the beginning of FSLibs file system functions and call siglongjump in the SIGSEGV signal handler to jump back to the beginning of the FSLibs function and return corresponding errors. This approach protects the application from being terminated due to invalid memory references in a coffer.
    

    另外,未来防止coffer直接访问的相互影响,在同一时刻一个线程这里只允许一个coffer内的数据。

  • Metadata security,这里主要涉及到防止恶意的逻辑的破坏。这里前面的有在FS中的处理逻辑的时候才打开访问的权限,在离开FS处理逻辑的关闭访问权限方式和在同一时刻一个线程这里只允许一个coffer内的数据一定程度上面保护这种情况,另外这里还有另外一个处理思路:For each cross-coffer reference, μFSs should check the validity of the target coffer before making it accessible。

Paper中提到了另外的一些实现上面的内容,比如Coffer Managemen和Space Management。还有一个简单的Treasury架构的文件系统实现的一些内容。具体可以参看[2].

0x12 评估

这里的具体内容可以参看[2].

参考

  1. Better I/O Through Byte-Addressable, Persistent Memory. SOSP ‘09.
  2. Performance and Protection in the ZoFS User-space NVM File System, SOSP ‘19.
  3. The ZUFS zero-copy filesystem, https://old.lwn.net/Articles/756625/,https://github.com/NetApp/zufs-zuf,https://github.com/NetApp/zufs-zus