1、现有背景下的问题
相比于磁盘,flash有更好的可靠性、I/O性能和低功耗。然而,传统的研究集中与建立固件和软件来支持传统的抽象层(为了向下兼容)。因磁盘与flash不同,故需设计新的、适合flash设备的抽象层。DFS利用虚拟化flash存储层。Page大小一般为512B到16KB。
Douglis[[i]]研究了不使用特殊软件栈的flash系统,表明flash可将读性能提升一个数量级,并将能耗降低90%,但写性能也降低了一个数量级;擦除块过大会导致写放大。Kawaguchi[[ii]]将flash视为磁盘,提供透明的设备驱动。高性能SSD设备的研究:Birrell[[iii]]通过在RAM中保存一个由逻辑快到物理地址的细粒度映射,来提升随机写性能。eNVy[[iv]]是早期为flash设计的文件系统。YAFFS, JFFS2, and LogFS [[v], [vi]]隐藏了大部分写延迟,且在文件系统中实现磨损均衡。
2、提出的解决方案
传统的文件系统非常复杂,主要因为三个因素:复杂的块分配策略、复杂的缓存设计、复杂的系统恢复方法。DFS简化了这几个方面。它直接使用虚拟的存储空间作为真的单级存储,在虚拟flash存储层提供虚拟到物理块的分配,避免显示的文件块的分配和回收。故DFS到flashmemory的数据路径很短,并且鼓励用户直接访问数据,而不使用复杂的、大的缓存。DFS使用虚拟flash存储的原子更新特点,完成系统恢复。
2.1 方案综述
2.2 虚拟flash存储层
虚拟flash存储层向上兼容,提供块存储接口。虚拟flash存储层的本质特征是:提供一个非常大的、虚拟的块地址空间。
虚拟flash存储层支持三种操作:read、write、trim(deallocate)。三种操作都是以块(512B)为单位。写操作触发虚拟(块)到物理页的动态映射。Trim操作重分配一个虚拟地址范围,它回收一个地址范围内的所有物理页的映射,在此范围执行垃圾回收。
虚拟flash存储层的实施使用了linux驱动和FusionIO的ioDriver的专用硬件。ioDrive使用PCIE卡和160GB/320GB的SLC NAND flash。Virtualized flash storage layer的软件作为主机端的设备驱动,由ioDrive本身支持。
总体设计理念是:分割数据和控制通路,在设备驱动中实现控制通路,在硬件中实现数据通路。在ioDrive卡上的数据通路,包含大量并行的独特的flash memory packages,并通过PCIE与主机连接。I/O请求流的并行使得设备达到最高的吞吐量。
设备硬件可提供检验和的生成、检查,以便检查和纠正flash chip中的错误。元数据在设备中以物理地址的形式存储,而不是虚拟地址,故可简化硬件并以较低的经济成本获得较大的吞吐量。Individual flash pages相对较小,而擦除的块有几兆字节。
设备驱动核维护虚拟地址到物理地址的映射,64 bit的虚拟地址到物理地址的映射在内存中由B树管理,每个地址指针指向512 B的flash page,且虚拟地址空间为273 B。设备驱动也执行垃圾回收,Bulk erasure策略和磨损均衡集成在设备驱动的垃圾回收组件中。
之所以在设备驱动中执行地址映射和垃圾回收,而不再ioDrive本身的嵌入式处理器中,是因为设备驱动可以充分利用处理器和内存硬件,不需要设计专用的嵌入式平台。这种方法也有缺点:需要处理器性能较高,并消耗主机内存资源。
2.3 DFS
DFS是一个Unix文件系统的全面实现,它的设计是为了充分利用Virtualized flash storage layer的几个特性,包括大的虚拟地址空间、直接的flash访问、故障恢复。
运行环境:Linux 2.6内核。DFS内核模块:Unix文件系统API,Linux VFS层。支持的操作:open、close、read、write、pread、write、lseek、mmap。
两种方案:
第一种:虚拟flash存储层使用对象接口。优点:提供文件系统所需的信息(高度匹配);缺点:基于对象的接口提供向上兼容的块接口很复杂。
第二种:virtualized storage layer提供大的、稀疏的逻辑地址空间。故每个文件系统对象都可以分配到一个连续的逻辑地址空间。优点:简洁且可提供向上的块接口。缺点:潜在的虚拟地址空间的浪费。DFS使用这种方案。
在ioDrive中提供稀疏的64 bit的逻辑块地址空间,每个块为512 B,故逻辑地址空间为273 B。
DFS分配连续的虚拟地址空间(chunk),这些空间大小可配置,默认为232块或者2TB。用户文件或目录分为两类:大文件、小文件。小文件变为大文件后,重新分配连续的地址空间(chunk),当前只能通过复制文件内容来实现重分配,但预计以后的virtualized storage layer可完成虚拟地址到物理地址的转换,而不进行数据复制。当前不支持大文件重映射为小文件。
2.3.1 Leveraging VirtualizedFlash Storage
文件系统被初始化时,有两个参数:(1)小文件的最大大小;(2)大文件的最大大小。不同环境中,文件大小定义不同,如在Tannenbaum et al. [[i]],Docuer and Bolosky [[ii]]。
当前的DFS用一个32 bit的I-node判断单个文件或目录,并使用一个32 bit的块偏移。故DFS可支持232-1个文件和目录,第一个I-node预留给系统;支持最大的文件大小为2TB(512 B个块,每个块偏移32 bit)。2TB = 241 B = 512 B*232 = 29*232B。I-node记录虚拟地址的基址。下图显示了文件描述符和偏移到逻辑块地址的转换。文件描述符fd(file descriptor)。
一个single logical extent可代表一个文件,故DFS可讲小的I/O请求与相邻的请求合并为一个较大的I/O请求。
DFS支持三种操作:从一逻辑块读取数据、向一逻辑块写数据、消除一个逻辑块(discard a logical block range:即垃圾回收,全零)。
2.3.2 DFS Layout and Objects
如下图:DFS中有三种文件。
第一种:系统文件,包含bootblock、superblock、所有的I-nodes。这个文件很大,占据裸设备的最低的地址块。
[[i]] DOUGLIS, F., CACERES, R., KAASHOEK, M.F., LI , K., MARSH, B., AND TAUBER, J. A. Storage alternatives for mobilecomputers. In Operating Systems Design and Implementation (1994), pp. 25–37.
[[ii]] KAWAGUCHI, A., N ISHIOKA , S., AND MOTODA, H. A flash-memory based file system.In In Proceedings of the Winter 1995 USENIX Technical Conference (1995).
[[iii]] BIRRELL , A., I SARD, M., T HACKER, C., AND WOBBER, T. A design forhigh-performance flash disks. ACM Operating Systems Review 41, 2 (April 2007).