面向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_
10标志位设置为I,准备以直接1模式将写请求的主体部分写入存储设备;
[0034]3.10)将写请求的主体部分写入存储设备,跳转执行步骤3.16);
[0035]3.11)判断写请求的主体部分是否存在,若存在,则跳转执行步骤3.12)准备以直接1模式写入主体部分;否则,跳转执行步骤3.14)准备以缓冲1模式写入尾部;
[0036]3.12)将写请求对应目标文件的DIRECT_10标志位设置为I,准备以直接1模式将原始写请求的主体部分写入存储设备;
[0037]3.13)以直接1模式将原始写请求的主体部分写入存储设备;
[0038]3.14)将写请求对应目标文件的DIRECT_10标志位设置为0,准备以缓冲1模式将原始写请求的尾部写入存储设备;
[0039]3.15)将还未写入部分以缓冲1模式写入存储设备;
[0040]3.16)结束写操作,跳转执行步骤I)接收新的1请求。
[0041]优选地,所述步骤3.3)具体是指通过判断0% BlockSize是否为O来判断原始写请求是否存在不能利用直接1模式的头部,若0% BlockSize不为0,则表示原始写请求存在不能利用直接1模式的头部,跳转执行步骤3.4);若0% BlockSize为0,则表示原始写请求不存在不能利用直接1模式的头部,跳转执行步骤3.8)。
[0042]优选地,所述步骤3.8)具体是指通过判断(0+L) % BlockSize是否为O来判断原始写请求是否存在不能利用直接1模式的尾部,若(0+L) % BlockSize不为0,则表示原始写请求存在不能利用直接1模式的尾部,跳转执行步骤3.11);若(0+L)% BlockSize为0,则表示原始写请求不存在不能利用直接1模式的尾部,跳转执行步骤3.9)。
[0043]优选地,所述步骤3.11)的详细步骤包括:判断写请求待读写数据所涉及的数据块数N是否大于2,如果写请求待读写数据所涉及的数据块数N大于2,则判定写请求的主体部分存在,跳转执行步骤3.12)准备以直接1模式写入主体部分;否则,判定写请求的主体部分不存在,跳转执行步骤3.14)准备以缓冲1模式写入尾部。
[0044]本发明面向SSD的文件系统中自适应直接1加速方法具有下述优点:
[0045]1、本发明针对现有技术的文件系统不能充分发挥SSD高性能的问题,尽可能的利用直接1模式,减少1路径上的内存拷贝,能够显著提升基于SSD的存储系统的性能。由于SSD的带宽基本接近内存的量级,1路径上内存拷贝带来的延迟与读写设备的延迟相当。本发明通过减少内存拷贝显著降低整个存储系统的1延迟,并降低系统功耗,具有1路径短、读写延迟低、低功耗的优点。
[0046]2、本发明不要求改变应用程序访问存储系统的接口,与现有的存储系统是兼容的。本发明接收到应用程序发出的1请求时,将1请求分成头部、主体和尾部三个部分。其中,头部和尾部仍然用传统的缓冲1模式执行,主体部分用高性能的直接1模式执行。这种自适应性使得应用程序可以发出任意偏移、任意长度的1请求,而不必局限于直接1模式所必需的两个前提条件。所以,本发明具有兼容性好的优点。
[0047]3、本发明不引入额外的内存开销,具有空间开销为O的优点。而且,本发明的技术方案中不存在复杂的计算,所涉及的步骤仅为一些简单的操作,如:判断地址是否为数据块大小的整数倍、将数据放在缓冲区的合适位置、修改文件访问的标志位等。所以,本发明还具有计算开销低的优点。
【附图说明】
[0048]图1为本发明实施例方法的基本流程示意图。
[0049]图2为本发明实施例方法中步骤2)的基本流程示意图。
[0050]图3为本发明实施例方法中步骤3)的基本流程示意图。
【具体实施方式】
[0051]如图1所示,本实施例面向SSD的文件系统中自适应直接1加速方法的步骤包括:
[0052]I)当接收到应用程序的1请求时,在进程地址空间分配存储空间B,存储空间B的头部和尾部对应的逻辑地址为底层文件系统块大小的整数倍;计算1请求待读写数据所涉及的数据块数N,判断1请求的类型,若为读请求则跳转执行步骤2);否则跳转执行步骤3);
[0053]2)以直接1模式将读请求对应的数据块读取到存储空间B,并从存储空间B中获取读请求的有效目标数据返回给应用程序,结束读操作,跳转执行步骤I);
[0054]3)将写请求的写数据拷贝到存储空间B,将存储空间B中的写数据分成头部、主体和尾部三个部分,将写数据的头部和尾部对应的数据块以缓冲1模式写入存储设备;将写数据的主体部分对应的数据块以直接1模式写入存储设备,结束写操作,跳转执行步骤I)。
[0055]本实施例中,应用程序发出的1请求可表示成一个三元组(T,0,L),其中,T表示1类型,即读或写;0表示该1请求在文件中的偏移量,即文件的第一个字节到1请求的第一个字节之间的距离山表示1请求的长度,即1请求涉及的字节数。本实施例旨在充分发挥直接1模式的效能,使用直接1 (Direct 10)存在两个限制条件:(a)为1请求所分配的存储空间B的头部和尾部对应的逻辑地址必须是底层文件系统块大小的整数倍;(b) 1请求的起始地址和结束地址在文件中的偏移都必须是底层文件系统块大小的整数倍。而实际上,应用程序发出的1请求一般不满足以上两个条件,从而不能使用直接1模式。本本实施例为了使应用程序能够更多地使用直接1模式,在步骤I)中通过分配存储空间B,使得存储空间B的头部和尾部对应的逻辑地址为底层文件系统块大小的整数倍,从而力图使1请求满足条件(a),即:使存储空间B的头部和尾部对应的逻辑地址为文件系统块大小的整数倍。为此,所分配存储空间B的长度很可能不是L,而需要在存储空间B的头部和尾部作适当的扩充,所得的存储空间长度大于L。因此,本实施例中分配存储空间时需注意两点:(I)存储空间B的长度一般应大于L,这是因为后续的步骤会适当扩展原始1请求,但扩展的长度最多为2XBlockSize,这里必须为扩展后的1请求预留足够的存储空间;(II)分配存储空间时保证存储空间B的起始地址是文件系统数据块大小的整数倍。
[0056]本实施例中,步骤I)中计算1请求待读写数据所涉及的数据块数的详细步骤包括:判断1请求的起始地址和结束地址是否为文件系统数据块大小的整数倍,如果1请求的起始地址和结束地址不是文件系统数据块大小的整数倍,则对1请求的头部和尾部实施扩展,计算扩展后的1请求所涉及的数据块的数目;如果1请求的起始地址和结束地址是文件系统数据块大小的整数倍,则直接计算1请求的起始地址和结束地址所涉及的数据块的数目。
[0057]本实施例中,计算扩展后的1请求所涉及的数据块的数目具体是指计算(0+L+BlockSize-l)/BlockSize-0/BlockSize的结果值作为计算扩展后的1请求所涉及的数据块的数目,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,0+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。
[0058]如上文所述,直接1 (Direct 10)模式需要满足两个限制条件,而大多数1请求并不满足以上两个条件。本步骤力图使应用程序发出的1请求满足条件(b),S卩:使1请求的起始地址和结束地址在文件中的偏移是底层文件系统块大小的整数倍。为此,可能需要扩展1请求的头部和尾部,最终的结果是1请求变长,本步骤计算扩展后的1请求中所包含的文件系统数据块的数目。在文件系统中,每个文件的字节流以数据块为基本单位保存在存储设备上。数据块大小固定,一般为2的整数次幂。文件内部的任意偏移量一定落在某个数据块中。假定数据块大小为BlockSize,则偏移量Offset落在数据块Offset/BlockSize中,该数据块的起始地址为Offset/BlockSizeXBlockSize,终止地址为(Offset+BlockSize-1)/BlockSizeXBlockSize。
[0059]如图2所示,步骤2)的详细步骤包括:
[0060]2.1)计算读请求的下边界。为了使更多的10请求能够使用直接10模式,可能需要对10请求作适当的扩展,本步骤力图扩展10请求的头部,使10请求头部在文件中的偏移为文件系统的块大小的整数倍。对原始读请求的下边界实施扩展后,扩展后的下边界为Ο/BlockSizeXBlockSize其中,O表示读请求的头部在文件中的偏移,BlockSize表示文件系统的块大小。
[0061]2.2)计算读请求的上边界。为了使更多的10请求能够使用直接10模式,可能需要对10请求作适当的扩展,本步骤力图扩展10请求的尾部,使10请求尾部在文件中的偏移为文件系统的块大小的整数倍。对原始读请求的上边界实施扩展后,扩展后的上边界为(0+L+BlockSize-l) /BlockSize XBlockSize,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,BlockSize表示文件系统的块大小。
[0062]2.3)将读请求所对应目标文件的DIRECT_10标志位设置为1,DIRECT_10标志位为O时执行缓冲10,为I时执行直接10。本实施例中,每个文件在虚拟文件系统中被打开时,都为之建立了一个表示该文件使用情况的结构体,该结构体中含有一个DIRECT_10标志位。DIR
ECT_10标志位为I时,所有针对该文件的读写操作都以直接10模式执行;DIRECT_10标志位为O时,所有针对该文件的读写操作都以缓冲10模式执行。本步骤为了使经过步骤5)和步骤6)扩展的读请求能够利用直接10模式,需要将DIRECT_10标志位置为I。DIRECT,10标志位属于内核数据结构,若本发明在内核态实现,则可直接在内核中改变DIRECT_10标志位的值;若本发明在用户态实现,则需要设置一个内核模块间接改变DIRECT_10标志位的值。
[0063]2.4)以直接10模式将读请求所需的数据从存储设备读取到存储空间B中。注意,由于步骤2.1)和步骤2.2)对原始10请求作了适当的扩展,本步骤读取的数据量可能大于原始10请求的数据量L。
[0064]2.5)截取存储空间B的头部和尾部。由于本实施例步骤2.1)和步骤2.2)分别对原始读请求的头部和尾部作了适当扩展,导致步骤2.4)从存储设备读入了较多的数据,本步骤截取扩展部分。具体地,截取后的有效数据起始于存储空间B的0% BlockSize位置,结束于存储空间B的0% BlockSize+L位置。
[0065]2.6)将截取后剩余的数据返回应用程序。
[0066]2.7)结束读操作,跳转执行步骤I)接收新的10请求。
[0067]本发明将待写数据划分为头部、主体和尾部三个部分。其中,头部和尾部不能利用直接10模式执行。为了使主体部分能够利用直接10模式,必须保证主体部分在存储空间B中的起始地址为文件系统数据块大小的整数倍。所以,向存储空间B中拷贝待写数据时,可能需要在存储空间B的头部留出一段空隙,空隙大小为0% BlockSizeo这样,空隙和原始写请求的头部组成了一个数据块,后续的主体部分也保存在若干个数据块中,主体部分在存储空间B中的起始地址和结束地址都是文件系统数据块大小的整数倍,可以利用直接1模式。
[0068]本实施例中,步骤2.1)中具体是根据S = 0-0% BlockSize计算读请求的下边界S,步骤2.5)截取存储空间B的头部的长度为0% BlockSize,其中,O表示读请求的头部在文件中的偏移,%表示取余操作,BlockSize表示文件系统的块大小。本实施例中,步骤
2.2)中具体是根据E = (O+L+BlockSize-1) +BlockSizeXBlockSize计算读请求的上边界E,步骤2.5)中截取存储空间B的尾部的长度为(0+L)-(0+L+BlockSize-l) +BlockSizeXBlockSize,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,0+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。需要说明的是,由于所涉及的参数都为整数,E = (O+L+BlockSize-1) -^BlockSizeXBlockSize 中计算出的 E—定为BlockSize的整数倍。
[0069]如图3所示,步骤3)的详细步骤包括:
[0070]3.1)将写请求的待写数据拷贝到存储空间B,且在将待写数据拷贝到存储空间B时,在存储空间B的头部留出一段长度为0% BlockSize的空隙,其中O表示写请求在目标文件中的偏移量,为写请求的目标文件的第一个字节到写请求的第一个字节之间的距离,BlockSize表示文件系统块的大小。
[0071]本实施例中,在拷贝数据时可能需要在存储空间B的头部留一段空隙,这主要是为了创造条件使原始10请求中更多的部分能够利用直接10模式。如前文所述,直接10需要满足两个限制条件。其中的条件(b)是指:10请求的起始地址和结束地址在文件中的偏移都必须是底层文件系统块大小的整数倍。如果原始写请求满足O和0+L都是文件系统块大小的整数倍,则整个写请求都可利用直接10模式完成。然而,实际应用程序发出的写请求很可能不满足以上假定。如果O不是文件系统大小的整数倍,则原始写请求的头部不能以直接10模式完成;如果0+L不是文件系统块大小的整数倍,则原始写请求的尾部不能以直接10模式完成。为此,本发明将原始写请求分成三段:头部、主体、尾部。这三个部分不是对每个写请求都是必须存在,其中,头部只有在O不是文件系统块大小的整数倍时才存在,其长度为0-(0+BlockSize-l) +BlockSizeXBlockSize ;尾部只有在0+L不是文件系统块大小的整数倍时才存在,其长度为(0+L) % BlockSize?头部和尾部都以缓冲10模式完成写操作,主体部分力图使用直接10模式完成写操作。为了使主体部分能够利用直接10模式,必须保证主体部分对应的数据在存储空间B中的起始地址和结束地址都是文件系统块大小的整数倍,即满足直接10模式的条件(a)。为了达到这一目的,将待写数据拷贝到存储空间B时,在存储空间B的头部留出一段长度为0% BlockSize的空隙即可。
[0072]3.2)设置一个用于记录当前准备写入的数据块号的数据块号计数器i,数据块号计数器i被初始化为1,表示首先写入原始写请求的第一个数据块。
[0073]3.3)判断原始写请求是否存在不能利用直接10模式的头部,若存在,则跳转执行步骤3.4);否则,跳转执行步骤3.8)。
[0074]判断头部是否存在的关键是看写请求的起始地址O是否为文件系统数据块大小BlockSize的整数倍。本实施例中,步骤3.3)具体是指通过判断O % BlockSize是否为O来判断原始写请求是否存在不能利用直接1模式的头部,若0% BlockSize不为0,则表示原始写请求存在不能利用直接1模式的头部,跳转执行步骤3.4);若0% BlockSize为0,则表示原始写请求不存在不能利用直接1模式的头部,跳转执行步骤3.8)。本实施例中针对步骤3.3)设置了一个函数Align(O) = 0% BlockSize,当函数返回O时,表明原始写请求的起始地址O是文件系统数据块大小的整数倍,所以头部不存在;反之,函数返回非O时,说明头部存在。
[0075]3.4)将写请求所对应目标文件的DIRECT_10标志位设置为0,准备以缓冲10模式将原始写请求的头部写入存储设备。
[0076]3.5)将原始写请求的头部以缓冲10模式写入存储设备。
[0077]3.6)递增数据块号计数器i。
[0078]3.7)判断整个写请求是否完成,如果整个写请求已经完成,跳转执行步骤3.16);否则,跳转执行步骤3.8)。
[0079]3.8)判断原始写请求是否存在不能利用直接10模式的尾部,若存在,则跳转执行步骤3.11);否则,跳转执行步骤3.9)。
[0080]判断尾部是否存在的关键是看写请求的结束地址0+L是否为文件系统数据块大小BlockSize的整数倍。本实施例中,步骤3.8)具体是指通过判断(0+L) % BlockSize是否为O来判断原始写请求是否存在不能利用直接10模式的尾部,若(0+L) % BlockSize不为0,则表示原始写请求存在不能利用直接10模式的尾部,跳转执行步骤3.11);若(0+L)%BlockSize为0,则表示原始写请求不存在不能利用直接10模式的尾部,跳转执行步骤3.9)0本实施例中针对步骤3.8)设置了一个函数Align(0+L) = (0+L) % BlockSize,当函数返回O时,表明原始写请求的起始地址O是文件系统数据块大小的整数倍,所以头部不存在;反之,函数返回非O时,说明头部存在。
[0081 ] 3.9)将写请求所对应目标文件的DIRECT_10标志位设置为I,准备以直接10模式将写请求的主体部分写入存储设备。
[0082]3.10)将写请求的主体部分写入存储设备,跳转执行步骤3.16)。
[0083]3.11)判断写请求的主体部分是否存在,若存在,则跳转执行步骤3.12)准备以直接10模式写入主体部分;否则,跳转执行步骤3.14)准备以缓冲10模式写入尾部。
[0084]本实施例中,步骤3.11)的详细步骤包括:判断写请求待读写数据所涉及的数据块数N是否大于2,如果写请求待读写数据所涉及的数据块数N大于2,则判定写请求的主体部分存在,跳转执行步骤3.12)准备以直接10模式写入主体部分;否则,判定写请求的主体部分不存在,跳转执行步骤3.14)准备以缓冲10模式写入尾部。步骤3.11)的判定原理可解释为:当写请求待读写数据所涉及的数据块数N大于2时,写请求至少占据3个数据块,因为写请求的头部和尾部最多各占一个数据块,所以一定存在可利用直接10模式的主体部分,出现这种情况时,跳转步骤3.12)试图将主题部分已直接10模式写入存储设备。实际上,当写请求待读写数据所涉及的数据块数N小于等于2时,写请求也可能存在主体部分,但由于该主体部分较小,最多仅为一个数据块,若仍然采用直接10模式处理,则会导致原始写请求被拆分成两个很小的写请求,增加了 10量,而较小的主体部分采用直接10模式并不会取得显著的效果,采用缓冲10模式也不会严重影响写性能。所以出现这种情况时,直接跳转步骤3.14),按缓冲1模式将写请求的还没有写入存储设备的剩余部分写入存储设备。
[0085]3.12)将写请求对应目标文件的DIRECT_10标志位设置为I,准备以直接1模式将原始写请求的主体部分写入存储设备。
[0086]3.13)以直接1模式将原始写请求的主体部分写入存储设备
。
[0087]3.14)将写请求对应目标文件的DIRECT_10标志位设置为0,准备以缓冲1模式将原始写请求的尾部写入存储设备。
[0088]3.15)将还未写入部分以缓冲1模式写入存储设备。
[0089]3.16)结束写操作,跳转执行步骤I)接收新的1请求。
[0090]综上所述,本实施例使用直接1模式对应用程序发出的读写请求进行加速,每当应用程序发出读写请求时,首先根据读写请求的起始地址和长度为读写数据合理地分配用户存储空间,然后将原始请求划分成头部、主体和尾部三个部分,最后利用缓冲1模式处理头部和尾部、利用直接1模式处理主体部分。由于本实施例直接1模式减少了内存拷贝,以上所述作法能够有效降低读写请求的延迟,取得显著的加速效果,因此具有加速效果好、兼容性高、功耗低、时间和空间低的优点。
[0091]以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
【主权项】
1.一种面向SSD的文件系统中自适应直接1加速方法,其特征在于步骤包括: 1)当接收到应用程序的1请求时,在进程地址空间分配存储空间B,所述存储空间B的头部和尾部对应的逻辑地址为底层文件系统块大小的整数倍;计算1请求待读写数据所涉及的数据块数N,判断1请求的类型,若为读请求则跳转执行步骤2);否则跳转执行步骤3); 2)以直接1模式将读请求对应的数据块读取到存储空间B,并从存储空间B中获取读请求的有效目标数据返回给应用程序,结束读操作,跳转执行步骤I); 3)将写请求的写数据拷贝到存储空间B,将存储空间B中的写数据分成头部、主体和尾部三个部分,将写数据的头部和尾部对应的数据块以缓冲1模式写入存储设备;将写数据的主体部分对应的数据块以直接1模式写入存储设备,结束写操作,跳转执行步骤I)。2.根据权利要求1所述的面向SSD的文件系统中自适应直接1加速方法,其特征在于,所述步骤2)的详细步骤包括: 2.1)计算读请求的下边界; 2.2)计算读请求的上边界; 2.3)将读请求所对应目标文件的DIRECT_10标志位设置为1,所述DIRECT_10标志位为O时执行缓冲10,为I时执行直接1 ; 2.4)以直接1模式将读请求所需的数据从存储设备读取到存储空间B中; 2.5)截取存储空间B的头部和尾部; 2.6)将截取后剩余的数据返回应用程序; 2.7)结束读操作,跳转执行步骤I)接收新的1请求。3.根据权利要求2所述的面向SSD的文件系统中自适应直接1加速方法,其特征在于:所述步骤2.1)中具体是根据S = 0-0% BlockSize计算读请求的下边界S,所述步骤2.5)截取存储空间B的头部的长度为0% BlockSize,其中,O表示读请求的头部在文件中的偏移,%表示取余操作,BlockSize表示文件系统的块大小。4.根据权利要求3所述的面向SSD的文件系统中自适应直接1加速方法,其特征在于:所述步骤 2.2)中具体是根据 E= (0+L+BlockSize-l)+BlockSizeXBlockSize 计算读请求的上边界E,所述步骤2.5)中截取存储空间B的尾部的长度为(0+L)-(0+L+BlockSize-1) +BlockSizeXBlockSize,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,0+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。5.根据权利要求4所述的面向SSD的文件系统中自适应直接10加速方法,其特征在于:所述步骤I)中计算10请求待读写数据所涉及的数据块数的详细步骤包括:判断10请求的起始地址和结束地址是否为文件系统数据块大小的整数倍,如果10请求的起始地址和结束地址不是文件系统数据块大小的整数倍,则对10请求的头部和尾部实施扩展,计算扩展后的10请求所涉及的数据块的数目;如果10请求的起始地址和结束地址是文件系统数据块大小的整数倍,则直接计算10请求的起始地址和结束地址所涉及的数据块的数目。6.根据权利要求5所述的面向SSD的文件系统中自适应直接10加速方法,其特征在于:所述计算扩展后的10请求所涉及的数据块的数目具体是指计算(0+L+BlockSize-l)/BlockSize-0/BlockSize的结果值作为计算扩展后的10请求所涉及的数据块的数目,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,0+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。7.根据权利要求1?6中任意一项所述的面向SSD的文件系统中自适应直接1加速方法,其特征在于,所述步骤3)的详细步骤包括: 3.1)将写请求的待写数据拷贝到存储空间B,且在将待写数据拷贝到存储空间B时,在存储空间B的头部留出一段长度为0% BlockSize的空隙,其中O表示写请求在目标文件中的偏移量,为写请求的目标文件的第一个字节到写请求的第一个字节之间的距离,BlockSize表示文件系统块的大小; 3.2)设置一个用于记录当前准备写入的数据块号的数据块号计数器i,所述数据块号计数器i被初始化为I,表示首先写入原始写请求的第一个数据块; 3.3)判断原始写请求是否存在不能利用直接1模式的头部,若存在,则跳转执行步骤3.4);否则,跳转执行步骤3.8); 3.4)将写请求所对应目标文件的DIRECT_10标志位设置为0,准备以缓冲1模式将原始写请求的头部写入存储设备; 3.5)将原始写请求的头部以缓冲1模式写入存储设备; 3.6)递增所述数据块号计数器i ; 3.7)判断整个写请求是否完成,如果整个写请求已经完成,跳转执行步骤3.16);否贝IJ,跳转执行步骤3.8); 3.8)判断原始写请求是否存在不能利用直接1模式的尾部,若存在,则跳转执行步骤3.11);否则,跳转执行步骤3.9); 3.9)将写请求所对应目标文件的DIRECT_10标志位设置为I,准备以直接1模式将写请求的主体部分写入存储设备; 3.10)将写请求的主体部分写入存储设备,跳转执行步骤3.16); 3.11)判断写请求的主体部分是否存在,若存在,则跳转执行步骤3.12)准备以直接1模式写入主体部分;否则,跳转执行步骤3.14)准备以缓冲1模式写入尾部; 3.12)将写请求对应目标文件的DIRECT_10标志位设置为1,准备以直接1模式将原始写请求的主体部分写入存储设备; 3.13)以直接1模式将原始写请求的主体部分写入存储设备; 3.14)将写请求对应目标文件的DIRECT_10标志位设置为0,准备以缓冲1模式将原始写请求的尾部写入存储设备; 3.15)将还未写入部分以缓冲1模式写入存储设备; 3.16)结束写操作,跳转执行步骤I)接收新的1请求。8.根据权利要求7所述的面向SSD的文件系统中自适应直接1加速方法,其特征在于:所述步骤3.3)具体是指通过判断0% BlockSize是否为O来判断原始写请求是否存在不能利用直接1模式的头部,若0% BlockSize不为0,则表示原始写请求存在不能利用直接1模式的头部,跳转执行步骤3.4);若0% BlockSize为0,则表示原始写请求不存在不能利用直接1模式的头部,跳转执行步骤3.8)。9.根据权利要求8所述的面向SSD的文件系统中自适应直接1加速方法,其特征在于:所述步骤3.8)具体是指通过判断(0+L) % BlockSize是否为O来判断原始写请求是否存在不能利用直接1模式的尾部,若(0+L) % BlockSize不为0,则表示原始写请求存在不能利用直接1模式的尾部,跳转执行步骤3.11);若(0+L) % BlockSize为0,则表示原始写请求不存在不能利用直接1模式的尾部,跳转执行步骤3.9)。10.根据权利要求9所述的面向SSD的文件系统中自适应直接1加速方法,其特征在于:所述步骤3.11)的详细步骤包括:判断写请求待读写数据所涉及的数据块数N是否大于2,如果写请求待读写数据所涉及的数据块数N大于2,则判定写请求的主体部分存在,跳转执行步骤3.12)准备以直接1模式写入主体部分;否则,判定写请求的主体部分不存在,跳转执行步骤3.14)准备以缓冲1模式写入尾部。
【专利摘要】本发明公开了一种面向SSD的文件系统中自适应直接IO加速方法,步骤包括:当接收到IO请求时,分配存储空间B,计算IO请求待读写数据所涉及的数据块数N,判断IO请求的类型,若为读请求则以直接IO模式将数据块读取到存储空间B,获取读数据返回给应用程序;否则将写请求的写数据拷贝到存储空间B,将写数据分成头部、主体和尾部,将写数据的头部和尾部对应的数据块以缓冲IO模式写入存储设备;将写数据的主体部分对应的数据块以直接IO模式写入存储设备。本发明适用于数据密集型应用,能够显著降低存储系统的IO延迟,降低系统功耗,IO路径短、IO速度快、读写延迟低、与现有存储系统兼容、内存开销低。
【IPC分类】G06F3/06
【公开号】CN104881248
【申请号】CN201510236213
【发明人】周恩强, 张伟, 陈志广, 董勇, 卢宇彤, 朱清华
【申请人】中国人民解放军国防科学技术大学
【公开日】2015年9月2日
【申请日】2015年5月11日
转载请注明原文地址:https://www.famiwei.com/read-8138825.html