CN104881248A - 面向ssd的文件系统中自适应直接io加速方法 - Google Patents
面向ssd的文件系统中自适应直接io加速方法 Download PDFInfo
- Publication number
- CN104881248A CN104881248A CN201510236213.9A CN201510236213A CN104881248A CN 104881248 A CN104881248 A CN 104881248A CN 201510236213 A CN201510236213 A CN 201510236213A CN 104881248 A CN104881248 A CN 104881248A
- Authority
- CN
- China
- Prior art keywords
- request
- write
- direct
- pattern
- blocksize
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Granted
Links
Abstract
本发明公开了一种面向SSD的文件系统中自适应直接IO加速方法,步骤包括:当接收到IO请求时,分配存储空间B,计算IO请求待读写数据所涉及的数据块数N,判断IO请求的类型,若为读请求则以直接IO模式将数据块读取到存储空间B,获取读数据返回给应用程序;否则将写请求的写数据拷贝到存储空间B,将写数据分成头部、主体和尾部,将写数据的头部和尾部对应的数据块以缓冲IO模式写入存储设备;将写数据的主体部分对应的数据块以直接IO模式写入存储设备。本发明适用于数据密集型应用,能够显著降低存储系统的IO延迟,降低系统功耗,IO路径短、IO速度快、读写延迟低、与现有存储系统兼容、内存开销低。
Description
技术领域
本发明涉及计算机操作系统领域,具体涉及一种面向SSD的文件系统中自适应直接IO加速方法,自适应地利用直接IO(Direct IO)方式缩短IO路径从而提高IO性能。
背景技术
目前,计算机系统面临的事务中以数据为中心的任务逐步占据主导地位。然而,在整个计算机系统中IO子系统一直滞后于计算子系统。如何为计算部件及时提供待处理数据并快速保存所得处理结果是计算机系统设计的一大挑战。待处理数据和所得处理结果一般通过文件系统保存在外部存储设备上,而计算部件和存储设备之间的数据交互需要经历一段很长的IO路径。以类Unix系统为例,应用程序请求数据时,先在该应用程序对应的进程空间申请一块存储区域,然后向VFS(虚拟文件系统)发出读请求,所述读请求进一步被发送到设备驱动层,并由设备驱动程序最终发送到具体的存储设备。存储设备返回数据后,所述读请求沿原路返回,依次经历设备驱动层、VFS层,并最终将读取的数据拷贝到读请求发出前申请的存储空间中。在基于磁盘的传统存储系统中,由于存储设备延迟极大、带宽较低,以上所述IO路径中设备驱动层以下部分成为主要的瓶颈,并导致整个存储系统的IO性能低下。
为了缓解由于存储设备缓慢而导致的IO性能低下的局面,研究人员在VFS层设计了一个基于内存的缓冲区,用来保留最近使用或者频繁使用的数据,从而将新的IO路径改为如下所述:以读请求为例,应用程序在进程空间申请一片存储区域后向VFS发出读请求,若所请求的数据保存在VFS的内存缓冲区中,则可直接将该数据从内存缓冲区拷贝到所申请用户数据存储区域;否则,VFS将读请求进一步发送到设备驱动层,并最终由底层存储设备响应,存储设备返回的数据首先保存在VFS的内存缓冲区,然后由缓冲区拷贝到所申请的用户数据存储区域。对于写请求,应用程序只需将待写数据拷贝到VFS的内存缓冲区即可,内存缓冲区会定期将数据刷新到底层持久存储设备。按以上所述IO路径执行IO请求的模式被称作缓冲IO(Buffer IO)。在缓冲IO模式下,当应用程序发出的IO请求表现出很强的局部性时,大量的IO请求可直接由内存缓冲区响应,从而有效缓解了磁盘的瓶颈效应。由于磁盘长期在计算机外存设备中占主导地位,而缓冲IO能够显著降低磁盘对IO性能的影响,因此,缓冲IO一直作为操作系统中的主流IO模式而被应用程序广泛地采用。
缓冲IO模式的高效能依赖于两个先决条件:应用程序发出的IO请求显示出很强的局部性;底层存储设备的性能显著低于内存。前者保证大量的IO请求能够在内存缓冲区中命中,从而减少由性能较差的底层存储设备响应的IO请求数量。后者主要为了防止缓冲IO模式引入的内存拷贝导致显著的性能损失。以缓冲IO模式执行读请求时,若应用程序所请求的数据没有保存在VFS的内存缓冲区中,则需要先从存储设备获取数据保存到内存缓冲区,再由内存缓冲区拷贝到用户存储空间。以缓冲IO模式执行写请求时,需要将用户存储空间的数据先拷贝到内存缓冲区,再由内存缓冲区写到底层持久存储设备。总之,无论读写操作都需要一次额外的内存拷贝,而不允许用户存储空间和底层存储设备直接交互。当底层存储设备为磁盘时,由于磁盘的读写延迟极大、带宽很低,相比于磁盘带来的延迟,内存拷贝的时间开销可忽略不计。因此,在基于磁盘的存储系统中缓冲IO模式能取得较好的效能。
然而,在当前的应用需求和技术背景下,缓冲IO模式所需要的两个条件已很难保证。一方面,当前的许多应用以数据为中心,由于数据量空前增长,应用程序发出的IO请求表现出较弱的局部性,导致VFS中的内存缓冲区取得的命中率有限,缓冲IO模式很难发挥较高的效能。另一方面,新近出现的SSD(Solid State Drive,固态盘)能够提供较高的性能,基于PCIE接口的SSD所提供的带宽甚至达到与内存相当的量级。由于底层存储设备速度变快,IO请求花在设备上的延时变短。相应地,缓冲IO引入的内存拷贝带来的时间开销在整个IO延迟中所占的分量加重,且不可再忽略不计。鉴于以上两点原因,缓冲IO模式已不适用于面向数据密集型应用的基于SSD的大规模存储系统。
发明内容
本发明要解决的技术问题是:针对现有技术的上述问题,提供一种适用于数据密集型应用,能够显著降低存储系统的IO延迟,降低系统功耗,IO路径短、IO速度快、读写延迟低、与现有存储系统兼容、内存开销低的面向SSD的文件系统中自适应直接IO加速方法。
为了解决上述技术问题,本发明采用的技术方案为:
一种面向SSD的文件系统中自适应直接IO加速方法,步骤包括:
1)当接收到应用程序的IO请求时,在进程地址空间分配存储空间B,所述存储空间B的头部和尾部对应的逻辑地址为底层文件系统块大小的整数倍;计算IO请求待读写数据所涉及的数据块数N,判断IO请求的类型,若为读请求则跳转执行步骤2);否则跳转执行步骤3);
2)以直接IO模式将读请求对应的数据块读取到存储空间B,并从存储空间B中获取读请求的有效目标数据返回给应用程序,结束读操作,跳转执行步骤1);
3)将写请求的写数据拷贝到存储空间B,将存储空间B中的写数据分成头部、主体和尾部三个部分,将写数据的头部和尾部对应的数据块以缓冲IO模式写入存储设备;将写数据的主体部分对应的数据块以直接IO模式写入存储设备,结束写操作,跳转执行步骤1)。
优选地,所述步骤2)的详细步骤包括:
2.1)计算读请求的下边界;
2.2)计算读请求的上边界;
2.3)将读请求所对应目标文件的DIRECT_IO标志位设置为1,所述DIRECT_IO标志位为0时执行缓冲IO,为1时执行直接IO;
2.4)以直接IO模式将读请求所需的数据从存储设备读取到存储空间B中;
2.5)截取存储空间B的头部和尾部;
2.6)将截取后剩余的数据返回应用程序;
2.7)结束读操作,跳转执行步骤1)接收新的IO请求。
优选地,所述步骤2.1)中具体是根据S=O-O%BlockSize计算读请求的下边界S,所述步骤2.5)截取存储空间B的头部的长度为O%BlockSize,其中,O表示读请求的头部在文件中的偏移,%表示取余操作,BlockSize表示文件系统的块大小。
优选地,所述步骤2.2)中具体是根据E=(O+L+BlockSize-1)÷BlockSize×BlockSize计算读请求的上边界E,所述步骤2.5)中截取存储空间B的尾部的长度为(O+L)-(O+L+BlockSize-1)÷BlockSize×BlockSize,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,O+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。
优选地,所述步骤1)中计算IO请求待读写数据所涉及的数据块数的详细步骤包括:判断IO请求的起始地址和结束地址是否为文件系统数据块大小的整数倍,如果IO请求的起始地址和结束地址不是文件系统数据块大小的整数倍,则对IO请求的头部和尾部实施扩展,计算扩展后的IO请求所涉及的数据块的数目;如果IO请求的起始地址和结束地址是文件系统数据块大小的整数倍,则直接计算IO请求的起始地址和结束地址所涉及的数据块的数目。
优选地,所述计算扩展后的IO请求所涉及的数据块的数目具体是指计算(O+L+BlockSize-1)/BlockSize-O/BlockSize的结果值作为计算扩展后的IO请求所涉及的数据块的数目,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,O+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。
优选地,所述步骤3)的详细步骤包括:
3.1)将写请求的待写数据拷贝到存储空间B,且在将待写数据拷贝到存储空间B时,在存储空间B的头部留出一段长度为O%BlockSize的空隙,其中O表示写请求在目标文件中的偏移量,为写请求的目标文件的第一个字节到写请求的第一个字节之间的距离,BlockSize表示文件系统块的大小;
3.2)设置一个用于记录当前准备写入的数据块号的数据块号计数器i,所述数据块号计数器i被初始化为1,表示首先写入原始写请求的第一个数据块;
3.3)判断原始写请求是否存在不能利用直接IO模式的头部,若存在,则跳转执行步骤3.4);否则,跳转执行步骤3.8);
3.4)将写请求所对应目标文件的DIRECT_IO标志位设置为0,准备以缓冲IO模式将原始写请求的头部写入存储设备;
3.5)将原始写请求的头部以缓冲IO模式写入存储设备;
3.6)递增所述数据块号计数器i;
3.7)判断整个写请求是否完成,如果整个写请求已经完成,跳转执行步骤3.16);否则,跳转执行步骤3.8);
3.8)判断原始写请求是否存在不能利用直接IO模式的尾部,若存在,则跳转执行步骤3.11);否则,跳转执行步骤3.9);
3.9)将写请求所对应目标文件的DIRECT_IO标志位设置为1,准备以直接IO模式将写请求的主体部分写入存储设备;
3.10)将写请求的主体部分写入存储设备,跳转执行步骤3.16);
3.11)判断写请求的主体部分是否存在,若存在,则跳转执行步骤3.12)准备以直接IO模式写入主体部分;否则,跳转执行步骤3.14)准备以缓冲IO模式写入尾部;
3.12)将写请求对应目标文件的DIRECT_IO标志位设置为1,准备以直接IO模式将原始写请求的主体部分写入存储设备;
3.13)以直接IO模式将原始写请求的主体部分写入存储设备;
3.14)将写请求对应目标文件的DIRECT_IO标志位设置为0,准备以缓冲IO模式将原始写请求的尾部写入存储设备;
3.15)将还未写入部分以缓冲IO模式写入存储设备;
3.16)结束写操作,跳转执行步骤1)接收新的IO请求。
优选地,所述步骤3.3)具体是指通过判断O%BlockSize是否为0来判断原始写请求是否存在不能利用直接IO模式的头部,若O%BlockSize不为0,则表示原始写请求存在不能利用直接IO模式的头部,跳转执行步骤3.4);若O%BlockSize为0,则表示原始写请求不存在不能利用直接IO模式的头部,跳转执行步骤3.8)。
优选地,所述步骤3.8)具体是指通过判断(O+L)%BlockSize是否为0来判断原始写请求是否存在不能利用直接IO模式的尾部,若(O+L)%BlockSize不为0,则表示原始写请求存在不能利用直接IO模式的尾部,跳转执行步骤3.11);若(O+L)%BlockSize为0,则表示原始写请求不存在不能利用直接IO模式的尾部,跳转执行步骤3.9)。
优选地,所述步骤3.11)的详细步骤包括:判断写请求待读写数据所涉及的数据块数N是否大于2,如果写请求待读写数据所涉及的数据块数N大于2,则判定写请求的主体部分存在,跳转执行步骤3.12)准备以直接IO模式写入主体部分;否则,判定写请求的主体部分不存在,跳转执行步骤3.14)准备以缓冲IO模式写入尾部。
本发明面向SSD的文件系统中自适应直接IO加速方法具有下述优点:
1、本发明针对现有技术的文件系统不能充分发挥SSD高性能的问题,尽可能的利用直接IO模式,减少IO路径上的内存拷贝,能够显著提升基于SSD的存储系统的性能。由于SSD的带宽基本接近内存的量级,IO路径上内存拷贝带来的延迟与读写设备的延迟相当。本发明通过减少内存拷贝显著降低整个存储系统的IO延迟,并降低系统功耗,具有IO路径短、读写延迟低、低功耗的优点。
2、本发明不要求改变应用程序访问存储系统的接口,与现有的存储系统是兼容的。本发明接收到应用程序发出的IO请求时,将IO请求分成头部、主体和尾部三个部分。其中,头部和尾部仍然用传统的缓冲IO模式执行,主体部分用高性能的直接IO模式执行。这种自适应性使得应用程序可以发出任意偏移、任意长度的IO请求,而不必局限于直接IO模式所必需的两个前提条件。所以,本发明具有兼容性好的优点。
3、本发明不引入额外的内存开销,具有空间开销为0的优点。而且,本发明的技术方案中不存在复杂的计算,所涉及的步骤仅为一些简单的操作,如:判断地址是否为数据块大小的整数倍、将数据放在缓冲区的合适位置、修改文件访问的标志位等。所以,本发明还具有计算开销低的优点。
附图说明
图1为本发明实施例方法的基本流程示意图。
图2为本发明实施例方法中步骤2)的基本流程示意图。
图3为本发明实施例方法中步骤3)的基本流程示意图。
具体实施方式
如图1所示,本实施例面向SSD的文件系统中自适应直接IO加速方法的步骤包括:
1)当接收到应用程序的IO请求时,在进程地址空间分配存储空间B,存储空间B的头部和尾部对应的逻辑地址为底层文件系统块大小的整数倍;计算IO请求待读写数据所涉及的数据块数N,判断IO请求的类型,若为读请求则跳转执行步骤2);否则跳转执行步骤3);
2)以直接IO模式将读请求对应的数据块读取到存储空间B,并从存储空间B中获取读请求的有效目标数据返回给应用程序,结束读操作,跳转执行步骤1);
3)将写请求的写数据拷贝到存储空间B,将存储空间B中的写数据分成头部、主体和尾部三个部分,将写数据的头部和尾部对应的数据块以缓冲IO模式写入存储设备;将写数据的主体部分对应的数据块以直接IO模式写入存储设备,结束写操作,跳转执行步骤1)。
本实施例中,应用程序发出的IO请求可表示成一个三元组(T,O,L),其中,T表示IO类型,即读或写;O表示该IO请求在文件中的偏移量,即文件的第一个字节到IO请求的第一个字节之间的距离;L表示IO请求的长度,即IO请求涉及的字节数。本实施例旨在充分发挥直接IO模式的效能,使用直接IO(Direct IO)存在两个限制条件:(a)为IO请求所分配的存储空间B的头部和尾部对应的逻辑地址必须是底层文件系统块大小的整数倍;(b)IO请求的起始地址和结束地址在文件中的偏移都必须是底层文件系统块大小的整数倍。而实际上,应用程序发出的IO请求一般不满足以上两个条件,从而不能使用直接IO模式。本本实施例为了使应用程序能够更多地使用直接IO模式,在步骤1)中通过分配存储空间B,使得存储空间B的头部和尾部对应的逻辑地址为底层文件系统块大小的整数倍,从而力图使IO请求满足条件(a),即:使存储空间B的头部和尾部对应的逻辑地址为文件系统块大小的整数倍。为此,所分配存储空间B的长度很可能不是L,而需要在存储空间B的头部和尾部作适当的扩充,所得的存储空间长度大于L。因此,本实施例中分配存储空间时需注意两点:(I)存储空间B的长度一般应大于L,这是因为后续的步骤会适当扩展原始IO请求,但扩展的长度最多为2×BlockSize,这里必须为扩展后的IO请求预留足够的存储空间;(II)分配存储空间时保证存储空间B的起始地址是文件系统数据块大小的整数倍。
本实施例中,步骤1)中计算IO请求待读写数据所涉及的数据块数的详细步骤包括:判断IO请求的起始地址和结束地址是否为文件系统数据块大小的整数倍,如果IO请求的起始地址和结束地址不是文件系统数据块大小的整数倍,则对IO请求的头部和尾部实施扩展,计算扩展后的IO请求所涉及的数据块的数目;如果IO请求的起始地址和结束地址是文件系统数据块大小的整数倍,则直接计算IO请求的起始地址和结束地址所涉及的数据块的数目。
本实施例中,计算扩展后的IO请求所涉及的数据块的数目具体是指计算(O+L+BlockSize-1)/BlockSize-O/BlockSize的结果值作为计算扩展后的IO请求所涉及的数据块的数目,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,O+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。
如上文所述,直接IO(Direct IO)模式需要满足两个限制条件,而大多数IO请求并不满足以上两个条件。本步骤力图使应用程序发出的IO请求满足条件(b),即:使IO请求的起始地址和结束地址在文件中的偏移是底层文件系统块大小的整数倍。为此,可能需要扩展IO请求的头部和尾部,最终的结果是IO请求变长,本步骤计算扩展后的IO请求中所包含的文件系统数据块的数目。在文件系统中,每个文件的字节流以数据块为基本单位保存在存储设备上。数据块大小固定,一般为2的整数次幂。文件内部的任意偏移量一定落在某个数据块中。假定数据块大小为BlockSize,则偏移量Offset落在数据块Offset/BlockSize中,该数据块的起始地址为Offset/BlockSize×BlockSize,终止地址为(Offset+BlockSize-1)/BlockSize×BlockSize。
如图2所示,步骤2)的详细步骤包括:
2.1)计算读请求的下边界。为了使更多的IO请求能够使用直接IO模式,可能需要对IO请求作适当的扩展,本步骤力图扩展IO请求的头部,使IO请求头部在文件中的偏移为文件系统的块大小的整数倍。对原始读请求的下边界实施扩展后,扩展后的下边界为O/BlockSize×BlockSize其中,O表示读请求的头部在文件中的偏移,BlockSize表示文件系统的块大小。
2.2)计算读请求的上边界。为了使更多的IO请求能够使用直接IO模式,可能需要对IO请求作适当的扩展,本步骤力图扩展IO请求的尾部,使IO请求尾部在文件中的偏移为文件系统的块大小的整数倍。对原始读请求的上边界实施扩展后,扩展后的上边界为(O+L+BlockSize-1)/BlockSize×BlockSize,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,BlockSize表示文件系统的块大小。
2.3)将读请求所对应目标文件的DIRECT_IO标志位设置为1,DIRECT_IO标志位为0时执行缓冲IO,为1时执行直接IO。本实施例中,每个文件在虚拟文件系统中被打开时,都为之建立了一个表示该文件使用情况的结构体,该结构体中含有一个DIRECT_IO标志位。DIRECT_IO标志位为1时,所有针对该文件的读写操作都以直接IO模式执行;DIRECT_IO标志位为0时,所有针对该文件的读写操作都以缓冲IO模式执行。本步骤为了使经过步骤5)和步骤6)扩展的读请求能够利用直接IO模式,需要将DIRECT_IO标志位置为1。DIRECT_IO标志位属于内核数据结构,若本发明在内核态实现,则可直接在内核中改变DIRECT_IO标志位的值;若本发明在用户态实现,则需要设置一个内核模块间接改变DIRECT_IO标志位的值。
2.4)以直接IO模式将读请求所需的数据从存储设备读取到存储空间B中。注意,由于步骤2.1)和步骤2.2)对原始IO请求作了适当的扩展,本步骤读取的数据量可能大于原始IO请求的数据量L。
2.5)截取存储空间B的头部和尾部。由于本实施例步骤2.1)和步骤2.2)分别对原始读请求的头部和尾部作了适当扩展,导致步骤2.4)从存储设备读入了较多的数据,本步骤截取扩展部分。具体地,截取后的有效数据起始于存储空间B的O%BlockSize位置,结束于存储空间B的O%BlockSize+L位置。
2.6)将截取后剩余的数据返回应用程序。
2.7)结束读操作,跳转执行步骤1)接收新的IO请求。
本发明将待写数据划分为头部、主体和尾部三个部分。其中,头部和尾部不能利用直接IO模式执行。为了使主体部分能够利用直接IO模式,必须保证主体部分在存储空间B中的起始地址为文件系统数据块大小的整数倍。所以,向存储空间B中拷贝待写数据时,可能需要在存储空间B的头部留出一段空隙,空隙大小为O%BlockSize。这样,空隙和原始写请求的头部组成了一个数据块,后续的主体部分也保存在若干个数据块中,主体部分在存储空间B中的起始地址和结束地址都是文件系统数据块大小的整数倍,可以利用直接IO模式。
本实施例中,步骤2.1)中具体是根据S=O-O%BlockSize计算读请求的下边界S,步骤2.5)截取存储空间B的头部的长度为O%BlockSize,其中,O表示读请求的头部在文件中的偏移,%表示取余操作,BlockSize表示文件系统的块大小。本实施例中,步骤2.2)中具体是根据E=(O+L+BlockSize-1)÷BlockSize×BlockSize计算读请求的上边界E,步骤2.5)中截取存储空间B的尾部的长度为(O+L)-(O+L+BlockSize-1)÷BlockSize×BlockSize,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,O+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。需要说明的是,由于所涉及的参数都为整数,E=(O+L+BlockSize-1)÷BlockSize×BlockSize中计算出的E一定为BlockSize的整数倍。
如图3所示,步骤3)的详细步骤包括:
3.1)将写请求的待写数据拷贝到存储空间B,且在将待写数据拷贝到存储空间B时,在存储空间B的头部留出一段长度为O%BlockSize的空隙,其中O表示写请求在目标文件中的偏移量,为写请求的目标文件的第一个字节到写请求的第一个字节之间的距离,BlockSize表示文件系统块的大小。
本实施例中,在拷贝数据时可能需要在存储空间B的头部留一段空隙,这主要是为了创造条件使原始IO请求中更多的部分能够利用直接IO模式。如前文所述,直接IO需要满足两个限制条件。其中的条件(b)是指:IO请求的起始地址和结束地址在文件中的偏移都必须是底层文件系统块大小的整数倍。如果原始写请求满足O和O+L都是文件系统块大小的整数倍,则整个写请求都可利用直接IO模式完成。然而,实际应用程序发出的写请求很可能不满足以上假定。如果O不是文件系统大小的整数倍,则原始写请求的头部不能以直接IO模式完成;如果O+L不是文件系统块大小的整数倍,则原始写请求的尾部不能以直接IO模式完成。为此,本发明将原始写请求分成三段:头部、主体、尾部。这三个部分不是对每个写请求都是必须存在,其中,头部只有在O不是文件系统块大小的整数倍时才存在,其长度为O-(O+BlockSize-1)÷BlockSize×BlockSize;尾部只有在O+L不是文件系统块大小的整数倍时才存在,其长度为(O+L)%BlockSize。头部和尾部都以缓冲IO模式完成写操作,主体部分力图使用直接IO模式完成写操作。为了使主体部分能够利用直接IO模式,必须保证主体部分对应的数据在存储空间B中的起始地址和结束地址都是文件系统块大小的整数倍,即满足直接IO模式的条件(a)。为了达到这一目的,将待写数据拷贝到存储空间B时,在存储空间B的头部留出一段长度为O%BlockSize的空隙即可。
3.2)设置一个用于记录当前准备写入的数据块号的数据块号计数器i,数据块号计数器i被初始化为1,表示首先写入原始写请求的第一个数据块。
3.3)判断原始写请求是否存在不能利用直接IO模式的头部,若存在,则跳转执行步骤3.4);否则,跳转执行步骤3.8)。
判断头部是否存在的关键是看写请求的起始地址O是否为文件系统数据块大小BlockSize的整数倍。本实施例中,步骤3.3)具体是指通过判断O%BlockSize是否为0来判断原始写请求是否存在不能利用直接IO模式的头部,若O%BlockSize不为0,则表示原始写请求存在不能利用直接IO模式的头部,跳转执行步骤3.4);若O%BlockSize为0,则表示原始写请求不存在不能利用直接IO模式的头部,跳转执行步骤3.8)。本实施例中针对步骤3.3)设置了一个函数Align(O)=O%BlockSize,当函数返回0时,表明原始写请求的起始地址O是文件系统数据块大小的整数倍,所以头部不存在;反之,函数返回非0时,说明头部存在。
3.4)将写请求所对应目标文件的DIRECT_IO标志位设置为0,准备以缓冲IO模式将原始写请求的头部写入存储设备。
3.5)将原始写请求的头部以缓冲IO模式写入存储设备。
3.6)递增数据块号计数器i。
3.7)判断整个写请求是否完成,如果整个写请求已经完成,跳转执行步骤3.16);否则,跳转执行步骤3.8)。
3.8)判断原始写请求是否存在不能利用直接IO模式的尾部,若存在,则跳转执行步骤3.11);否则,跳转执行步骤3.9)。
判断尾部是否存在的关键是看写请求的结束地址O+L是否为文件系统数据块大小BlockSize的整数倍。本实施例中,步骤3.8)具体是指通过判断(O+L)%BlockSize是否为0来判断原始写请求是否存在不能利用直接IO模式的尾部,若(O+L)%BlockSize不为0,则表示原始写请求存在不能利用直接IO模式的尾部,跳转执行步骤3.11);若(O+L)%BlockSize为0,则表示原始写请求不存在不能利用直接IO模式的尾部,跳转执行步骤3.9)。本实施例中针对步骤3.8)设置了一个函数Align(O+L)=(O+L)%BlockSize,当函数返回0时,表明原始写请求的起始地址O是文件系统数据块大小的整数倍,所以头部不存在;反之,函数返回非0时,说明头部存在。
3.9)将写请求所对应目标文件的DIRECT_IO标志位设置为1,准备以直接IO模式将写请求的主体部分写入存储设备。
3.10)将写请求的主体部分写入存储设备,跳转执行步骤3.16)。
3.11)判断写请求的主体部分是否存在,若存在,则跳转执行步骤3.12)准备以直接IO模式写入主体部分;否则,跳转执行步骤3.14)准备以缓冲IO模式写入尾部。
本实施例中,步骤3.11)的详细步骤包括:判断写请求待读写数据所涉及的数据块数N是否大于2,如果写请求待读写数据所涉及的数据块数N大于2,则判定写请求的主体部分存在,跳转执行步骤3.12)准备以直接IO模式写入主体部分;否则,判定写请求的主体部分不存在,跳转执行步骤3.14)准备以缓冲IO模式写入尾部。步骤3.11)的判定原理可解释为:当写请求待读写数据所涉及的数据块数N大于2时,写请求至少占据3个数据块,因为写请求的头部和尾部最多各占一个数据块,所以一定存在可利用直接IO模式的主体部分,出现这种情况时,跳转步骤3.12)试图将主题部分已直接IO模式写入存储设备。实际上,当写请求待读写数据所涉及的数据块数N小于等于2时,写请求也可能存在主体部分,但由于该主体部分较小,最多仅为一个数据块,若仍然采用直接IO模式处理,则会导致原始写请求被拆分成两个很小的写请求,增加了IO量,而较小的主体部分采用直接IO模式并不会取得显著的效果,采用缓冲IO模式也不会严重影响写性能。所以出现这种情况时,直接跳转步骤3.14),按缓冲IO模式将写请求的还没有写入存储设备的剩余部分写入存储设备。
3.12)将写请求对应目标文件的DIRECT_IO标志位设置为1,准备以直接IO模式将原始写请求的主体部分写入存储设备。
3.13)以直接IO模式将原始写请求的主体部分写入存储设备。
3.14)将写请求对应目标文件的DIRECT_IO标志位设置为0,准备以缓冲IO模式将原始写请求的尾部写入存储设备。
3.15)将还未写入部分以缓冲IO模式写入存储设备。
3.16)结束写操作,跳转执行步骤1)接收新的IO请求。
综上所述,本实施例使用直接IO模式对应用程序发出的读写请求进行加速,每当应用程序发出读写请求时,首先根据读写请求的起始地址和长度为读写数据合理地分配用户存储空间,然后将原始请求划分成头部、主体和尾部三个部分,最后利用缓冲IO模式处理头部和尾部、利用直接IO模式处理主体部分。由于本实施例直接IO模式减少了内存拷贝,以上所述作法能够有效降低读写请求的延迟,取得显著的加速效果,因此具有加速效果好、兼容性高、功耗低、时间和空间低的优点。
以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
Claims (10)
1.一种面向SSD的文件系统中自适应直接IO加速方法,其特征在于步骤包括:
1)当接收到应用程序的IO请求时,在进程地址空间分配存储空间B,所述存储空间B的头部和尾部对应的逻辑地址为底层文件系统块大小的整数倍;计算IO请求待读写数据所涉及的数据块数N,判断IO请求的类型,若为读请求则跳转执行步骤2);否则跳转执行步骤3);
2)以直接IO模式将读请求对应的数据块读取到存储空间B,并从存储空间B中获取读请求的有效目标数据返回给应用程序,结束读操作,跳转执行步骤1);
3)将写请求的写数据拷贝到存储空间B,将存储空间B中的写数据分成头部、主体和尾部三个部分,将写数据的头部和尾部对应的数据块以缓冲IO模式写入存储设备;将写数据的主体部分对应的数据块以直接IO模式写入存储设备,结束写操作,跳转执行步骤1)。
2.根据权利要求1所述的面向SSD的文件系统中自适应直接IO加速方法,其特征在于,所述步骤2)的详细步骤包括:
2.1)计算读请求的下边界;
2.2)计算读请求的上边界;
2.3)将读请求所对应目标文件的DIRECT_IO标志位设置为1,所述DIRECT_IO标志位为0时执行缓冲IO,为1时执行直接IO;
2.4)以直接IO模式将读请求所需的数据从存储设备读取到存储空间B中;
2.5)截取存储空间B的头部和尾部;
2.6)将截取后剩余的数据返回应用程序;
2.7)结束读操作,跳转执行步骤1)接收新的IO请求。
3.根据权利要求2所述的面向SSD的文件系统中自适应直接IO加速方法,其特征在于:所述步骤2.1)中具体是根据S=O-O%BlockSize计算读请求的下边界S,所述步骤2.5)截取存储空间B的头部的长度为O%BlockSize,其中,O表示读请求的头部在文件中的偏移,%表示取余操作,BlockSize表示文件系统的块大小。
4.根据权利要求3所述的面向SSD的文件系统中自适应直接IO加速方法,其特征在于:所述步骤2.2)中具体是根据E=(O+L+BlockSize-1)÷BlockSize×BlockSize计算读请求的上边界E,所述步骤2.5)中截取存储空间B的尾部的长度为(O+L)-(O+L+BlockSize-1)÷BlockSize×BlockSize,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,O+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。
5.根据权利要求4所述的面向SSD的文件系统中自适应直接IO加速方法,其特征在于:所述步骤1)中计算IO请求待读写数据所涉及的数据块数的详细步骤包括:判断IO请求的起始地址和结束地址是否为文件系统数据块大小的整数倍,如果IO请求的起始地址和结束地址不是文件系统数据块大小的整数倍,则对IO请求的头部和尾部实施扩展,计算扩展后的IO请求所涉及的数据块的数目;如果IO请求的起始地址和结束地址是文件系统数据块大小的整数倍,则直接计算IO请求的起始地址和结束地址所涉及的数据块的数目。
6.根据权利要求5所述的面向SSD的文件系统中自适应直接IO加速方法,其特征在于:所述计算扩展后的IO请求所涉及的数据块的数目具体是指计算(O+L+BlockSize-1)/BlockSize-O/BlockSize的结果值作为计算扩展后的IO请求所涉及的数据块的数目,其中,O表示读请求的头部在文件中的偏移,L表示读请求的长度,O+L表示读请求的尾部在文件中的偏移,BlockSize表示文件系统的块大小。
7.根据权利要求1~6中任意一项所述的面向SSD的文件系统中自适应直接IO加速方法,其特征在于,所述步骤3)的详细步骤包括:
3.1)将写请求的待写数据拷贝到存储空间B,且在将待写数据拷贝到存储空间B时,在存储空间B的头部留出一段长度为O%BlockSize的空隙,其中O表示写请求在目标文件中的偏移量,为写请求的目标文件的第一个字节到写请求的第一个字节之间的距离,BlockSize表示文件系统块的大小;
3.2)设置一个用于记录当前准备写入的数据块号的数据块号计数器i,所述数据块号计数器i被初始化为1,表示首先写入原始写请求的第一个数据块;
3.3)判断原始写请求是否存在不能利用直接IO模式的头部,若存在,则跳转执行步骤3.4);否则,跳转执行步骤3.8);
3.4)将写请求所对应目标文件的DIRECT_IO标志位设置为0,准备以缓冲IO模式将原始写请求的头部写入存储设备;
3.5)将原始写请求的头部以缓冲IO模式写入存储设备;
3.6)递增所述数据块号计数器i;
3.7)判断整个写请求是否完成,如果整个写请求已经完成,跳转执行步骤3.16);否则,跳转执行步骤3.8);
3.8)判断原始写请求是否存在不能利用直接IO模式的尾部,若存在,则跳转执行步骤3.11);否则,跳转执行步骤3.9);
3.9)将写请求所对应目标文件的DIRECT_IO标志位设置为1,准备以直接IO模式将写请求的主体部分写入存储设备;
3.10)将写请求的主体部分写入存储设备,跳转执行步骤3.16);
3.11)判断写请求的主体部分是否存在,若存在,则跳转执行步骤3.12)准备以直接IO模式写入主体部分;否则,跳转执行步骤3.14)准备以缓冲IO模式写入尾部;
3.12)将写请求对应目标文件的DIRECT_IO标志位设置为1,准备以直接IO模式将原始写请求的主体部分写入存储设备;
3.13)以直接IO模式将原始写请求的主体部分写入存储设备;
3.14)将写请求对应目标文件的DIRECT_IO标志位设置为0,准备以缓冲IO模式将原始写请求的尾部写入存储设备;
3.15)将还未写入部分以缓冲IO模式写入存储设备;
3.16)结束写操作,跳转执行步骤1)接收新的IO请求。
8.根据权利要求7所述的面向SSD的文件系统中自适应直接IO加速方法,其特征在于:所述步骤3.3)具体是指通过判断O%BlockSize是否为0来判断原始写请求是否存在不能利用直接IO模式的头部,若O%BlockSize不为0,则表示原始写请求存在不能利用直接IO模式的头部,跳转执行步骤3.4);若O%BlockSize为0,则表示原始写请求不存在不能利用直接IO模式的头部,跳转执行步骤3.8)。
9.根据权利要求8所述的面向SSD的文件系统中自适应直接IO加速方法,其特征在于:所述步骤3.8)具体是指通过判断(O+L)%BlockSize是否为0来判断原始写请求是否存在不能利用直接IO模式的尾部,若(O+L)%BlockSize不为0,则表示原始写请求存在不能利用直接IO模式的尾部,跳转执行步骤3.11);若(O+L)%BlockSize为0,则表示原始写请求不存在不能利用直接IO模式的尾部,跳转执行步骤3.9)。
10.根据权利要求9所述的面向SSD的文件系统中自适应直接IO加速方法,其特征在于:所述步骤3.11)的详细步骤包括:判断写请求待读写数据所涉及的数据块数N是否大于2,如果写请求待读写数据所涉及的数据块数N大于2,则判定写请求的主体部分存在,跳转执行步骤3.12)准备以直接IO模式写入主体部分;否则,判定写请求的主体部分不存在,跳转执行步骤3.14)准备以缓冲IO模式写入尾部。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510236213.9A CN104881248B (zh) | 2015-05-11 | 2015-05-11 | 面向ssd的文件系统中自适应直接io加速方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201510236213.9A CN104881248B (zh) | 2015-05-11 | 2015-05-11 | 面向ssd的文件系统中自适应直接io加速方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN104881248A true CN104881248A (zh) | 2015-09-02 |
CN104881248B CN104881248B (zh) | 2018-04-17 |
Family
ID=53948758
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201510236213.9A Active CN104881248B (zh) | 2015-05-11 | 2015-05-11 | 面向ssd的文件系统中自适应直接io加速方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN104881248B (zh) |
Cited By (9)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105353978A (zh) * | 2015-10-22 | 2016-02-24 | 湖南国科微电子股份有限公司 | 一种pcie ssd阵列的数据读方法、系统及读写方法 |
CN106547476A (zh) * | 2015-09-22 | 2017-03-29 | 伊姆西公司 | 用于数据存储系统的方法和装置 |
WO2017092596A1 (zh) * | 2015-11-30 | 2017-06-08 | 华为技术有限公司 | 处理写请求的方法和移动终端 |
CN107220188A (zh) * | 2017-05-31 | 2017-09-29 | 莫倩 | 一种自适应缓冲块替换方法 |
CN109130866A (zh) * | 2018-08-27 | 2019-01-04 | 奇瑞汽车股份有限公司 | 一种新能源汽车驾驶数据上下电存储系统及控制方法 |
CN109783469A (zh) * | 2018-12-14 | 2019-05-21 | 上海威固信息技术股份有限公司 | 一种基于内容感知的数据去重方法与装置 |
CN110168513A (zh) * | 2016-12-14 | 2019-08-23 | 微软技术许可有限责任公司 | 在不同存储系统中对大文件的部分存储 |
CN113703667A (zh) * | 2021-07-14 | 2021-11-26 | 深圳市有为信息技术发展有限公司 | 实时存储数据的文件系统处理方法、装置、车载终端及商用车 |
CN115933995A (zh) * | 2023-01-09 | 2023-04-07 | 苏州浪潮智能科技有限公司 | 固态硬盘中数据写入方法、装置、电子设备及可读介质 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101060418A (zh) * | 2007-05-24 | 2007-10-24 | 上海清鹤数码科技有限公司 | 适用于带时移iptv直播服务器的专用磁盘读写系统 |
US20110106990A1 (en) * | 2009-10-30 | 2011-05-05 | International Business Machines Corporation | Efficient handling of queued-direct i/o requests and completions |
US20110276963A1 (en) * | 2010-05-04 | 2011-11-10 | Riverbed Technology, Inc. | Virtual Data Storage Devices and Applications Over Wide Area Networks |
CN102591842A (zh) * | 2010-12-17 | 2012-07-18 | 微软公司 | 在群集共享卷中的卷和文件系统 |
-
2015
- 2015-05-11 CN CN201510236213.9A patent/CN104881248B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN101060418A (zh) * | 2007-05-24 | 2007-10-24 | 上海清鹤数码科技有限公司 | 适用于带时移iptv直播服务器的专用磁盘读写系统 |
US20110106990A1 (en) * | 2009-10-30 | 2011-05-05 | International Business Machines Corporation | Efficient handling of queued-direct i/o requests and completions |
US20110276963A1 (en) * | 2010-05-04 | 2011-11-10 | Riverbed Technology, Inc. | Virtual Data Storage Devices and Applications Over Wide Area Networks |
CN102591842A (zh) * | 2010-12-17 | 2012-07-18 | 微软公司 | 在群集共享卷中的卷和文件系统 |
Cited By (13)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN106547476A (zh) * | 2015-09-22 | 2017-03-29 | 伊姆西公司 | 用于数据存储系统的方法和装置 |
CN105353978A (zh) * | 2015-10-22 | 2016-02-24 | 湖南国科微电子股份有限公司 | 一种pcie ssd阵列的数据读方法、系统及读写方法 |
WO2017092596A1 (zh) * | 2015-11-30 | 2017-06-08 | 华为技术有限公司 | 处理写请求的方法和移动终端 |
US10437519B2 (en) | 2015-11-30 | 2019-10-08 | Huawei Technologies Co., Ltd. | Method and mobile terminal for processing write request |
CN110168513A (zh) * | 2016-12-14 | 2019-08-23 | 微软技术许可有限责任公司 | 在不同存储系统中对大文件的部分存储 |
CN110168513B (zh) * | 2016-12-14 | 2023-10-20 | 微软技术许可有限责任公司 | 在不同存储系统中对大文件的部分存储 |
CN107220188A (zh) * | 2017-05-31 | 2017-09-29 | 莫倩 | 一种自适应缓冲块替换方法 |
CN107220188B (zh) * | 2017-05-31 | 2020-10-27 | 中山大学 | 一种自适应缓冲块替换方法 |
CN109130866A (zh) * | 2018-08-27 | 2019-01-04 | 奇瑞汽车股份有限公司 | 一种新能源汽车驾驶数据上下电存储系统及控制方法 |
CN109783469A (zh) * | 2018-12-14 | 2019-05-21 | 上海威固信息技术股份有限公司 | 一种基于内容感知的数据去重方法与装置 |
CN113703667A (zh) * | 2021-07-14 | 2021-11-26 | 深圳市有为信息技术发展有限公司 | 实时存储数据的文件系统处理方法、装置、车载终端及商用车 |
CN115933995A (zh) * | 2023-01-09 | 2023-04-07 | 苏州浪潮智能科技有限公司 | 固态硬盘中数据写入方法、装置、电子设备及可读介质 |
CN115933995B (zh) * | 2023-01-09 | 2023-05-09 | 苏州浪潮智能科技有限公司 | 固态硬盘中数据写入方法、装置、电子设备及可读介质 |
Also Published As
Publication number | Publication date |
---|---|
CN104881248B (zh) | 2018-04-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN104881248A (zh) | 面向ssd的文件系统中自适应直接io加速方法 | |
CN103049397B (zh) | 一种基于相变存储器的固态硬盘内部缓存管理方法及系统 | |
US7383290B2 (en) | Transaction processing systems and methods utilizing non-disk persistent memory | |
US9170753B2 (en) | Efficient method for memory accesses in a multi-core processor | |
CN104423894A (zh) | 数据储存装置以及快闪存储器控制方法 | |
CN104407933A (zh) | 一种数据的备份方法及装置 | |
CN108089825B (zh) | 一种基于分布式集群的存储系统 | |
CN111563052B (zh) | 降低读延时的缓存方法、装置、计算机设备及存储介质 | |
EP3506075A1 (en) | Mass storage device capable of fine grained read and/or write operations | |
CN104731635A (zh) | 一种虚拟机访问控制方法,及虚拟机访问控制系统 | |
CN113312300A (zh) | 一种融合数据传输和存储的非易失内存缓存方法 | |
CN105393228A (zh) | 读写闪存中数据的方法、装置及用户设备 | |
CN111694765A (zh) | 一种面向移动应用特征的非易失性内存文件系统多粒度空间管理方法 | |
CN109358818B (zh) | 一种数据中心的块设备io请求处理方法 | |
US20050203974A1 (en) | Checkpoint methods and systems utilizing non-disk persistent memory | |
CN102999441A (zh) | 一种细粒度内存访问的方法 | |
CN107250995B (zh) | 存储器管理设备 | |
CN104778100A (zh) | 一种安全备份数据的方法 | |
CN104281545A (zh) | 一种数据读取方法及设备 | |
CN107943413B (zh) | 一种固态硬盘提升读性能的方法 | |
CN110109677B (zh) | 一种动态对象缓存池分配方法 | |
CN104899158A (zh) | 访存优化方法和装置 | |
CN116755625A (zh) | 一种数据处理方法、装置、设备及可读存储介质 | |
CN110007853A (zh) | 一种Nandflash命令处理方法、装置、终端及存储介质 | |
CN104424124A (zh) | 内存装置、电子设备和用于控制内存装置的方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
EXSB | Decision made by sipo to initiate substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |