顺序流缓存与检测的方法、装置、存储介质及终端设备与流程

文档序号:14724238发布日期:2018-06-19 03:37阅读:172来源:国知局

本发明涉及计算机技术领域,尤其涉及一种顺序流缓存与检测的方法、装置、存储介质及终端设备。



背景技术:

在存储系统中,IO(Input/Output,输入/输出)调度模块需要对当前IO进行预读,并针对性的进行处理和优化,以期尽量的利用磁盘性能,让IO性能达到最优。这其中对顺序IO的优化非常重要,特别是以下几种场景:

(1)对大量的小顺序写入IO的优化;

(2)对大量的小顺序读入IO的优化;

(3)对非地址对齐的顺序写入IO的优化。

其中,以场景1为例,对于一个数据量较大的写IO,可能会因为业务逻辑、操作系统或者文件系统上的处理等各种原因被拆分为多个数据量软小写IO,但是如果磁盘直接逐个处理写入请求的话,会造成写IO的放大,而降低磁盘性能。以场景2举例,对于一个数据量较大大的读IO,可能会因为业务逻辑、操作系统或者文件系统上的处理等各种原因被拆分为多个数据量较小IO,如果磁盘对每一个数据量较小IO都直接处理读入请求,会造成读IO放大,而降低磁盘性能。以场景3举例,对于连续写IO,能会因为业务逻辑、操作系统或者文件系统上的处理等各种原因被重新切分,如果切分后写IO与磁盘块地址不对齐,那么实际写IO时,磁盘首先会读取首尾块的数据,并在内存中与写入的数据合并后,再写入到磁盘,这样会导致额外的读IO,并造成了写IO放大,而降低磁盘性能。这几种场景都需要调度模块能在各种复杂的场景下,特别是在多用户并发访问和大量顺序和随机IO混杂的情况下,识别出多路并发的IO顺序流。因此,提供一种通用的对多路并发顺序IO进行检测和调度的方法是非常必要的。而现有技术提供的检测IO顺序流的方案存在以下缺陷:

1、现有技术的顺序流IO的识别的用途主要是IO预读,并没有优化写入IO的写入过程;

2、不支持IO队列深度探测,原因主要是现有的技术方案的用途是预读,但对于写IO,如果IO深度为1的话(IO是顺序发起而非并行),实际上是不能进行缓存的,否则会造成IO阻塞;

3、无法检测顺序流IO什么时候结束,对读IO而言是会导致无效预读,对写IO而言是导致尾部IO阻塞或产生较大的延迟;

4、顺序流IO识别方法大多数都基于固定长度的分块(主要是为了按地址Hash查找),那么这类型方法对地址空间重叠、地址非严格单调连续(如连续IO序列多数IO地址单调递增的情况下少量IO地址反序)、地址不完全连续(如部分IO中间出现间隔)等情况的写入处理存在缺陷。



技术实现要素:

本发明实施例提供一种语音查询的方法、装置、存储介质及终端设备,以解决或缓解现有技术中的以上技术问题。

第一方面,本发明实施例提供了一种顺序流检测与缓存的方法,包括:

接收IO数据的访问请求,并记录所述IO数据的地址信息于地址跳表中;

根据所述地址跳表和所述IO数据,更新记录所述IO数据所属顺序流的属性信息于定长数组;其中,所述属性信息包括当前接收到的所述顺序流的IO数据的IO数量;

判断所述IO数量是否满足预设数量阈值或所述预设数量阈值的整数倍;以及

若是,根据所述地址跳表和所述顺序流记录在所述定长数组中的属性信息,对当前接收到的所述顺序流的IO数据以IO队列深度为基准分块进行缓存。

进一步地,所述地址信息包括所述IO数据的偏移地址,所述属性信息还包括所述顺序流的属性信息在所述定长数组中的更新时间和所述顺序流的偏移地址;以及

所述根据所述地址跳表和所述IO数据,更新记录所述IO数据所属顺序流的属性信息于定长数组,包括:

判断所述IO数据与所述地址跳表记载的历史IO数据是否相关;

若是,从所述定长数组中提取与所述IO数据相关的历史IO数据具有相同的偏移地址且更新时间最近的顺序流的属性信息,并根据提取的属性信息和所述IO数据,更新记录所述IO数据所属顺序流的属性信息于定长数组;以及

若否,根据所述IO数据的地址信息,新建所述IO数据所属的顺序流的属性信息于所述定长数组。

进一步地,所述地址信息包括所述IO数据的数据长度;以及,所述判断所述IO数据与所述地址跳表记载的历史IO数据是否相关,包括:

根据所述IO数据的存储地址区间,判断与所述地址跳表记载的历史IO数据的存储地址区间是否存在重叠或连续的关系;其中,所述存储地址区间由所述IO数据的偏移地址和数据长度计算而获得的区间;

若是,判定所述IO数据与所述地址跳表记载的历史IO数据相关;以及

若否,判定所述IO数据与所述地址跳表记载的历史IO数据均不相关。

进一步地,所述属性信息还包括数据长度;以及

所述根据提取的属性信息和所述IO数据,更新记录所述IO数据所属顺序流的属性信息于定长数组,包括:

对提取的属性信息中的IO数量加一,并以加一后的数值更新所述IO数据所属顺序流的IO数量;

以所述IO数据的数据长度与提取的属性信息中的数据长度之和更新所述IO数据所属顺序流的数据长度;

以当前时间更新所述IO数据所属顺序流的更新时间;以及

记录更新后的所述IO数据所属顺序流的属性信息于所述定长数组中。

进一步地,所述根据所述IO数据的地址信息,新建所述IO数据所属的顺序流的属性信息于所述定长数组,包括:

以数值一作为所述IO数据所属顺序流的IO数量;

以所述IO数据的数据长度作为所述IO数据所属顺序流的数据长度;

以当前时间作为所述IO数据所属顺序流的更新时间;

以所述IO数据的偏移地址作为所述IO数据所属顺序流的偏移地址;以及

记录生成的所述IO数据所属顺序流的属性信息于所述定长数组中。

进一步地,所述定长数组包括头标识;以及记录所述IO数据所属顺序流的属性信息于所述定长数组中,包括:

记录所述IO数据所属顺序流的属性信息于所述头标识的地址指向在所述定长数组中的位置;以及

对所述头标识的地址加一。

进一步地,所述方法还包括:

当所述IO数据与所述地址跳表记载的历史IO数据均不相关时,监测所述IO数据是否被缓存在设备缓存中以及在所述设备缓存中开始被执行刷新操作;所述刷新操作包括在所述设备缓存中清除所述IO数据以及将所述IO数据写入磁盘的操作;

若是,记录所述IO数据所属的顺序流的执行状态为未完成,并记录所述顺序流的并发数量的初始值为一;以及

当所述IO数据已执行完成所述刷新操作时,记录所述顺序流的执行状态为完成,以及根据所述并发数量的数值更新所述IO队列深度。

进一步地,所述方法还包括:

当所述IO数据与所述地址跳表记载的历史IO数据相关时,判断所述IO数据所属的顺序流的执行状态是否为未完成;若是,对所述并发数量加一。

进一步地,所述根据所述并发数量的数值更新所述IO队列深度,包括:

判断所述并发数量的数值是否大于当前的IO队列深度的数值;以及

若是,以所述并发数量的数值作为更新后的所述IO队列深度的数值。

进一步地,所述方法还包括:

当所述顺序流的IO数据缓存于设备缓存中时,根据所述地址跳表查询所述设备缓存中是否存在与所述顺序流相关的IO数据;

若无,对所述顺序流开始计时;

当对所述顺序流缓存在所述设备缓存中的IO数据执行刷新操作时,对所述计时值清零;

判断所述顺序流对应的计时值是否达到计时阈值;以及

当所述计时值达到所述计时阈值时,对所述顺序流缓存在所述设备缓存中的所有IO数据执行刷新操作,以及将所述顺序流记录在所述地址跳表和所述定长数组中的所有信息清除。

进一步地,所述最大缓存长度为IO数据的平均数据长度与所述IO队列深度的乘积,所述设备缓存的最大缓存数量不大于所述IO队列深度;以及所述方法还包括:

判断所述顺序流缓存在所述设备缓存中的IO数据的数量是否达到所述最大缓存数量,以及判断所述顺序流缓存在所述设备缓存中的IO数据的总数据长度是否达到所述最大缓存长度;以及

当所述数量达到所述最大缓存数量或所述总数据长度达到所述最大缓存长度时,对所述顺序流缓存在所述设备缓存中的所有IO数据执行刷新操作。

进一步地,所述方法还包括:

根据所述地址跳表和所述定长数组,判断所述顺序流缓存在所述设备缓存中的IO数据的存储地址是否跨越存储设备的存储块;以及

若是,对所述顺序流缓存在所述设备缓存中的且存储地址为跨越存储块的边界地址之前的所有IO数据执行刷新操作。

更进一步地,所述方法还包括:

当对所述顺序流缓存在所述设备缓存中的IO数据开始执行刷新操作时,根据所述顺序流记录在所述定长数组的更新时间,记录所述顺序流的刷新时间;以及根据所述定长数组,判断执行所述刷新操作的第一个IO数据的偏移地址是否与所述顺序流记录在所述定长数组中的偏移地址是否一致;

若是,设置所述顺序流的刷新数量的初始值为一;

若否,对所述顺序流的刷新数量加一;

当所述刷新操作结束时,对所述顺序流的刷新数量减一;

判断所述刷新数量的数值是否为零,以及判断所述刷新时间在时间段阈值内是否有更新;

若均否,对所述顺序流缓存在所述设备缓存中的所有IO数据执行刷新操作。

第二方面,本发明实施例提供一种顺序流检测与缓存的装置,包括:

访问请求接收模块,用于接收IO数据的访问请求,并记录所述IO数据的地址信息于地址跳表中;

定长数组更新模块,用于根据所述地址跳表和所述IO数据,更新记录所述IO数据所属顺序流的属性信息于定长数组;其中,所述属性信息包括当前接收到的所述顺序流的IO数据的IO数量;

队列深度判断模块,用于判断所述IO数量是否满足IO队列深度;以及

顺序流缓存模块,用于若是,根据所述地址跳表和所述顺序流记录在所述定长数组中的属性信息,对当前接收到的所述顺序流的IO数据进行缓存。

进一步地,所述地址信息包括所述IO数据的偏移地址,所述属性信息还包括所述顺序流的属性信息在所述定长数组中的更新时间和所述顺序流的偏移地址;以及

所述定长数组更新模块包括:

数据相关判断单元,用于判断所述IO数据与所述地址跳表记载的历史IO数据是否相关;

第一属性更新单元,用于若是,从所述定长数组中提取与所述IO数据相关的历史IO数据具有相同的偏移地址且更新时间最近的顺序流的属性信息,并根据提取的属性信息和所述IO数据的属性信息,更新记录所述IO数据所属顺序流的属性信息于定长数组;以及

第二属性更新单元,用于若否,根据所述IO数据的地址信息,新建所述IO数据所属的顺序流的属性信息于所述定长数组。

所述装置的功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。

在一个可能的设计中,顺序流检测与缓存的结构中包括处理器和存储器,所述存储器用于存储支持顺序流检测与缓存的装置执行上述第一方面中顺序流检测与缓存的方法的程序,所述处理器被配置为用于执行所述存储器中存储的程序。所述顺序流检测与缓存的装置还可以包括通信接口,用于顺序流检测与缓存的装置与其他设备或通信网络通信。

第三方面,本发明实施例提供了一种计算机可读存储介质,用于顺序流检测与缓存的装置所用的计算机软件指令,其包括用于执行上述第一方面中顺序流检测与缓存的方法为顺序流检测与缓存的装置所涉及的程序。

上述技术方案中的任一个技术方案具有如下优点或有益效果:

本发明实施例在接收IO数据的访问请求的同时即记录所述IO数据的地址信息于地址跳表中;然后根据地址跳表和接收到的IO数据的自身属性信息来更新记录所述IO数据所属顺序流的属性信息于定长数组,使得属于同一个顺序流的IO数据之间的连续关系通过地址跳表和定长数组连接起来,以及由于定长数据更新接收到的顺序流的数量,使得只有接收到满足一定IO数量的顺序流可以一次性分块进行缓存,其分块基于IO队列缓存深度。另外,上述跳表和定长数组可以识别出顺序流方便后续缓存以及进行相应的刷新入磁盘的操作。

上述概述仅仅是为了说明书的目的,并不意图以任何方式进行限制。除上述描述的示意性的方面、实施方式和特征之外,通过参考附图和以下的详细描述,本发明进一步的方面、实施方式和特征将会是容易明白的。

附图说明

在附图中,除非另外规定,否则贯穿多个附图相同的附图标记表示相同或相似的部件或元素。这些附图不一定是按照比例绘制的。应该理解,这些附图仅描绘了根据本发明公开的一些实施方式,而不应将其视为是对本发明范围的限制。

图1是本发明提供的顺序流检测与缓存的方法的一个实施例的流程示意图;

图2是本发明提供的顺序流检测与缓存的方法中定长数组的属性信息更新的一个实施例的流程示意图;

图3是本发明提供的跳表与定长数组的索引关系的一个实施例的示意图;

图4是本发明提供的IO队列深度更新的方法的一个实施例的流程示意图;

图5是本发明提供的IO队列深度更新的方法的另一个实施例的示意图;

图6是本发明提供的顺序流检测与缓存的方法的刷新缓存的第一个实施方式的流程示意图;

图7是本发明提供的顺序流检测与缓存的方法的刷新缓存的第二个实施方式的流程示意图;

图8是本发明提供的顺序流检测与缓存的方法的刷新缓存的第三个实施方式的流程示意图;

图9是本发明提供的顺序流检测与缓存的方法的刷新缓存的第四个实施方式的流程示意图;

图10是本发明提供的顺序流检测与缓存的装置的一个实施例的结构示意图;

图11是本发明提供的终端设备的一个实施例的结构示意图。

具体实施方式

在下文中,仅简单地描述了某些示例性实施例。正如本领域技术人员可认识到的那样,在不脱离本发明的精神或范围的情况下,可通过各种不同方式修改所描述的实施例。因此,附图和描述被认为本质上是示例性的而非限制性的。

本发明旨在提出一种顺序流检测与缓存的机制,通过跳表记录接收到的每一个IO数据的地址信息,以及设置一个定长数组,数组中的每一个元素代表一个顺序流的属性信息,然后每接收一个IO数据,根据地址跳表查询该IO数据与历史接收到的IO数据是否相关,进而确定其所属的顺序流,更新定长数组中记录的该顺序流的属性信息,即后续缓存或写入或读出顺序流时即可通过跳表和定长数组识别出顺序流并相应的操作。本发明实施例可以广泛应用于IO系统,包括但不限于本地文件系统、网络文件系统、磁盘驱动等模块可以有效减少写入写出的IO次数,优化IO形态,提高IO的性能,也可以于闪存(包括但不限于SSD)时,可以有效减少写放大次数,提高闪存的使用寿命,以及在用于文件系统时,可以有效减少磁盘碎片的数量。以下将分实施例描述本发明的技术方案:

实施例一

请参阅图1,本发明实施例提供了一种顺序流检测与缓存的方法,由磁盘调度模块来执行,包括步骤S110至步骤S140,具体如下:

S110,接收IO数据的访问请求,并记录IO数据的地址信息于地址跳表中。

为了实现IO数据的记录和缓存,本发明使用了定长数组存储历史IO数据的信息,实际上是顺序流的属性信息,以及使用地址跳表作为索引记录IO数据编移地址offset的排序信息,地址跳表以IO数据的偏移地址offset为key进行排序,同一连续关系的IO数据的地址信息排列在前一IO数据的地址信息之后,具体如图3所示。

S120,根据地址跳表和IO数据,更新记录当前IO数据所属顺序流的属性信息于定长数组;其中,所述属性信息包括当前接收到的所述顺序流的IO数据的IO数量。

其中,定长数组的每个元素为一个顺序流的属性信息的记录(例如顺序流1为ctx_1),该属性信息包括该属性信息在所述定长数组中的更新的时间(up_time)、当前接收到的该顺序流的IO数据的IO数量(seq_num)、当前接收到的该顺序流的IO数据的数据长度(seq_len)等信息。

那么,对于步骤S120的一个具体示例,如图2所示,可以如下:

S121,判断当前接收到的IO数据与所述地址跳表记载的历史IO数据是否相关。

由于地址跳表记录有每一个IO数据的偏移地址offset和数据长度len,那么据此可以得到每一个IO数据的地址区间(offset_begin,offset_end),offset_begin为该IO数据的偏移地址offset,offset_end为该IO数据的偏移地址offset加上数据长度len后的地址。进而,在判断当前接收到的IO数据与历史IO数据是否相关,即可查找相关联的顺序流,具体地:

根据当前IO数据的存储地址区间,判断与地址跳表记载的历史IO数据的存储地址区间是否存在重叠或连续的关系;若是,判定当前IO数据与地址跳表记载的历史IO数据相关;若否,判定当前IO数据与地址跳表记载的历史IO数据均不相关。那么对于地址空间重叠、地址非严格单调连续、地址不完全连续等情况也可以识别出来,进行相应地记录。那么,对于后续更新定长数组的操作如下:

S122,若是判定相关,从所述定长数组中提取与所述IO数据相关的历史IO数据具有相同的偏移地址且更新时间最近的顺序流的属性信息,并根据提取的属性信息和所述IO数据,更新记录所述IO数据所属顺序流的属性信息于定长数组。

S123,若判定相关,根据所述IO数据的地址信息,新建所述IO数据所属的顺序流的属性信息于所述定长数组。

实际上,如图3所示,上半部为跳表,下半部为定长数组,定长数组还会记录顺序流的偏移地址,该地址与顺序流的第一个IO数据的偏移地址相同,而地址跳表也记录有每一个IO数据的偏移地址,那么通过偏移地址可以将地址跳表中记录的IO数据的地址信息索引到顺序流的属性信息。由于前述假设当前IO数据与历史的IO数据相关了,那么根据地址跳表可以提取所有相关的IO数据的地址信息,而另一方面定长数组记录的顺序流的地址一直是第一个IO数据的偏移地址,提取与提取的地址信息具有相同偏移地址的属性信息,其为当前IO数据所属顺序流的属性信息,那么根据提取的且最近更新的属性信息和当前IO数据,即可以进行更新顺序流的属性信息了。假设当前IO数据与历史的IO数据是相关的前提下,对于这个更新过程,具体可以如下:

对提取的属性信息中的IO数量加一,并以加一后的数值更新当前IO数据所属顺序流的IO数量;

以当前IO数据的数据长度与提取的属性信息中的数据长度之和更新当前IO数据所属顺序流的数据长度;

以当前时间更新当前IO数据所属顺序流的更新时间;

以提取的属性信息中的偏移地址作为当前IO数据所属顺序流的偏移地址;以用

记录更新后的当前IO数据所属顺序流的属性信息于所述定长数组中。

其中,定长数组有一个头标识(head_index),用于记录时间最近的IO序号,这个时间可以是绝对时间,也可以是一个相对时间,通过这个头标识,等效将定长数据转变为一个先进先出(FIFO)的队列。所以,上述记录于定长数组可以为:记录当前IO数据所属顺序流的属性信息于所述头标识的地址指向在所述定长数组中的位置;并对所述头标识的地址加一。

另一方面,假设当前IO数据与历史的IO数据不相关,那么其实际上可认为是一个新的顺序流的第一个IO数据的,那么步骤S23的具体实施过程可以如下:

以数值一作为所述IO数据所属顺序流的IO数量;

以所述IO数据的数据长度作为所述IO数据所属顺序流的数据长度;

以当前时间作为所述IO数据所属顺序流的更新时间;

以所述IO数据的偏移地址作为所述IO数据所属顺序流的偏移地址;以及

记录生成的所述IO数据所属顺序流的属性信息于所述定长数组中。可选地,记录当前IO数据所属顺序流的属性信息于所述头标识的地址指向在所述定长数组中的位置;并对所述头标识的地址加一。

S130,判断所述IO数量是否满足预设数量阈值或所述预设数量阈值的整数倍。

在本实施例中,当前的顺序流的IO数据请求数量满足预设数量阈值或所述预设数量阈值的整数倍时,即可以将当前接收到的所述顺序流的IO数据进行缓存。该预设数量阈值或所述预设数量阈值的整数倍根据不同的磁盘或接口的性能而设备。在缓存的过程中可以通过前述的地址跳表和定长数据对要缓存的顺序流进行识别要缓存的顺序流的数据,即步骤S140。另一方面,由于定长数组还会记录当前接收到的顺序流的数据长度,因而也可通过判断记录的数据长度是否满足预设数据长度阈值或所述预设数据长度阈值的整数倍,若是满足,也可执行步骤S140。

S140,根据所述地址跳表和所述顺序流记录在所述定长数组中的属性信息,对当前接收到的所述顺序流的IO数据以IO队列深度为基准分块进行缓存。

在一个具体示例中,对于同一个顺序流来说,假设预设数量阈值为10,当前接收到的该顺序流的连续IO数量为10个,那么当前记录的IO数量为10个或10个的整数倍,以及假设探测到的IO队列深度为5,那么对于接收到的10个同一顺序流的IO数据,以每块或每组不大于5个IO数据为基准对每一块或每一组IO数据进行缓存。

实施例二

请参阅图4,前述实施例涉及到的缓存顺序流的过程中依赖于IO队列深度,即IO队列深度的探测过程对于写IO的缓存也是相当重要,本实施例将详细描述IO队列深度的探测过程:

首先,对每一个顺序流的第一个IO数据,均会执行以下的监控过程:

S210,若当前IO数据与所述地址跳表记载的历史IO数据均不相关,即该当前数据为一个新的顺序流的第一个IO数据,监测第一个IO数据IO数据是否被缓存在设备缓存中以及在所述设备缓存中开始被执行刷新操作;所述刷新操作包括在所述设备缓存中清除IO数据以及将IO数据写入磁盘的操作;

S220,若第一个IO数据IO数据被缓存在设备缓存中以及在所述设备缓存中开始被执行刷新操作,若是,则记录第一个IO数据IO数据所属的顺序流的执行状态为未完成,并记录所述顺序流的并发数量的初始值为一;以及

S230,若第一IO数据已执行完成所述刷新操作,记录该顺序流的执行状态为完成,以及根据所述并发数量的数值更新所述IO队列深度。

S240,若当前IO数据与地址跳表记载的历史IO数据相关时,即,该当前数据为与第一IO数据所属顺序流相连的IO数据,判断所述IO数据所属的顺序流的执行状态是否为未完成;若是,对所述并发数量加一。

可选择地,所述根据所述并发数量的数值更新所述IO队列深度,包括:

判断所述并发数量的数值是否大于当前的IO队列深度的数值;以及

若是,以所述并发数量的数值作为更新后的所述IO队列深度的数值。

以下将结合图5对本实施例进行举例描述:

首先,最初一个新的顺序流的第一IO数据IO_1的属性信息被标识为(IO-ctx_1),状态为未完成(done=false),并发数量为1(co_num=1),然后向存储服务(包括但不限于磁盘、iSCSI接口等)发起IO_1的请求;

然后,当与第一IO数据IO_1连续的IO_2到达时,将会更新记录(IO-ctx_1)的信息,如果状态仍为未完成(done=false),那么并发数量加1(co_num+1),假设续连续第n个IO达到时ctx_1都为未完成状态,那么并发数量为n;

以及,当IO_1请求完成时,将更新ctx_1的信息,将状态设置为完成(done=true),此时探测到的并发数量(co_num)即可认定为IO队列深度(io_depth);

另外,当新的顺序流到达时,如果发现状态为未完成(done=true),则会重新设置状态为未完成(done=false),并发数量为1(co_num=1),进行下一轮探测,如果下一轮探测的IO队列深度(io_depth)大于原有值,则会更新IO队列深度(io_depth)的值。

实施例三

请参见图6,本实施例将描述缓存到设备缓存中后将设备缓存中的IO数据刷新到具体磁盘或接口中的过程,对于写入或读出的IO数据,均可以在当前缓存的一个顺序流的数据达到时间阈值后,则会将当前的这一个顺序流的执行刷新操作,即清除其在设备缓存中的数据并存储在磁盘或接口的内存中,具体如下:

S310,当顺序流的IO数据缓存于设备缓存中时,根据所述地址跳表查询所述设备缓存中是否存在与该顺序流相关的IO数据;

S320,若无,对所述顺序流开始计时;

S330,当对该顺序流缓存在所述设备缓存中的IO数据执行刷新操作时,对所述计时值清零;

由于刷新过程是按数据块一块一块的刷新到磁盘中,则存在顺序流过长,分多次刷新操作刷新到磁盘中,那么即时未触发计时阈值而执行的刷新操作也应该对计时值进行清零。

S340,判断该顺序流对应的计时值是否达到计时阈值;以及

S350,当计时值达到计时阈值时,对该顺序流缓存在所述设备缓存中的所有IO数据执行刷新操作,以及将所述顺序流记录在所述地址跳表和所述定长数组中的所有信息清除。

实施例四

请参见图7,本实施例可以在前述实施例的基础上,提供第二种刷新缓存的策略:

首先,设置最大缓存长度为IO数据的平均数据长度与所述IO队列深度的乘积,所述缓存的最大缓存数量不大于所述IO队列深度。

在本实施例中中,对于设备缓存中的缓存空间可以:设定IO数据的平均数据长度(avg_len)乘以IO队列深度(io_depth)的值作为缓存值,例如,对于读IO,可以直接以缓存大小(cache_size)按地址对齐后作为读缓存值(rd_cache_size)进行刷新缓存的操作,也可以按写IO的方式,进行刷新缓存的操作。对于写IO,由于缓存写IO会导致IO延迟(latency)变长,进而导致IO吞吐率下降,因此需要IO设备的性能进行测试,以得到一个合适最大写缓存数量(wr_cache_num)和最大写缓存长度(wr_cache_size),但每个顺序流的最大写缓存数量(wr_cache_num)不得大于IO队列深度(io_depth)或每个顺序流的最大写缓存长度不得大于IO数据的平均数据长度与所述IO队列深度的乘积,由此推理IO队列深度为1的(io_depth=1)的IO流不应该被缓存。

则在本实施例中,刷新缓存的策略可以为:

S410,判断所述顺序流缓存在所述设备缓存中的IO数据的数量是否达到所述最大缓存数量,以及判断所述顺序流缓存在所述设备缓存中的IO数据的总数据长度是否达到所述最大缓存长度;以及

S420,当所述数量达到所述最大缓存数量或所述总数据长度达到所述最大缓存长度时,对所述顺序流缓存在所述设备缓存中的所有IO数据执行刷新操作。

实施例五

请参见图8,本实施例可以在前述实施例的基础上,提供第三种刷新缓存的策略:

S510,根据所述地址跳表和所述定长数组,判断所述顺序流缓存在所述设备缓存中的IO数据的存储地址是否跨越存储设备的存储块;以及

S520,若是,对所述顺序流缓存在所述设备缓存中的且存储地址为跨越存储块的边界地址之前的所有IO数据执行刷新操作。

在一个具体示例中,某一顺序流缓存在所述设备缓存中的IO数据的存储地址为:[4,90],由于写入的磁盘一般是按64来分块了,如果一个IO跨越了64或64的整数倍的存储边界地址则会被切分,那么对于存储地址为[4,90]的当前缓存的顺序流来说,该顺序流中存储地址[4,64]的IO数据会被执行刷新操作,从缓存中刷新到磁盘中。

实施例六

请参见图9,本实施例可以在前述实施例的基础上,提供第四种刷新缓存的策略:

S610,当对所述顺序流缓存在所述设备缓存中的IO数据开始执行刷新操作时,根据所述顺序流记录在所述定长数组的更新时间,记录所述顺序流的刷新时间;以及根据所述定长数组,判断执行所述刷新操作的第一个IO数据的偏移地址是否与所述顺序流记录在所述定长数组中的偏移地址是否一致;

S620,若是,设置所述顺序流的刷新数量的初始值为一;

S630,若否,对所述顺序流的刷新数量加一;

S640,当所述刷新操作结束时,对所述顺序流的刷新数量减一;

S650,判断所述刷新数量的数值是否为零,以及判断所述刷新时间在时间段阈值内是否有更新;

S660,若均否,对所述顺序流缓存在所述设备缓存中的所有IO数据执行刷新操作。

在本实施例中,对于某一个顺序流来说,其IO数据会陆续按块缓存在设备缓存中,以及在设备缓存中也是一块一块的数据块刷新到磁盘或接口中,因而对于同一个顺序流来说,其刷新数量的初始值为一,即若是开始执行该顺序流的一个刷新操作时,该刷新操作的第一个IO数据的偏移地址与所述顺序流记录在所述定长数组中的偏移地址一致,则说明该刷新操作是该顺序流的第一个刷新操作,设置该顺序流的刷新数量的初始值为一;如若不一致,则说明该刷新操作不是该顺序流的第一个刷新操作而是其他的刷新操作,那么此时对该顺序流的刷新数量的进行加一。以及每执行完前述顺序流的一个刷新操作,即对该顺序流的刷新数量减一,从而通过判断到该顺序流的刷新数量的数值为零时,以及每开始执行一个该顺序流的刷新操作所记录的更新时间也没有变化时,说明当前顺序流很有可能已经结束缓存了,或者设备缓存中的当前顺序流的IO数据的数量或数据长度没有满足执行刷新操作的条件,但也没有后续的IO数据缓存进来。此时执行刷新操作可以避免上一个顺序流与下一个顺序流的刷新操作之间产生一个较大的延迟,而该延迟的时间可由前述实施例的计时阈值决定。

通过上述实施例提供的刷新过程可以有效地实现实现IO顺序流的合并以及对齐磁盘存储块之间的分界地址进行写入。

实施例七

请参阅图10,本发明实施例提供一种顺序流检测与缓存的装置,包括:

访问请求接收模块10,用于接收IO数据的访问请求,并记录所述IO数据的地址信息于地址跳表中;

定长数组更新模块20,用于根据所述地址跳表和所述IO数据,更新记录所述IO数据所属顺序流的属性信息于定长数组;其中,所述属性信息包括当前接收到的所述顺序流的IO数据的IO数量;

队列深度判断模块30,用于判断所述IO数量是否满足预设数量阈值或所述预设数量阈值的整数倍;以及

顺序流缓存模块40,用于若是,根据所述地址跳表和所述顺序流记录在所述定长数组中的属性信息,对当前接收到的所述顺序流的IO数据以IO队列深度为基准分块进行缓存。

进一步地,所述地址信息包括所述IO数据的偏移地址,所述属性信息还包括所述顺序流的属性信息在所述定长数组中的更新时间和所述顺序流的偏移地址;以及

所述定长数组更新模块包括:

数据相关判断单元,用于判断所述IO数据与所述地址跳表记载的历史IO数据是否相关;

第一属性更新单元,用于若是,从所述定长数组中提取与所述IO数据相关的历史IO数据具有相同的偏移地址且更新时间最近的顺序流的属性信息,并根据提取的属性信息和所述IO数据的属性信息,更新记录所述IO数据所属顺序流的属性信息于定长数组;以及

第二属性更新单元,用于若否,根据所述IO数据的地址信息,新建所述IO数据所属的顺序流的属性信息于所述定长数组。

所述装置的功能可以通过硬件实现,也可以通过硬件执行相应的软件实现。所述硬件或软件包括一个或多个与上述功能相对应的模块。

在一个可能的设计中,顺序流检测与缓存的结构中包括处理器和存储器,所述存储器用于存储支持顺序流检测与缓存的装置执行上述第一方面中顺序流检测与缓存的方法的程序,所述处理器被配置为用于执行所述存储器中存储的程序。所述顺序流检测与缓存的装置还可以包括通信接口,用于顺序流检测与缓存的装置与其他设备或通信网络通信。

实施例八

本发明实施例还提供一种终端设备,如图11所示,该设备包括:存储器21和处理器22,存储器21内存储有可在处理器22上运行的计算机程序。处理器22执行所述计算机程序时实现上述实施例中的顺序流检测与缓存的方法。存储器21和处理器22的数量可以为一个或多个。

该设备还包括:

通信接口23,用于处理器22与外部设备之间的通信。

存储器21可能包含高速RAM存储器,也可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。

如果存储器21、处理器22和通信接口23独立实现,则存储器21、处理器22和通信接口23可以通过总线相互连接并完成相互间的通信。所述总线可以是工业标准体系结构(ISA,Industry Standard Architecture)总线、外部设备互连(PCI,Peripheral Component)总线或扩展工业标准体系结构(EISA,Extended Industry Standard Component)总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图11中仅用一条粗线表示,但并不表示仅有一根总线或一种类型的总线。

可选的,在具体实现上,如果存储器21、处理器22及通信接口23集成在一块芯片上,则存储器21、处理器22及通信接口23可以通过内部接口完成相互间的通信。

在本说明书的描述中,参考术语“一个实施例”、“一些实施例”、“示例”、“具体示例”、或“一些示例”等的描述意指结合该实施例或示例描述的具体特征、结构、材料或者特点包含于本发明的至少一个实施例或示例中。而且,描述的具体特征、结构、材料或者特点可以在任一个或多个实施例或示例中以合适的方式结合。此外,在不相互矛盾的情况下,本领域的技术人员可以将本说明书中描述的不同实施例或示例以及不同实施例或示例的特征进行结合和组合。

此外,术语“第一”、“第二”仅用于描述目的,而不能理解为指示或暗示相对重要性或者隐含指明所指示的技术特征的数量。由此,限定有“第一”、“第二”的特征可以明示或隐含地包括至少一个该特征。在本发明的描述中,“多个”的含义是两个或两个以上,除非另有明确具体的限定。

流程图中或在此以其他方式描述的任何过程或方法描述可以被理解为,表示包括一个或更多个用于实现特定逻辑功能或过程的步骤的可执行指令的代码的模块、片段或部分,并且本发明的优选实施方式的范围包括另外的实现,其中可以不按所示出或讨论的顺序,包括根据所涉及的功能按基本同时的方式或按相反的顺序,来执行功能,这应被本发明的实施例所属技术领域的技术人员所理解。

在流程图中表示或在此以其他方式描述的逻辑和/或步骤,例如,可以被认为是用于实现逻辑功能的可执行指令的定序列表,可以具体实现在任何计算机可读介质中,以供指令执行系统、装置或设备(如基于计算机的系统、包括处理器的系统或其他可以从指令执行系统、装置或设备取指令并执行指令的系统)使用,或结合这些指令执行系统、装置或设备而使用。就本说明书而言,“计算机可读介质”可以是任何可以包含、存储、通信、传播或传输程序以供指令执行系统、装置或设备或结合这些指令执行系统、装置或设备而使用的装置。

本发明实施例所述的计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质或者是上述两者的任意组合。计算机可读存储介质的更具体的示例至少(非穷尽性列表)包括以下:具有一个或多个布线的电连接部(电子装置),便携式计算机盘盒(磁装置),随机存取存储器(RAM),只读存储器(ROM),可擦除可编辑只读存储器(EPROM或闪速存储器),光纤装置,以及便携式只读存储器(CDROM)。另外,计算机可读存储介质甚至可以是可在其上打印所述程序的纸或其他合适的介质,因为可以例如通过对纸或其他介质进行光学扫描,接着进行编辑、解译或必要时以其他合适方式进行处理来以电子方式获得所述程序,然后将其存储在计算机存储器中。

在本发明实施例中,计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了计算机可读的程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。计算机可读的信号介质还可以是计算机可读存储介质以外的任何计算机可读介质,该计算机可读介质可以发送、传播或者传输用于指令执行系统、输入法或者器件使用或者与其结合使用的程序。计算机可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于:无线、电线、光缆、射频(Radio Frequency,RF)等等,或者上述的任意合适的组合。

应当理解,本发明的各部分可以用硬件、软件、固件或它们的组合来实现。在上述实施方式中,多个步骤或方法可以用存储在存储器中且由合适的指令执行系统执行的软件或固件来实现。例如,如果用硬件来实现,和在另一实施方式中一样,可用本领域公知的下列技术中的任一项或他们的组合来实现:具有用于对数据信号实现逻辑功能的逻辑门电路的离散逻辑电路,具有合适的组合逻辑门电路的专用集成电路,可编程门阵列(PGA),现场可编程门阵列(FPGA)等。

本技术领域的普通技术人员可以理解实现上述实施例方法携带的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,该程序在执行时,包括方法实施例的步骤之一或其组合。

此外,在本发明各个实施例中的各功能单元可以集成在一个处理模块中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个模块中。上述集成的模块既可以采用硬件的形式实现,也可以采用软件功能模块的形式实现。所述集成的模块如果以软件功能模块的形式实现并作为独立的产品销售或使用时,也可以存储在一个计算机可读存储介质中。所述存储介质可以是只读存储器,磁盘或光盘等。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到其各种变化或替换,这些都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1