面向ssd的文件系统中自适应直接io加速方法

文档序号:8905060阅读:278来源:国知局
面向ssd的文件系统中自适应直接io加速方法
【技术领域】
[0001]本发明涉及计算机操作系统领域,具体涉及一种面向SSD的文件系统中自适应直接1加速方法,自适应地利用直接1(Direct 10)方式缩短1路径从而提高1性能。
【背景技术】
[0002]目前,计算机系统面临的事务中以数据为中心的任务逐步占据主导地位。然而,在整个计算机系统中1子系统一直滞后于计算子系统。如何为计算部件及时提供待处理数据并快速保存所得处理结果是计算机系统设计的一大挑战。待处理数据和所得处理结果一般通过文件系统保存在外部存储设备上,而计算部件和存储设备之间的数据交互需要经历一段很长的1路径。以类Unix系统为例,应用程序请求数据时,先在该应用程序对应的进程空间申请一块存储区域,然后向VFS(虚拟文件系统)发出读请求,所述读请求进一步被发送到设备驱动层,并由设备驱动程序最终发送到具体的存储设备。存储设备返回数据后,所述读请求沿原路返回,依次经历设备驱动层、VFS层,并最终将读取的数据拷贝到读请求发出前申请的存储空间中。在基于磁盘的传统存储系统中,由于存储设备延迟极大、带宽较低,以上所述1路径中设备驱动层以下部分成为主要的瓶颈,并导致整个存储系统的1性能低下。
[0003]为了缓解由于存储设备缓慢而导致的1性能低下的局面,研宄人员在VFS层设计了一个基于内存的缓冲区,用来保留最近使用或者频繁使用的数据,从而将新的1路径改为如下所述:以读请求为例,应用程序在进程空间申请一片存储区域后向VFS发出读请求,若所请求的数据保存在VFS的内存缓冲区中,则可直接将该数据从内存缓冲区拷贝到所申请用户数据存储区域;否则,VFS将读请求进一步发送到设备驱动层,并最终由底层存储设备响应,存储设备返回的数据首先保存在VFS的内存缓冲区,然后由缓冲区拷贝到所申请的用户数据存储区域。对于写请求,应用程序只需将待写数据拷贝到VFS的内存缓冲区即可,内存缓冲区会定期将数据刷新到底层持久存储设备。按以上所述1路径执行1请求的模式被称作缓冲1(Buffer 10)。在缓冲1模式下,当应用程序发出的1请求表现出很强的局部性时,大量的1请求可直接由内存缓冲区响应,从而有效缓解了磁盘的瓶颈效应。由于磁盘长期在计算机外存设备中占主导地位,而缓冲1能够显著降低磁盘对1性能的影响,因此,缓冲1—直作为操作系统中的主流1模式而被应用程序广泛地采用。
[0004]缓冲1模式的高效能依赖于两个先决条件:应用程序发出的1请求显示出很强的局部性;底层存储设备的性能显著低于内存。前者保证大量的1请求能够在内存缓冲区中命中,从而减少由性能较差的底层存储设备响应的1请求数量。后者主要为了防止缓冲1模式引入的内存拷贝导致显著的性能损失。以缓冲1模式执行读请求时,若应用程序所请求的数据没有保存在VFS的内存缓冲区中,则需要先从存储设备获取数据保存到内存缓冲区,再由内存缓冲区拷贝到用户存储空间。以缓冲1模式执行写请求时,需要将用户存储空间的数据先拷贝到内存缓冲区,再由内存缓冲区写到底层持久存储设备。总之,无论读写操作都需要一次额外的内存拷贝,而不允许用户存储空间和底层存储设备直接交互。当底层存储设备为磁盘时,由于磁盘的读写延迟极大、带宽很低,相比于磁盘带来的延迟,内存拷贝的时间开销可忽略不计。因此,在基于磁盘的存储系统中缓冲1模式能取得较好的效能。
[0005]然而,在当前的应用需求和技术背景下,缓冲1模式所需要的两个条件已很难保证。一方面,当前的许多应用以数据为中心,由于数据量空前增长,应用程序发出的1请求表现出较弱的局部性,导致VFS中的内存缓冲区取得的命中率有限,缓冲1模式很难发挥较高的效能。另一方面,新近出现的SSD(Solid State Drive,固态盘)能够提供较高的性能,基于PCIE接口的SSD所提供的带宽甚至达到与内存相当的量级。由于底层存储设备速度变快,1请求花在设备上的延时变短。相应地,缓冲1引入的内存拷贝带来的时间开销在整个1延迟中所占的分量加重,且不可再忽略不计。鉴于以上两点原因,缓冲1模式已不适用于面向数据密集型应用的基于SSD的大规模存储系统。

【发明内容】

[0006]本发明要解决的技术问题是:针对现有技术的上述问题,提供一种适用于数据密集型应用,能够显著降低存储系统的1延迟,降低系统功耗,1路径短、1速度快、读写延迟低、与现有存储系统兼容、内存开销低的面向SSD的文件系统中自适应直接1加速方法。
[0007]为了解决上述技术问题,本发明采用的技术方案为:
[0008]一种面向SSD的文件系统中自适应直接1加速方法,步骤包括:
[0009]I)当接收到应用程序的1请求时,在进程地址空间分配存储空间B,所述存储空间B的头部和尾部对应的逻辑地址为底层文件系统块大小的整数倍;计算1请求待读写数据所涉及的数据块数N,判断1请求的类型,若为读请求则跳转执行步骤2);否则跳转执行步骤3);
[0010]2)以直接1模式将读请求对应的数据块读取到存储空间B,并从存储空间B中获取读请求的有效目标数据返回给应用程序,结束读操作,跳转执行步骤I);
[0011]3)将写请求的写数据拷贝到存储空间B,将存储空间B中的写数据分成头部、主体和尾部三个部分,将写数据的头部和尾部对应的数据块以缓冲1模式写入存储设备;将写数据的主体部分对应的数据块以直接1模式写入存储设备,结束写操作,跳转执行步骤1)0
[0012]优选地,所述步骤2)的详细步骤包括:
[0013]2.1)计算读请求的下边界;
[0014]2.2)计算读请求的上边界;
[0015]2.3)将读请求所对应目标文件的DIRECT_10标志位设置为1,所述DIRECT_10标志位为O时执行缓冲10,为I时执行直接1 ;
[0016]2.4)以直接1模式将读请求所需的数据从存储设备读取到存储空间B中;
[0017]2.5)截取存储空间B的头部和尾部;
[0018]2.6)将截取后剩余的数据返回应用程序;
[0019]2.7)结束读操作,跳转执行步骤I)接收新的1请求。
[0020]优选地,所述步骤2.1)中具体是根据S = 0-0% BlockSize计算读请求的下边界S,所述步骤2.5)截取存储空间B的头部的长度为0% BlockSize,其中,O表示读请求的头部在文件中的偏移,%表示取余操作,BlockSize表示文件系统的块大小。
[0021]优选地,所述步骤2.2)中具体是根据 E= (0+L+BlockSize-l)+BlockSizeXBlockSize计算读请求的上边界E,所述步骤2.5)中截取存储空间B的尾部的长度为(0+L)-(O+L+BlockSize-1) +BlockSize XBlockSize,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,0+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。
[0022]优选地,所述步骤I)中计算1请求待读写数据所涉及的数据块数的详细步骤包括:判断1请求的起始地址和结束地址是否为文件系统数据块大小的整数倍,如果1请求的起始地址和结束地址不是文件系统数据块大小的整数倍,则对1请求的头部和尾部实施扩展,计算扩展后的1请求所涉及的数据块的数目;如果1请求的起始地址和结束地址是文件系统数据块大小的整数倍,则直接计算1请求的起始地址和结束地址所涉及的数据块的数目。
[0023]优选地,所述计算扩展后的1请求所涉及的数据块的数目具体是指计算(0+L+BlockSize-l)/BlockSize-0/BlockSize的结果值作为计算扩展后的1请求所涉及的数据块的数目,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,0+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。
[0024]优选地,所述步骤3)的详细步骤包括:
[0025]3.1)将写请求的待写数据拷贝到存储空间B,且在将待写数据拷贝到存储空间B时,在存储空间B的头部留出一段长度为0% BlockSize的空隙,其中O表示写请求在目标文件中的偏移量,为写请求的目标文件的第一个字节到写请求的第一个字节之间的距离,BlockSize表示文件系统块的大小;
[0026]3.2)设置一个用于记录当前准备写入的数据块号的数据块号计数器i,所述数据块号计数器i被初始化为I,表示首先写入原始写请求的第一个数据块;
[0027]3.3)判断原始写请求是否存在不能利用直接1模式的头部,若存在,则跳转执行步骤3.4);否则,跳转执行步骤3.8);
[0028]3.4)将写请求所对应目标文件的DIRECT_10标志位设置为0,准备以缓冲1模式将原始写请求的头部写入存储设备;
[0029]3.5)将原始写请求的头部以缓冲1模式写入存储设备;
[0030]3.6)递增所述数据块号计数器i ;
[0031]3.7)判断整个写请求是否完成,如果整个写请求已经完成,跳转执行步骤3.16);否则,跳转执行步骤3.8);
[0032]3.8)判断原始写请求是否存在不能利用直接1模式的尾部,若存在,则跳转执行步骤3.11);否则,跳转执行步骤3.9);
[0033]3.9)将写请求所对应目标文件的DIRECT_
当前第1页1 2 3 4 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1