面向NVM存储系统的快速文件访问系统

2020-04-09 14:49贺庆建牛德姣
计算机应用 2020年2期
关键词:存储设备存储系统存储器

贺庆建,蔡 涛,王 杰,牛德姣

(1.江苏大学京江学院,江苏镇江212013;2.江苏大学计算机科学与通信工程学院,江苏镇江212013)

0 引言

计算机系统中各部件的发展很不均衡,传统的磁盘和基于Flash 的固态硬盘(Solid State Drives,SSD)无法提供较高的随机I/O性能,使得传统存储部件的读写速度远低于计算部件的处理能力,无法解决日益严重的存储墙问题。当前出现了一系列新型的NVM(Non-volatile Memory)存储设备,如STTRAM(Shared Transistor Technology Random Access Memory)、相变存储器(Phase Change Memory,PCM)、阻变式存储器(Resistive Random Access Memory,RRAM)和铁电随机存取存储器(Ferroelectric Random Access Memory,FeRAM)等,这些NVM 存储设备具有支持以字节为单位的读写、较长的写寿命、低功耗和接近动态随机存储器(Dynamic Random Access Memory,DRAM)的读写速度等优势,成为解决存储墙问题的重要手段。然而当前并没有针对NVM 存储设备构建的I/O栈,NVM存储系统的效率也难以得到可靠保证。

计算部件的快速发展、多核心的普及以及新型存储器件的发展都为系统达到高并发、高吞吐提供了条件,但也使得传统软件栈成为了系统瓶颈。这其中文件系统的设计对系统的性能有着较大影响。

传统设备不具备NVM 存储器件的管理和访问特性,因此对数据流的处理也有较大差别。存储系统的主要目标是为应用程序提供快速可靠的数据访问,而这些特性的表现主要来自存储器。数据组织形式一般以文件形式存在,以块粒度传输,为了保证数据操作的有序性和数据的一致性,设计了以文件为单位的锁机制,这确实可以提供可靠的一致性,但也导致了读写请求只能以串行方式访问。而NVM 存储器内部具有多路转发通道,可以完成对文件的并发访问,因此这种锁机制无法利用NVM 这一特性;同时以块粒度访问造成了较大的读写冗余,大量额外时间开销严重影响了NVM 存储系统的I/O性能。因此,必须对现有文件系统的管理机制进行优化。

本文首先介绍了当前针对NVM 存储系统设计与优化的相关研究;然后分析了基于锁的文件系统存在的问题,并针对这些不足设计了无锁的文件读写机制以及基于字节的读写接口;最后利用开源NVM 模拟器PMEM,实现了快速文件系统FPMRW,使用Filebench 通用测试工具对FPMRW 进行测试与分析,验证了系统的有效性。

本文的主要工作如下:

1)针对NVM 存储设备读写速度高的特性,设计了新型的快速文件系统,减少了存储I/O软件栈的开销;

2)设计了无锁化的读写机制,并应用到文件系统,提高了文件系统读写的并发度;

3)实现了一个快速文件系统的原型FPMRW,使用Filebench 进行了测试与分析,结果表明,相对EXT+PMEM 和XFS+PMEM,FPMRW能提高3%~40%的系统吞吐率。

1 相关工作

当前的研究主要集中在通过相关技术发挥新型存储器特性,以及通过文件系统等对数据的管理和访问来提升系统的性能,因此设计开销小、支持设备特性的文件系统具有重要意义。

1.1 高效NVM存储系统

NVM 具有很多新的特性,为了能将它高效地应用于系统,面临很多的挑战,因此需要改变传统存储结构和去除不利于发挥新型存储设备特性的因素。这其中包括系统软件栈的开销、存储设备接口的开销等。当前很多研究者在如何利用NVM 存储设备特性提高应用访问性能方面开展了大量的研究工作。Swanson 等[1]分析发现,文件系统占传统以块设备构建的存储系统I/O 开销的20%,而占PCIe-NVM I/O 开销的63%,系统软件栈严重阻碍了NVM 读写性能发挥,因此提出重构当前系统软件栈来减少延迟。文献[1]提出利用原子写来批量操作I/O,从而减少应用程序、文件系统、块层等工作量。文献[2-3]探讨了面向SCM(Storage-Class Memory)的接口优化技术,分别提出了一种新的架构和一个名为Quill 的用户空间库。在该架构中,每个私有的虚拟化接口接管一个线程,同时利用基于硬件的文件系统保护检查机制,因此,应用程序在访问文件数据时不需要操作系统的干预,从而完全消除了大多数访问的操作系统和文件系统成本;而Quill 用户空间库避免了多数访问的系统调用开销。文献[4]针对NVM 读取带宽限制,以及高写入带宽下快速磨损的特点,提出了键值对存储MyNVM,它设计了新的解决方案,包括使用带有分区索引的小数据块,并以轮询代替中断来实现对象在NVM 中缓存以控制其持久性的准入控制策略。实验表明,MyNVM 在大幅降低DRAM 使用的情形下,与MyRocks相比,延迟和每秒查询的影响可以忽略不计。Wei 等[5]设计了一种称作内存元数据持久性机制(Persistent In-memory Metadata Management,PIMM)的内存元数据管理的持久性机制,它利用NVM 存储器具有的持久性和字节寻址特性来减少固态硬盘的I/O 开销。PIMM 在数据管理方面将数据和元数据分开存储,元数据由NVM 管理,而真正请求的运行时所需数据则存储于SSD 上。PIMM 是基于真实的NVDIMM(Non-Volatile Dual In-line Memory Module)构建的。实验表明,该机制可以将SSD 的块擦除减少到原来的91%,并能提高系统在不同负载类型下的I/O 性能。文献[6]设计了Aerie,通过暴露存储内存给应用程序,实现了在访问文件时避免内核的交互,同时提供了类似POSIX(Portable Operating System Interface of UNIX)的文件系统。文献[7]中发现,对于如PCM 之类的存储介质,耗尽其功率和存储单元的不是写入次数而是位翻转。文献[7]针对这种情况对现有数据结构进行了几种简单直接的修改,这些修改可以减少一段时间内的位翻转次数,并将其更好地优化用于非易失性存储器技术(例如PCM)的硬件和软件。文献[8]通过各种技术删除了实现事务的依赖,尤其是通过锁发布之后推迟提交的方式,实现了最小化的开销来完成约束NVRAM(Non-Volatile Random Access Memory)写入顺序的任务,从而确保事务的高效性。文献[9]梳理了使用新型存储技术解决大数据问题的现状,对于如何更好地发挥新型存储器件特性在大数据管理中作用作了一些思考。文献[10]中则指出由于存储器问题以及传统介质与主存差距的拉大,必须抓住非易失存储工艺的机遇,同时针对非易失内存的结构以及系统的优化进行了综述。

1.2 新型NVM文件系统

当前很多研究者在如何通过文件系统发挥NVM 存储设备特性方面开展了大量的研究工作,这其中包括降低文件系统开销、高效的事务和高并发机制等。

文献[11]实现了持久性内存文件系统PMFS,它是基于POSIX 的轻量级文件系统。它充分利用了持久性内存PM 的字节寻址避免了块访问的开销,同时支持应用对于PM 的直接映射。此外,还利用细粒度日志以及大页面方式提升映射I/O。现有的针对固态盘设计的文件系统存在软件开销和一致性等问题,NOVA[12]提供了一个日志结构文集系统,提供了强大的一致性,同时为每个inode分隔日志以提高并发度。实验结果显示,相比其他文件系统,在提供同等一致性强度的情况下,NOVA 有着3.1 倍到3.5 倍的性能提升。文献[13]基于现有以数据块为单位的访问机制,通过修改虚拟文件系统设计了一种新的写机制。基于磁盘时,该系统的写性能可以提高7~45.5倍,基于闪存的固态盘时,写性能可以提高2.1~4.2倍。DEVFS[14]设计者也提醒,挖掘存储设备的特性时要仔细考虑软件存储栈,传统存储栈要求应用陷入操作系统并且与诸多软件层比如内存buffer cache、文件系统、块层等交互,这些软件交互无疑会大幅增大访问延迟,从而降低了硬件本身带来的收益。设计者提出了一种完全嵌入式存储设备的直接访问文件系统DevFS(Dev File System),对模拟的DevFS 原型的评估显示,相比直接访问(direct access)I/O 吞吐率提高了2倍以上,设备内存的使用率降低了78%。文献[15]通过各种技术删除了实现事务的依赖,尤其是通过锁发布之后推迟提交的方式,实现了最小化的开销来完成约束NVRAM 写入顺序的任务,从而确保事务的高效性。为了利用NVM 的高效率来优化元数据的访问性能,文献[16]针对高速缓存数据在驱逐时容易导致无序的元数据更新问题,提出了一种软更新策略SoupFS。实验结果表明,与NVMFS使用同步高速缓存刷新保证一致性相比,SoupFS 无论在延迟还是吞吐率方面都有着明显的优势。文献[17]针对NVM 存储系统的读写速度不均衡、写寿命有限等问题,设计了同异步融合的访问请求管理策略,该策略能提高1%~22%的读写速度和9%~15%的吞吐量,能够有效减少文件访问的时间开销。

2 面向NVM快速文件系统的设计

2.1 基于锁的文件系统

在Linux 系统中,数据的管理和访问都通过文件系统管理,同一时间会有多个不同操作同时访问文件系统,这些操作在经过文件系统处理后最终以请求的形式交给底层存储设备。近年来,计算机技术的发展越来越快,计算机拥有的核心数大大增加。同时,NVM 存储器件读写能力也不断提高,内部具有支持多通道的特性。但在多线程访问同一文件时,会出现互斥的请求,因此文件系统出于保证一致性考虑,直接以文件为单位进行加锁,这使得锁机制成为了系统I/O 瓶颈,无法适应高并发、高吞吐的数据访问场景。

在传统的EXT4 文件系统中,用户层的应用程序利用系统调用发起对文件的操作。在内核层的文件系统接受这些请求,并将它们以串行的方式进行处理。对于写操作,内核首先会将操作的文件的inode 加互斥锁,并在此次I/O 操作完成之后释放互斥锁。在加锁期间,其他对此文件发起I/O请求的进程会被挂起,直到互斥锁释放。通过这样加锁的方式,能避免多线程并发下同时访问同一文件而造成的一致性相关的问题。但是EXT4 互斥锁的对象是文件inode,这样的粒度非常大,尤其是当多个进程对同一文件发出大量请求时,其性能会大大降低。

对于PMFS和NOVA等文件系统,它们出色的性能以及原子性保证使得其影响深远。即使如此,为了一致性上的保证,NOVA 对于写操作也沿袭传统文件系统的互斥锁的处理方式。

采用互斥锁的方式对慢速存储设备的影响较小,但NVM存储设备具有高吞吐高并发的特性,推迟访问请求对系统整体性能影响较大。传统存储器件下,由于顺序读写的速度大大超过随机读写,因此会通过合并和重排请求等方式来提升I/O 性能,但NVM 存储器件具有较好的随机访问性能,同时可以利用多个通道实现对不同区域的数据访问,从而在请求处理上也不再需要重排合并等机制,鉴于此,基于锁的串行请求访问已经不再适用于高并发的存储系统。

此外,现有的锁机制本身也会对数据访问造成一定的延迟。现有的锁机制会将访问请求对应的进程调度到阻塞状态等待唤醒,唤醒后还需要再切换到就绪状态,所需的时间开销相比NVM 存储设备的读写延迟已很可观;同时现有存储系统中访问请求都需要通过慢速的设备接口,不能很好地发挥设备内读写的优势,严重影响了NVM存储系统的吞吐率。

2.2 无锁的文件读写机制

存储系统中读写访问请求存在较大的差异,读访问请求之间可以互相并发,但写访问请求之间、读写访问请求之间则存在互斥的关系;其次,在多核心和具有高吞吐的NVM 存储设备背景下,以文件为粒度的锁机制已经成为系统瓶颈;再者,NVM 内部具有相对存储接口更高的读写速度,同时新型存储器件也具有一定的计算能力和管理能力,因此有趋势表明利用设备自身处理能力来完成文件的读写具有一定的优势。

相关工作中已有对于以块为单位的冲突检测算法,它们利用NVM 存储设备内部存在多个访问请求执行队列,通过二维链表结构对访问请求进行冲突的检测以及执行。由此,通过修改文件系统,去掉了以文件为单位的锁机制,使应用程序直接访问无锁的文件读写机制,同时利用基于字节的读写接口去访问具有自主冲突检测的NVM 存储中的数据。图1 给出了采用无锁的文件访问系统FPMRW的结构。

图1 FPMRW的结构Fig.1 Structure of FPMRW

通过对文件读写流程的分析发现,涉及到对文件级别的锁会出现在ext4 文件系统中读写函数的入口,因此将用于锁定文件inode 的互斥锁去掉,这包含通用读写方法和采用dax的直接映射访问,在进行写操作的dax 操作中,存在对读进行锁定的,也一并去掉。图2 展示了去锁过程对文件系统写调用堆的修改。

图2 文件系统写调用堆Fig.2 Call stack of write in file system

在完成以上修改后,对设备的访问不再使用块接口,而是自主设计的读写接口pmem_read、pmem_write,同时在vfs中提供应用程序访问的系统调用。

2.3 基于字节的读写接口

NVM 存储设备具有字节寻址的特性,但多数文件系统仍然提供以块为粒度的读写,具有较大的写放大,不仅加快了设备的磨损,同时给原本就存在写短板的写性能带来了挑战。此外,NVM 器件的多路转发特性也没有得到充分使用,而新型存储设备具有很好的随机读写性能,这为同时处理多个请求提供了可能,而冲突检测机制恰好能完成这一工作。

文件系统的块接口访问方式极大地限制了基于NVM 新型存储设备性能的发挥。为了让应用程序能够仅读写真正需要的数据部分,发挥设备的字节读写特性,依据NVM 存储设备的读写非对称性,同时考虑多余读对访问性能具有正面意义,对pmem_write 以字节的粒度访问,对pmem_read 则保留块粒度访问。

不同于机械盘在处理请求时需要进行合并重排等调度,NVM 存储设备对到来的请求直接处理,每个请求对应一个缓冲区,而这个缓冲区是根据buffer_head 结构体在写操作流程中调用_block_write_begin()时被构造的,以上分析表明,可以在开始写之前对真正要写的数据进行区域标记。具体做法为在buffer_head 结构体增加write_pos 和write_length,对应写数据的起始地址和数据长度,通过比较起始地址和块起始地址确定write_pos;通过比较写入尾地址和块结束地址确定write_length;在提交请求时对其初始化,因此传送给pmem_write 接口的大致对应一个四元组(req_id,bi_next,start_address,bi_size),最后pmem_write 对接收的请求利用结合冲突检测机制以字节粒度进行写入。由于读操作仍然以块粒度进行,因此pmem-read 的四元组为(req_id,bi_next,read_pos,read_length),其中read_pos 固定为块的起始地址,read_length固定为块的大小。

2.4 FPMRW读写访问算法描述

通过对写流程的分析,本文对文件系统锁机制以及块访问接口进行了优化,设计了具有字节写粒度的去文件锁机制的FPMRW写算法,具体如下所示:

PMRW_Write(req_id,bi_next,write_pos,write_length)

应用程序首先调用vfs中FPMRW提供的写系统调用;

进程直接访问取消锁机制的写处理过程,包括对要写的数据区域标记和构造具有四元组的写请求;

将具有四元组的写请求提交给pmem_write();

在pmem_write()中调用冲突检测机制对写请求进行写入的冲突检测:

If(不存在冲突){

执行设备内字节粒度的写入操作;

执行完毕,唤醒已加入冲突队列的请求;}

Else

由于存在冲突将被冲突检测模块加入到待写入队列;

监听唤醒信号;

通过对读流程的分析,设计了FPMRW 结构下的读算法,具体描述如下:

FPMRW_Read(req_id,bi_next,read_pos,read_length)

应用程序首先调用vfs中FPMRW提供的读系统调用;

进程直接访问取消锁机制的写处理过程,包括对要读的数据区域标记和构造具有四元组的读请求;

将具有四元组的读请求提交给pmem_read();

在pmem_read()中调用冲突检测机制对读请求进行读取的冲突检测:

If(不存在冲突){

执行设备内块粒度的读取操作;

执行完毕,唤醒已加入冲突队列的请求;}

Else

由于存在冲突将被冲突检测模块加入到待读取队列;

监听唤醒信号;

3 原型系统的实现

当前没有成熟的NVM 存储设备,我们使用开源NVM 存储系统模拟器PMEM 模拟NVM 存储设备,并增加60 ns 的读延迟和150 ns 的写延迟以模拟NVM 存储设备的读写特性;同时修改Linux 内核,在内核地址的尾部预留50 GB 内核空间作为PMEM的存储地址空间。

修改4.4.112 版的Linux 内核源代码,在虚拟文件系统(Virtual File System,VFS)中增加读写系统调用;修改文件系统,取消锁机制,增加无锁的文件读写模块;修改buffer_head等结构在请求中分别增加写流程的write_pos 和write_length读流程的read_pos 和read_length,并完成对增加字段的初始化,在NVM 模拟器实现基于字节的读写接口pm_read、pmem_write,实现对于请求的冲突检测调用和请求的管理工作。最后在开源NVM模拟器的基础上实现了FPMRW原型。

4 测试和分析

使用一台服务器构建了FPMRW 原型系统的测试环境,该服务器的配置如表1所示。

表1 原型系统测试环境的软硬件配置Tab.1 Software and hardware configuration of testing environment of prototype system

分别加载FPMRW 与运行在开源NVM模拟器PMEM上的EXT4 和XFS 两种文件系统,使用Filebench 中的Copyfiles、Webproxy 和Randomrw 负载,模拟不同的存储系统运行环境。测试FPMRW 的吞吐率,并与运行在PMEM 上不作修改的系统进行比较。

每项测试均进行10 次,并在每次测试之后均重启服务器来消除缓存对测试结果的影响,最后取平均值作为测试结果。

4.1 使用Copyfiles负载的测试

先分别在PMEM上加载EXT4和XFS文件系统,再测试修改后的原型系统FPMRW,使用Filebench 中的Copyfiles 负载,模拟用户拷贝文件的操作,设置测试文件数量为1 000,每个目录中创建20 个文件,文件的平均大小为16 kB,每次I/O 大小为16 kB,搜索深度为0.7,测试时间为30 s,测试线程数量为1、2、4、8和16时的吞吐率IOPS,结果如图3所示。

从图3 可以看出,相比运行在PMEM 上的EXT4 和XFS,FPMRW 具有明显的性能优势。在单线程下,FPMRW 相对EXT4+PMEM 和XFS+PMEM 的IOPS 值提升在7%左右;并且随着线程数的增加,提升的幅度也在增大,当线程数为8 时,达到了22%。在线程数到达16 时,FPMRW 的IOPS 值仍有小幅增长,而其他两个系统在线程增加的过程中,其IOPS 值非但没有增长,还出现一定的下滑,这表明,在不作修改的EXT4+PMEM 和XFS+PMEM 利用多线程拷贝数据会影响系统的性能。这一方面是由于负载中主要为写操作,在不作修改的系统中,由于以文件加锁,因此多数时间由于互斥锁的存在,线程都是单独运行的,这使得线程间互斥以及冲突加剧,不仅增加了对线程的管理开销,还对堆栈造成一定的压力,这就使得线程运行效率特别低;另一方面,以块粒度访问的方式造成了冗余开销,影响读写性能。而FPMRW 通过对请求地址进行冲突检测,不仅实现了在多个文件甚至同一文件利用多线程进行读写,设计的以字节读写接口方式还能避免将设备数据读入内存再回写,并通过只读写实际需要的数据量使得系统I/O 在处理有效数据的同时具有高并发、高吞吐的优势。

图3 使用Copyfiles负载的测试Fig.3 Tesing with Copyfiles workload

4.2 使用Webproxy负载的测试

接着,利用Filebench 中的Webproxy负载模拟代理服务器的使用情况。设置测试文件数量为1 000,每个目录中创建20个文件,文件的平均大小为16 kB,每次I/O大小为16 kB,搜索深度为2.3,测试时间为30 s,测试线程数量为1、2、4、8 和16时的吞吐率IOPS,结果如图4所示。

图4 使用Webproxy负载的测试Fig.4 Testing with Webproxy workload

从图4 中可以看出,Webproxy 负载下,系统的IOPS 值相对较高,这是由于该负载中大部分时间都是在进行读操作。在线程数从1 到8 的过程中,各系统的IOPS 值随着线程数增加而逐步提高,但FPMRW 提升最明显,并且相对其他两个系统的IOPS 增幅随线程逐步提高,在线程数为16 时,达到了40.4%。从图中可以发现,EXT4+PMEM 相对XFS+PMEM 性能要好,这是由于EXT4 具有比XFS 更好的查找优势。由于Webproxy 具有多个不同操作,在有更新操作时还是会影响读的进行,在不加修改的EXT4+PMEM 和XFS+PMEM 中,在进行写操作时,所有线程又回到了单独运行状态,也就是在某些时候并未起到多线程的效果,反而增加了线程挂起和切换等开销,因此它们具有比FPMRW更高的延迟。

4.3 Randomrw负载测试

最后,利用Filebench 中的Randomrw 负载模拟代理服务器的使用情况。设置测试文件总量为2 GB,每次I/O 大小为8 kB,测试时间为30 s,测试线程数量为1、2、4、8 和16 时的吞吐率IOPS,结果如图5所示。

图5 使用Randomrw负载的测试Fig.5 Testing with Randomrw workload

从图5 中可以看出,在混合负载下,只有读写操作下的系统随机读写性能具有较高的IOPS 值,不过FPMRW 始终具有最好的性能。在单线程下,FPMRW 相对EXT4+PMEM 和XFS+PMEM 性能提升大约5%;在线程数到达4 后,吞吐率提升都超过了20%。在线程数从1到4过程中,各个系统的性能都逐步提升,超过4 以后,增加线程数只有FPMRW 的吞吐率继续增长,这是由于随着线程数提升,出现写进程的几率增加,以文件为粒度的锁机制影响了高并发,而FPMRW 并不存在这种限制,这表明FPMRW 在混合负载下有更好的适应性、并发性。

5 结语

NVM 存储器件能够用来设计低时延、高吞吐的存储系统,但由于当前文件系统存在文件为粒度的锁机制和使用块访问方式,使得NVM 存储器性能并不能达到理想的状态。为了解决这个问题,本文通过改变现有的锁机制,取消以文件为单位的锁粒度,提出了一种快速文件读写系统,设计了无锁的文件读写机制以及基于字节的读写接口,并利用开源NVM 模拟器PMEM 实现了快速文件系统FPMRW,最后使用Filebench 通用测试工具对FPMRW 进行测试与分析,验证了系统的有效性。结果表明,相对于EXT+PMEM 和XFS+PMEM,本文系统的吞吐率能提高3%~40%。

但当前工作还没有考虑数据本身和文件元素据的区分处理和进一步分析优化,后面的工作将会对不同数据的特性和表现进行分析,并设计针对其特点的处理方式。

猜你喜欢
存储设备存储系统存储器
分层式大数据存储系统缓存调度策略与性能优化
静态随机存储器在轨自检算法
天河超算存储系统在美创佳绩
面向4K/8K的到来 存储该怎么办?
浅析计算机硬件发展史
浅析铁路视频监控存储设备设计
存储器——安格尔(墨西哥)▲
Buffalo推出四硬盘网络存储器 主打Soho一族
防止USB接口泄密
测试小型存储器阵列的新方法