CN103902260B - 一种对象文件系统的预取方法 - Google Patents
一种对象文件系统的预取方法 Download PDFInfo
- Publication number
- CN103902260B CN103902260B CN201210570438.4A CN201210570438A CN103902260B CN 103902260 B CN103902260 B CN 103902260B CN 201210570438 A CN201210570438 A CN 201210570438A CN 103902260 B CN103902260 B CN 103902260B
- Authority
- CN
- China
- Prior art keywords
- prefetch
- prefetches
- access
- attribute
- oid
- 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.)
- Active
Links
Landscapes
- Memory System Of A Hierarchy Structure (AREA)
- Information Retrieval, Db Structures And Fs Structures Therefor (AREA)
- Information Transfer Between Computers (AREA)
Abstract
本发明公开了一种对象文件系统的预取方法,包括:对对象文件系统的数据结构和变量进行初始化,判断服务器是否接收来自客户端的读对象请求,如果是则解析读对象请求,并根据读对象请求确定当前对象及其Oid,判断读对象请求是否命中缓存,如果没有则判断是否存在计时值大于或等于时间阈值T_MAX,如果不存在,则根据当前对象的Oid查询预取属性表,以获取当前对象的预取属性,并根据预取属性执行读磁盘和预取操作,根据全局访问顺序数组对预取属性表的单步预取信息进行修改,根据全局访问顺序数组对预取属性表的多步预取信息进行修改。本发明实现了预取范围自适应调节、预取准确率维持在设定阈值附近、单步预取和多步预取兼顾、以及资源占用可控。
Description
技术领域
本发明属于预取技术领域,更具体地,涉及一种对象文件系统的预取方法。
背景技术
信息技术的发展带来了日益增长的海量数据,存储需求增加迅速、存储应用日益复杂。传统的基于块接口的存储系统难以满足安全性、跨平台数据共享、高性能及可扩展性等要求,因此出现了一种基于对象的接口,基于对象的存储提供了具有高性能、高可靠性、跨平台以及安全的数据共享的存储体系结构,在海量数据的应用场景下性能表现优秀。
但是存储设备的性能提升速度远远落后于存储密度的提高速度,因此对象文件系统也不可避免的遇到了I/O瓶颈的问题。在存储设备I/O性能提升有限的情况下,采用小容量高速存储介质来提高系统性能已经成为普遍做法。而利用预取技术能实现处理器请求数据之前从系统存储器请求该数据,实现处理器不间断的连续处理多个数据,利用数据访问的空间局部性,对将来可能发生的数据请求进行预测,在访问之前取出并缓存,以备用户访问,从而减少访问延迟,加快了读取速度,提升了系统的读性能。
几种常见的预取算法包括:
LS(Last Successor):以最近的访问后继作为下次访问的预测,简洁实用,对访问模式的反映快,但易受偶然因素、访问顺序的影响。
PNLS(Program-based Last N Successors):以程序信息提高预测精度,适用于程序驱动的数据访问模式。
SLS(Stable Last Successor):对LS模型的重新定义,设置频次阈值,去除噪音,降低偶然因素对模型性能的影响。
FSS(First Stable Successor):以首个出现N次的后继永久作为预测结果,适用于稳定的模式。
Recent Popularity(k out of n):维护N个最近后继,至少发生了K次的作为预测结果,当存在多个侯选时,以最近度作为选择依据。
上述预取方法基本都是通过简单固定的预取策略来满足特定访问模式的需求,且预测的都是下一步的可能访问。显然,如果能够预测到后续多步的访问顺序能够更好地提升系统性能,但是这需要更大规模量的数据记录及其内在关联的分析。
在复杂多变的应用场景下,单一固定的预取方法反而可能造成性能的急剧下降,一个高效的预取方法应当能适应复杂应用场景,在多种场景下动态的调整预取策略,并且在一定规模数据采集量下达到性能的最优化。
发明内容
针对现有技术的缺陷,本发明的目的在于提供一种对象文件系统的预取方法,其基于单步访问顺序的数据统计,同步支持单步和多步预取,并根据后续实际访问结果实时修正预取策略,从而实现了预取范围自适应调节、预取准确率维持在设定阈值附近、单步预取和多步预取兼顾、以及资源占用可控。
为实现上述目的,本发明提供了一种对象文件系统的预取方法,包括以下步骤:
(1)对对象文件系统的数据结构和变量进行初始化;具体而言,初始化内存池且将表示内存池使用率的全局变量Urate置0,创建并初始化一个具有Bucket_Num个哈希桶的哈希表,申请并初始化一个全局访问顺序数组Access_Order[M+1],其中M表示多步预测的最大步长,数组中的每个元素用于存放对象的Oid,Access_Order[M]为当前访问对象的Oid,将计时值T_Clock设置为0,且系统每隔一秒T_Clock值加1;
(2)判断服务器是否接收来自客户端的读对象请求,如果是则进入步骤(3),否则过程结束;
(3)解析读对象请求,并根据读对象请求确定当前对象及其Oid;
(4)判断读对象请求是否命中缓存,如果是进入步骤(5),否则进入步骤(6);
(5)根据当前对象的Oid在内存池中查找对应的缓存空间,并从缓存空间中直接读取当前对象,然后进入步骤(10);
(6)判断是否存在计时值T_Clock大于或等于时间阈值T_MAX,如果存在,则表示时间窗口已到,并进入步骤(7),否则进入步骤(9);
(7)初始化预取属性表,并将计时值T_Clock置0;
(8)从磁盘中读取读对象请求的对象,然后进入步骤(10)。
(9)根据当前对象的Oid查询预取属性表,以获取当前对象的预取属性,并根据预取属性执行读磁盘和预取操作;
(10)根据全局访问顺序数组Access_Order[M+1]对预取属性表的单步预取信息进行修改;
(11)根据全局访问顺序数组Access_Order[M+1]对预取属性表的多步预取信息进行修改。
步骤(7)具体为,将预取属性表中的所有节点初始化,清空时间阈值T_MAX前一段时间内的统计数据,包括将预取属性节点中的访问计数值Visit_Num置0、预取成功次数数组Prefetch_Vnum[M]、预取准确率数组Prefetch_Crate[M]、预取大小数组Prefetch_Size[2]、多步预取序列数组Multi_Step[M]设置为零,释放预取属性节点中单步预取对列所占用的内存空间并置指针Psingle为空,并初始化全局访问顺序数组Access_Order[M+1]为零。
步骤(9)包括以下子步骤:
(9-1)记录与对象访问顺序有关的信息,并将当前对象Oid写入全局访问顺序数组Access_Order[M+1];
(9-2)判断预取属性表中是否存在当前对象对应的预取属性节点,如不存在则进入步骤(9-3),否则进入步骤(9-4)。
(9-3)为当前对象建立对应的预取属性节点;
(9-4)更新当前对象的预取属性信息,包括访问计数值Visit__Num和多步预取序列数组Multi_Step[M];
(9-5)从当前对象对应的预取属性节点中提取对象预取属性,包括预取大小数组Prefetch_Size[2]、多步预测序列数组Multi_Step[M]、指向单步预取队列的指针Psingle;
(9-6)判断内存池使用率Urate是否大于一个阈值Umax,大于则进入步骤(9-7),否则进入(9-8);
(9-7)关闭多步预取,仅执行单步预取;
(9-8)从磁盘中读取当前对象,根据当前对象的预取属性进行预取操作,并更新内存池使用率Urate。
步骤(9-3)具体为,申请一个预取属性节点,将当前对象Oid写入节点记录的Oid,将访问计数值Visit_Num置0,将预取成功次数数组Prefetch_Vnum[M]、预取准确率数组Prefetch_Crate[M]、多步预取序列数组Multi_Step[M]、预取大小数组Prefetch_Size[2]初始化置0,并将单步预取队列指针Psingle和下一预取属性节点指针Pnext置为空,根据对象Oid进行哈希计算,并根据哈希计算的结果将预取属性节点加入到预取属性表中对应的冲突链上,步骤(9-4)具体为,访问了当前对象一次,则将当前对象对应预取属性节点中的访问计数值Vi sit_Num加1,取出当前对象单步预取队列的头节点,将头节点中记录的Oid写入Multi_Step[0],再将写入Multi_Step[0]的Oid对应的对象视为当前对象,将其单步预取队列的头节点记录的Oid写入Multi_Step[1],重复上述过程M次,以找到M个对象,并将其依次写入数组Multi_Step[M]中,由此组成了当前可以预测到的最有可能的后续访问顺序。
步骤(9-7)具体为,将预取属性节点中多步预取的预取步长置为0,即设置Prefetch_Size[1]=0,步骤(9-8)具体为,找到当前对象对应的预取属性节点,进而找到预取属性节点记录的单步预取队列前
Prefetch_Size[0]个节点,对这些节点中记录的Oid所对应的对象进行预取,实现单步预取;同时,对数组Multi_Step[M]中前Prefetch_Size[1]个元素记录的Oid所对应的对象进行预取,实现多步预取,预取过程需要向内存池申请缓存资源,申请完毕后内存池自动更新内存池使用率。
步骤(10)包括以下子步骤:
(10-1)在全局访问顺序数组中取前一访问对象的Oid,并根据Oid在预取属性表中查找到前一访问对象的预取属性节点;
(10-2)判断当前对象是否在前一访问对象对应的预取属性节点的单步预取范围内,在则表示前一访问对象的单步预取成功,并进入步骤(10-3),否则进入步骤(10-5);
(10-3)将前一访问对象对应的预取属性节点记录的预取成功次数Prefetch_Vnum[0]的值加1;
(10-4)修改当前对象在前一访问对象对应的预取属性节点单步预取队列中的预取权值Prefetch_Weight,并将单步预取队列按照修改后的预取权值大小重新从大到小排序,然后进入步骤(10-8);
(10-5)判断当前对象是否在前一访问对象对应的预取属性节点单步预取队列中,在则返回步骤(10-4),否则进入步骤(10-6);
(10-6)判断前一访问对象的访问计数值Visit_Num是否大于其单步预取对列尾节点的预取权值Prefetch_Weight,大于则进入步骤(10-7),否则进入步骤(10-8);
(10-7)在前一访问对象对应的单步预取对列中为当前对象创建节点,对该节点赋值,并根据预取权值Prefetch_Weight重新调整单步预取对列;
(10-8)根据预取成功次数Prefetch_Vnum[0]和访问计数值Visit_Num将前一访问对象对应的预取属性节点记录的单步预取准确率更新为Prefetch_Crate[0]=Prefetch_Vnum[0]/访问计数值Visit_Num;
(10-9)判断前一访问对象对应的预取属性节点记录的单步预取准确率Prefetch_Crate[0]是否大于阈值M1,大于则进入步骤(10-10),否则进入步骤(10-11);
(10-10)设置Prefetch_Size[0]=Prefetch_Size[0]-1,然后过程结束;
(10-11)判断前一访问对象的单步预取范围Prefetch_Size[0]大小是否大于等于上限Queue_Length,若是则进入步骤(10-12),否则进入步骤(10-13);
(10-12)将前一访问对象的单步预取范围大小Prefetch_Size[0]置0,清空其单步预取对列,并将单步预取对列的指针Psingle置空,然后过程结束;
(10-13)将前一访问对象的单步预取范围Prefetch_Size[0]设置为Prefetch_Size[0]=Prefetch_Size[0]+1;
步骤(10-7)具体为,将创建节点的Oid值置为当前对象的Oid,预取权值置为前一访问对象的Visit_Num,删除单步预取对列中尾节点并将创建的节点加入队列,仍保持单步预取对列中按照预取权值的大小排列。
步骤(11)包括以下子步骤:
(11-1)将临时变量i的值置为M;
(11-2)判断i是否大于1,若是则进入步骤(11-3),否则过程结束;
(11-3)将全局访问顺序数组Access_Order[M+1]中后i个Oid与该数组中第M-i个对象的多步预取序列数组Multi_Step[M]中前i个Oid进行比对,以判断比对的Oid序列是否相同,如果相同则进入步骤(11-4),否则进入步骤(11-5);
(11-4)将全局访问顺序数组中第M-i个对象对应的预取成功次数Prefetch_Vnum[M-i-1]加1;
(11-5)根据第M-i个对象的预取成功次数Prefetch_Vnum[M-i-1]和访问计数值Visit_Num将其对应的预取属性节点记录的多步预取准确率更新为Prefetch_Crate[M-i-1]=Prefetch_Vnum[M-i-1]/访问计数值Visit_Num;
(11-6)获取更新的预取准确率数组Prefetch_Crate[M]中大于等于阈值M2的个数,取该个数和Prefetch_Size[0]中的较小值作为新的多步预取的步长Prefetch_Size[1];
(11-7)设置i=i-1,并返回步骤(11-2)。
通过本发明所构思的以上技术方案,与现有技术相比,本发明具有以下的有益效果:
(1)能够自适应应用场景的变化:由于采用了步骤(10-4)、(10-7),对统计时间窗口内对象的访问计数,采用求和累加的方法兼顾访问计数值和访问时间两个因子,使访问计数值越多、访问时间越近的对象预取权值越大。因此,即使用户行为发生改变,预取方法也能在一定时间的访问后,相应改变预取权值的分布,向更适应于当前应用场景的方向变化。
(2)能够动态调整单步预取范围:采用预取单个对象的方法无法解决诸如ABACABAC的颠簸访问模式,由于采用了步骤(10-10)、(10-12)、(10-13),单步预取范围实现了动态变化,可以将权值较大的一个或多个对象预取到缓存,保证预取的准确率。允许预取范围动态变化更符合实际多变的应用场景。
(3)能够根据当前结果修正预取策略:预取权值的大小仅代表一种基于历史记录的预测,单纯设置预取权值的阈值,自适应的调整存在滞后性。由于采用了步骤(10)、(11),实现了对预取结果的监测,实时反馈修正预取策略,根据预取准确率的变化动态调节预取范围,保证预取准确率维持在较好的状态,实现对预取主要指标准确率的快速调节。
(4)能够兼顾单步预取和多步预取:多数预取方法更多考虑保证单步预取的性能,因为多步预取需要统计更多的访问顺序信息,处理流程更复杂。但单步预取已经记录了大量历史访问信息,可以尝试用于多步预取的分析。由于采用了步骤(11),本发明在优先保障单步预取性能的情况下,基于已有历史访问信息,预测一种最大概率的多步访问顺序,并在多步预取达到一定准确率的情况下才进行多步预取,根据后续访问记录实时调整多步预取策略,提高多步预取的准确率,并动态自适应调整单步预取范围和多步预取步长。
(5)预取资源占用可控:保证预取性能的同时,本发明针对缓存资源进行了有效控制,由于采用了步骤(1)、(9-7)、(9-8)、(10-12),通过对缓存资源的集中分配管理,限制了单步预取范围和多步预取步长的上限,在单步预取范围达到上限仍不能满足准确率要求时,不再继续扩大预取范围,清空占用的缓存资源;在缓存资源紧张时,优先关闭多步预取步长,保障单步预取的进行。
(6)能够适用于各种对象文件系统:由于采用了步骤(1)、(6)、(7),本发明在不改变对象属性的情况下建立哈希表记录对象访问顺序的有关信息,通过分析表内数据实现高效的预取,并根据实际访问情况修正哈希表内的记录;通过定时清理哈希表,清除上一时间段的记录,符合程序访问的局部性,控制了哈希表的规模。对于不同的对象文件系统,都能够通过本发明实现高效的预取。
附图说明
图1是本发明对象文件系统中预取属性表的示意图。
图2是本发明对象文件系统的预取方法的流程图。
图3是本发明步骤(9)的细化流程图。
图4是本发明步骤(10)的细化流程图。
图5是本发明步骤(11)的细化流程图。
具体实施方式
为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。
以下首先对本发明的技术术语进行解释和说明:
内存池:从内存申请固定大小的内存空间,以便统一管理和分配缓存资源。
哈希表:根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找速度。这个存放记录的数据结构叫做哈希表。
哈希桶:哈希表中存放记录的一个位置叫做哈希桶。
冲突链:不同的关键码值可能映射到表中的同一个位置,由此产生了冲突,而用于存放这些冲突信息的链表结构叫做冲突链。
紧邻访问:无间隔的后续访问叫做紧邻访问。
单步预取:预取一个对象的下一紧邻访问对象叫做单步预取。
多步预取:预取一个对象后续将要访问的多个对象叫做多步预取。
预取步长:预取一个对象后续将要访问的对象的个数叫做预取步长。
预取属性:包括对象后续可能访问的对象,预取区间大小等信息。
预取属性节点:存放对象预取属性的节点。
预取属性表:用哈希表来存放多个预取属性节点的数据结构。
下面结合附图来解释本发明的思路:
如图1所示,本发明主要通过分析预取属性表来预测对象的后续访问顺序。预取属性表主要由三部分构成,一个是由Bucket_Num个哈希桶组成的哈希表,在本实施方式中,Bucket_Num的取值为512k至1M;一个是冲突链中的预取属性节点,其记录有对象号(Object ID Number,简称Oid)、访问计数值Visit_Num、预取成功次数数组Prefetch_Vnum[M]、预取准确率数组Prefetch_Crate[M]、预取大小数组Prefetch_Size[2]、多步预取序列数组Multi_Step[M]、指向一个单步预取队列的指针Psingle和指向下一预取属性节点的指针Pnext,本实施方式中,M取值范围为2至6,即多步预取的最大预取步长为2至6;一个是单步预取队列,队列中每个节点记录有Oid和预取权值Prefetch_Weight,队列长度不超过Queue_Length,在本实施方式中,Queue_Length取值范围是2至6。
对象文件系统中,Oid唯一标识了一个对象。若读对象请求未命中缓存,则启动预取,即读缓存失效才启动预取。根据正在处理的当前对象Oid查询预取属性表,建立当前对象到预取属性节点的对应关系,可以获取当前对象的预取属性信息:
预取属性节点中记录的访问计数值Visit_Num对应一个时间段内系统访问当前对象的次数;指针Psingle指向当前对象对应预取属性节点的单步预取队列,队列中每个节点记录的Oid代表一个时间段内,当前对象紧邻访问过该Oid的对象,节点在队列中的位置按照预取权值
Prefetch_Weight值从大到小排序,Prefetch_Weight值最大的节点位于对列头;多步预取序列数组Multi_Step[M]中存放着当前对象后续多步预测访问的Oid,元素Multi_Step[na](0<=na<M)为预取步长等于na+1时预测的Oid,多步预取序列数组Multi_Step[M]中记录了当前对象最有可能的后续访问顺序,具体来说,取出当前对象对应单步预取队列的头节点,节点中记录的Oid写入Multi_Step[0],再将写入Multi_Step[0]的Oid对应的对象视为当前对象重复上述过程,将找到的Oid依次写入Multi_Step[1]、Multi_Step[2]到Multi_Step[M],因为单步预取队列中的首节点均为预取权值最大的节点,即最有可能的紧邻访问对象,所以访问当前对象时,最有可能的后续访问顺序就是Multi_Step[M]中元素组成的序列;预取大小数组Prefetch_Size[2]存放着单步预取范围大小和多步预取的预取步长,其中元素Prefetch_Size[0]对应单步预取范围中对象的个数,Prefetch_Size[1]对应多步预取的预取步长;预取成功次数数组Prefetch_Vnum[M]存放着一个时间段内当前对象后续预取成功的次数,元素Prefetch_Vnum[nb](0<=nb<M)代表预取步长为nb+1时,预取成功的次数,对于单步预取,预取成功指实际紧邻访问对象的oid在单步预取范围中,单步预取范围指当前对象对应预读属性节点的单步预取队列前Prefetch_Size[0]个节点记录的Oid的范围,单步预取成功Prefetch_Vnum[0]加1,对于预取步长为nc(1<nc<=M)的多步预测,通过当前对象找到对应的预取属性节点,若节点记录的数组Multi_Step[M]前nc个元素和多步预取顺序完全匹配,则认为多步预取成功,Prefetch_Vnum[nc-1]加1;预取准确率数组Prefetch_Crate[M]由访问计数值Visit_Num、预取成功次数数组Prefetch_Vnum[M]计算得出,元素Prefetch_Crate[nd](0<=nd<M)=Prefetch_Vnum[nd]/Visit_Num。
因此,首先访问一个对象即可获取相应的预取属性,预测后续访问的顺序:由预取大小数组中Prefetch_Size[0]控制单步预取范围中对象个数,决定了在当前对象的单步预取队列中最有可能紧邻访问的对象的个数,单步预取的范围即单步预取队列的前Prefetch_Size[0]个节点所对应的对象;由Prefetch_Size[1]控制的多步预取的步长,决定了按照最有可能的后续访问顺序进行预取的步长,先找到当前对象对应的单步预取队列头结点,即找到最有可能的紧邻访问对象,再同理找到该紧邻访问对象的最有可能的紧邻访问对象,以此直至找到M个对象组成了当前可以预测到的最有可能后续访问顺序;
然后,后续实际访问的顺序又可以对当前访问对象预测的信息进行修正。根据后续实际访问的顺序调整当前访问对象的预取成功次数数组Prefetch_Vnum[M]、预取准确率数组Prefetch_Crate[M];
进而根据准确率的变化更新单步预取范围的值Prefetch_Size[0]和多步预取步长的值Prefetch_Size[1],完成访问信息的反馈。具体来说,若单步预取准确率Prefetch_Crate[0]低于给定阈值M1,则逐步递增单步预取范围Prefetch_Size[0],否则逐步递减Prefetch_Size[0],Prefetch_Size[0]达到最大值M准确率仍低于M1则说明当前预取无法达到效果,故Prefetch_Size[0]置0;多步预取则统计预取准确率数组Prefetch_Crate[M]中大于等于阈值M2的个数,取该个数和Prefetch_Size[0]中的较小值作为多步预取的步长。本实施方式中,M1的取值范围为60%至80%,M2的取值范围为40%-70%;
最后,通过访问信息的反馈以及缓存资源使用情况的监测,动态自适应的调节后续访问单步预取的范围、多步预取的顺序及步长,达到预取性能的优化。实现先预取,后验证,再用验证结果修正预取参数,利于下次访问时达到更好的预取效果。
如图2所示,本发明对象文件系统的预取方法包括以下步骤:
(1)对对象文件系统的相关数据结构和变量进行初始化;具体而言,向内存申请固定大小的内存池作为全局缓存空间,初始化内存池且将表示内存池使用率的全局变量Urate置0,创建并初始化一个具有Bucket_Num个哈希桶的哈希表(在本实施方式中,Bucket_Num的取值为512k至1M),哈希桶的编号从0到Bucket_Num-1,申请并初始化一个全局访问顺序数组Access_Order[M+1](其中M表示多步预测的最大步长,其取值范围为2至6),数组中的每个元素用于存放对象的Oid,从Access_Order[0]到Access_Order[M]读出的Oid序列即为最近访问的对象Oid顺序,且Access_Order[M]为当前访问对象的Oid,将计时值T_Clock设置为0且系统每隔一秒T_Clock值加1;
(2)判断服务器是否接收来自客户端的读对象请求,如果是则进入步骤(3),否则过程结束;
(3)解析读对象请求,并根据读对象请求确定当前对象及其Oid;
(4)判断读对象请求是否命中缓存,如果是进入步骤(5),否则进入步骤(6);
(5)根据当前对象的Oid在内存池中查找对应的缓存空间,并从缓存空间中直接读取当前对象,然后进入步骤(10);
(6)判断是否存在计时值T_Clock大于或等于时间阈值T_MAX,如果存在,则表示时间窗口已到,并进入步骤(7),否则进入步骤(9),在本实施方式中,T_MAX的取值范围为60至600秒;
(7)初始化预取属性表,并将计时值T_Clock置0;具体而言,将预取属性表中的所有节点初始化,清空时间阈值T_MAX前一段时间内的统计数据,包括将预取属性节点中的访问计数值Visit_Num置0、预取成功次数数组Prefetch_Vnum[M]、预取准确率数组Prefetch_Crate[M]、预取大小数组Prefetch_Size[2]、多步预取序列数组Multi_Step[M]设置为零,释放预取属性节点中单步预取对列所占用的内存空间并置指针Psingle为空,并初始化全局访问顺序数组Access_Order[M+1]为零;
(8)从磁盘中读取读对象请求的对象,然后进入步骤(10)。
(9)根据当前对象的Oid查询预取属性表,以获取当前对象的预取属性,并根据预取属性执行读磁盘和预取操作;
如图3所示,本步骤包括以下子步骤:
(9-1)记录与对象访问顺序有关的信息,并将当前对象Oid写入全局访问顺序数组Access_Order[M+1];具体而言,删除最早的记录Access_Order[0],将全局访问顺序数组Access_Order[M+1]中的元素整体向前移动一位,并将当前对象Oid写入Access_Order[M];
(9-2)判断预取属性表中是否存在当前对象对应的预取属性节点,如不存在则进入步骤(9-3),否则进入步骤(9-4)。
(9-3)为当前对象建立对应的预取属性节点;具体而言,申请一个预取属性节点,将当前对象Oid写入节点记录的Oid,将访问计数值Visit-Num置0,将预取成功次数数组Prefetch_Vnum[M]、预取准确率数组Prefetch_Crate[M]、多步预取序列数组Multi_Step[M]、预取大小数组Prefetch_Size[2]初始化置0,并将单步预取队列指针Psingle和下一预取属性节点指针Pnext置为空,根据对象Oid进行哈希计算,并根据哈希计算的结果将预取属性节点加入到预取属性表中对应的冲突链上;
(9-4)更新当前对象的预取属性信息,包括访问计数值Visit_Num和多步预取序列数组Multi_Step[M];具体而言,访问了当前对象一次,则将当前对象对应预取属性节点中的访问计数值Vi sit_Num加1,取出当前对象单步预取队列的头节点,将头节点中记录的Oid写入Multi_Step[0],再将写入Multi_Step[0]的Oid对应的对象视为当前对象,将其单步预取队列的头节点记录的Oid写入Multi_Step[1],重复上述过程M次,以找到M个对象,并将其依次写入数组Multi_Step[M]中,由此组成了当前可以预测到的最有可能的后续访问顺序。
(9-5)从当前对象对应的预取属性节点中提取对象预取属性,包括预取大小数组Prefetch_Size[2]、多步预测序列数组Multi_Step[M]、指向单步预取队列的指针Psingle;
(9-6)判断内存池使用率Urate是否大于一个阈值Umax,大于则进入步骤(9-7),否则进入(9-8);在本实施方式中,Umax取值范围为70%至90%;
(9-7)关闭多步预取,仅执行单步预取;具体而言,将预取属性节点中多步预取的预取步长置为0,即设置Prefetch_Size[1]=0;
(9-8)从磁盘中读取当前对象,根据当前对象的预取属性进行预取操作,并更新内存池使用率Urate;具体来说,找到当前对象对应的预取属性节点,进而找到预取属性节点记录的单步预取队列前Prefetch_Size[0]个节点,对这些节点中记录的Oid所对应的对象进行预取,实现单步预取;同时,对数组Multi_Step[M]中前Prefetch_Size[1]个元素记录的Oid所对应的对象进行预取,实现多步预取,预取过程需要向内存池申请缓存资源,申请完毕后内存池自动更新内存池使用率;
(10)根据全局访问顺序数组Access_Order[M+1]对预取属性表的单步预取信息进行修改;具体而言,仅需修改预取属性表中前一访问对象的单步预取信息。
如图4所示,本步骤包括以下子步骤:
(10-1)在全局访问顺序数组中取前一访问对象的Oid,并根据Oid在预取属性表中查找到前一访问对象的预取属性节点;具体而言,全局访问顺序数组中Access_Order[M-1]元素的值即前一访问对象的Oid;
(10-2)判断当前对象是否在前一访问对象对应的预取属性节点的单步预取范围内,在则表示前一访问对象的单步预取成功,并进入步骤(10-3),否则进入步骤(10-5);
(10-3)将前一访问对象对应的预取属性节点记录的预取成功次数Prefetch_Vnum[0]的值加1;
(10-4)修改当前对象在前一访问对象对应的预取属性节点单步预取队列中的预取权值Prefetch_Weight,并将单步预取队列按照修改后的预取权值大小重新从大到小排序,然后进入步骤(10-8);具体而言,将预取权值Prefetch_Weight设置为Prefetch_Weight=Prefetch_Weight+前一访问对象的访问计数值Visit_Num,然后进入步骤(10-8);
(10-5)判断当前对象是否在前一访问对象对应的预取属性节点单步预取队列中,在则返回步骤(10-4),否则进入步骤(10-6);
(10-6)判断前一访问对象的访问计数值Visit_Num是否大于其单步预取对列尾节点的预取权值Prefetch_Weight,大于则进入步骤(10-7),否则进入步骤(10-8);
(10-7)在前一访问对象对应的单步预取对列中为当前对象创建节点,对该节点赋值,并根据预取权值Prefetch_Weight重新调整单步预取对列;具体而言,将创建节点的Oid值置为当前对象的Oid,预取权值置为前一访问对象的Visit_Num,删除单步预取对列中尾节点并将创建的节点加入队列,仍保持单步预取对列中按照预取权值的大小排列;
(10-8)根据预取成功次数Prefetch_Vnum[0]和访问计数值Visit_Num将前一访问对象对应的预取属性节点记录的单步预取准确率更新为Prefetch_Crate[0]=Prefetch_Vnum[0]/访问计数值Visit_Num;
(10-9)判断前一访问对象对应的预取属性节点记录的单步预取准确率Prefetch_Crate[0]是否大于阈值M1,大于则进入步骤(10-10),否则进入步骤(10-11);在本实施方式中,M1的取值范围为60%至80%;
(10-10)设置Prefetch_Size[0]=Prefetch-Size[0]-1,然后过程结束;
(10-11)判断前一访问对象的单步预取范围Prefetch_Size[0]大小是否大于等于上限Queue_Length,若是则进入步骤(10-12),否则进入步骤(10-13);在本实施方式中,Queue_Length的取值范围是2至6;
(10-12)将前一访问对象的单步预取范围大小Prefetch_Size[0]置0,清空其单步预取对列,并将单步预取对列的指针Psingle置空,然后过程结束;
(10-13)将前一访问对象的单步预取范围Prefetch_Size[0]设置为Prefetch_Size[0]=Prefetch_Size[0]+1;
(11)根据全局访问顺序数组Access_Order[M+1]对预取属性表的多步预取信息进行修改;具体而言,需修改前M个对象的多步预取信息。
如图5所示,本步骤包括以下子步骤:
(11-1)将临时变量i的值置为M;
(11-2)判断i是否大于1,若是则进入步骤(11-3),否则过程结束;
(11-3)将全局访问顺序数组Access_Order[M+1]中后i个Oid与该数组中第M-i个对象的多步预取序列数组Multi_Step[M]中前i个Oid进行比对,以判断比对的Oid序列是否相同,如果相同则进入步骤(11-4),否则进入步骤(11-5);
(11-4)将全局访问顺序数组中第M-i个对象对应的预取成功次数Prefetch_Vnum[M-i-1]加1;
(11-5)根据第M-i个对象的预取成功次数Prefetch_Vnum[M-i-1]和访问计数值Visit_Num将其对应的预取属性节点记录的多步预取准确率更新为Prefetch_Crate[M-i-1]=Prefetch_Vnum[M-i-1]/访问计数值Visit_Num;
(11-6)获取更新的预取准确率数组Prefetch_Crate[M]中大于等于阈值M2的个数,取该个数和Prefetch_Size[0]中的较小值作为新的多步预取的步长Prefetch_Size[1];在本实施方式中,阈值M2的取值范围是40%-70%;
(11-7)设置i=i-1,并返回步骤(11-2)。
本领域的技术人员容易理解,以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内所作的任何修改、等同替换和改进等,均应包含在本发明的保护范围之内。
Claims (8)
1.一种对象文件系统的预取方法,其特征在于,包括以下步骤:
(1)对对象文件系统的数据结构和变量进行初始化;具体而言,初始化内存池且将表示内存池使用率的全局变量Urate置0,创建并初始化一个具有Bucket_Num个哈希桶的哈希表,申请并初始化一个全局访问顺序数组Access_Order[M+1],其中M表示多步预测的最大步长,数组中的每个元素用于存放对象的Oid,Access_Order[M]为当前访问对象的Oid,将计时值T_Clock设置为0,且系统每隔一秒T_Clock值加1;
(2)判断服务器是否接收来自客户端的读对象请求,如果是则进入步骤(3),否则过程结束;
(3)解析读对象请求,并根据读对象请求确定当前对象及其Oid;
(4)判断读对象请求是否命中缓存,如果是进入步骤(5),否则进入步骤(6);
(5)根据当前对象的Oid在内存池中查找对应的缓存空间,并从缓存空间中直接读取当前对象,然后进入步骤(10);
(6)判断是否存在计时值T_Clock大于或等于时间阈值T_MAX,如果存在,则表示时间窗口已到,并进入步骤(7),否则进入步骤(9);
(7)初始化预取属性表,并将计时值T_Clock置0;
(8)从磁盘中读取读对象请求的对象,然后进入步骤(10);
(9)根据当前对象的Oid查询预取属性表,以获取当前对象的预取属性,并根据预取属性执行读磁盘和预取操作;
(10)根据全局访问顺序数组Access_Order[M+1]对预取属性表的单步预取信息进行修改;
(11)根据全局访问顺序数组Access_Order[M+1]对预取属性表的多步预取信息进行修改。
2.根据权利要求1所述的预取方法,其特征在于,步骤(7)具体为,将预取属性表中的所有节点初始化,清空时间阈值T_MAX前一段时间内的统计数据,包括将预取属性节点中的访问计数值Visit_Num置0、预取成功次数数组Prefetch_Vnum[M]、预取准确率数组Prefetch_Crate[M]、预取大小数组Prefetch_Size[2]、多步预取序列数组Multi_Step[M]设置为零,释放预取属性节点中单步预取队列所占用的内存空间并置指针Psingle为空,并初始化全局访问顺序数组Access_Order[M+1]为零。
3.根据权利要求1所述的预取方法,其特征在于,步骤(9)包括以下子步骤:
(9-1)记录与对象访问顺序有关的信息,并将当前对象Oid写入全局访问顺序数组Access_Order[M+1];
(9-2)判断预取属性表中是否存在当前对象对应的预取属性节点,如不存在则进入步骤(9-3),否则进入步骤(9-4);
(9-3)为当前对象建立对应的预取属性节点;
(9-4)更新当前对象的预取属性信息,包括访问计数值Visit_Num和多步预取序列数组Multi_Step[M];
(9-5)从当前对象对应的预取属性节点中提取对象预取属性,包括预取大小数组Prefetch_Size[2]、多步预取序列数组Multi_Step[M]、指向单步预取队列的指针Psingle;
(9-6)判断内存池使用率Urate是否大于一个阈值Umax,大于则进入步骤(9-7),否则进入(9-8);
(9-7)关闭多步预取,仅执行单步预取;
(9-8)从磁盘中读取当前对象,根据当前对象的预取属性进行预取操作,并更新内存池使用率Urate。
4.根据权利要求3所述的预取方法,其特征在于,
步骤(9-3)具体为,申请一个预取属性节点,将当前对象Oid写入节点记录的Oid,将访问计数值Visit_Num置0,将预取成功次数数组Prefetch_Vnum[M]、预取准确率数组Prefetch_Crate[M]、多步预取序列数组Multi_Step[M]、预取大小数组Prefetch_Size[2]初始化置0,并将单步预取队列指针Psingle和下一预取属性节点指针Pnext置为空,根据对象Oid进行哈希计算,并根据哈希计算的结果将预取属性节点加入到预取属性表中对应的冲突链上;
步骤(9-4)具体为,访问了当前对象一次,则将当前对象对应预取属性节点中的访问计数值Visit_Num加1,取出当前对象单步预取队列的头节点,将头节点中记录的Oid写入Multi_Step[0],再将写入Multi_Step[0]的Oid对应的对象视为当前对象,将其单步预取队列的头节点记录的Oid写入Multi_Step[1],重复上述过程M次,以找到M个对象,并将其依次写入数组Multi_Step[M]中,由此组成了当前可以预测到的最有可能的后续访问顺序。
5.根据权利要求3所述的预取方法,其特征在于,
步骤(9-7)具体为,将预取属性节点中多步预取的预取步长置为0,即设置Prefetch_Size[1]=0;
步骤(9-8)具体为,找到当前对象对应的预取属性节点,进而找到预取属性节点记录的单步预取队列前Prefetch_Size[0]个节点,对这些节点中记录的Oid所对应的对象进行预取,实现单步预取;同时,对数组Multi_Step[M]中前Prefetch_Size[1]个元素记录的Oid所对应的对象进行预取,实现多步预取,预取过程需要向内存池申请缓存资源,申请完毕后内存池自动更新内存池使用率。
6.根据权利要求1所述的预取方法,其特征在于,步骤(10)包括以下子步骤:
(10-1)在全局访问顺序数组中取前一访问对象的Oid,并根据Oid在预取属性表中查找到前一访问对象的预取属性节点;
(10-2)判断当前对象是否在前一访问对象对应的预取属性节点的单步预取范围内,在则表示前一访问对象的单步预取成功,并进入步骤(10-3),否则进入步骤(10-5);
(10-3)将前一访问对象对应的预取属性节点记录的预取成功次数Prefetch_Vnum[0]的值加1;
(10-4)修改当前对象在前一访问对象对应的预取属性节点单步预取队列中的预取权值Prefetch_Weight,并将单步预取队列按照修改后的预取权值大小重新从大到小排序,然后进入步骤(10-8);
(10-5)判断当前对象是否在前一访问对象对应的预取属性节点单步预取队列中,在则返回步骤(10-4),否则进入步骤(10-6);
(10-6)判断前一访问对象的访问计数值Visit_Num是否大于其单步预取队列尾节点的预取权值Prefetch_Weight,大于则进入步骤(10-7),否则进入步骤(10-8);
(10-7)在前一访问对象对应的单步预取队列中为当前对象创建节点,对该节点赋值,并根据预取权值Prefetch_Weight重新调整单步预取队列;
(10-8)根据预取成功次数Prefetch_Vnum[0]和访问计数值Visit_Num将前一访问对象对应的预取属性节点记录的单步预取准确率更新为Prefetch_Crate[0]=Prefetch_Vnum[0]/访问计数值Visit_Num;
(10-9)判断前一访问对象对应的预取属性节点记录的单步预取准确率Prefetch_Crate[0]是否大于阈值M1,大于则进入步骤(10-10),否则进入步骤(10-11);
(10-10)设置Prefetch_Size[0]=Prefetch_Size[0]-1,然后过程结束;
(10-11)判断前一访问对象的单步预取范围Prefetch_Size[0]大小是否大于等于上限Queue_Length,若是则进入步骤(10-12),否则进入步骤(10-13);
(10-12)将前一访问对象的单步预取范围大小Prefetch_Size[0]置0,清空其单步预取队列,并将单步预取队列的指针Psingle置空,然后过程结束;
(10-13)将前一访问对象的单步预取范围Prefetch_Size[0]设置为Prefetch_Size[0]=Prefetch_Size[0]+1。
7.根据权利要求6所述的预取方法,其特征在于,
步骤(10-7)具体为,将创建节点的Oid值置为当前对象的Oid,预取权值置为前一访问对象的Visit_Num,删除单步预取队列中尾节点并将创建的节点加入队列,仍保持单步预取队列中按照预取权值的大小排列。
8.根据权利要求1所述的预取方法,其特征在于,步骤(11)包括以下子步骤:
(11-1)将临时变量i的值置为M;
(11-2)判断i是否大于1,若是则进入步骤(11-3),否则过程结束;
(11-3)将全局访问顺序数组Access_Order[M+1]中后i个Oid与该数组中第M-i个对象的多步预取序列数组Multi_Step[M]中前i个Oid进行比对,以判断比对的Oid序列是否相同,如果相同则进入步骤(11-4),否则进入步骤(11-5);
(11-4)将全局访问顺序数组中第M-i个对象对应的预取成功次数Prefetch_Vnum[M-i-1]加1;
(11-5)根据第M-i个对象的预取成功次数Prefetch_Vnum[M-i-1]和访问计数值Visit_Num将其对应的预取属性节点记录的多步预取准确率更新为Prefetch_Crate[M-i-1]=Prefetch_Vnum[M-i-1]/访问计数值Visit_Num;
(11-6)获取更新的预取准确率数组Prefetch_Crate[M]中大于等于阈值M2的个数,取该个数和Prefetch_Size[0]中的较小值作为新的多步预取的步长Prefetch_Size[1];
(11-7)设置i=i-1,并返回步骤(11-2)。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210570438.4A CN103902260B (zh) | 2012-12-25 | 2012-12-25 | 一种对象文件系统的预取方法 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201210570438.4A CN103902260B (zh) | 2012-12-25 | 2012-12-25 | 一种对象文件系统的预取方法 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN103902260A CN103902260A (zh) | 2014-07-02 |
CN103902260B true CN103902260B (zh) | 2016-08-31 |
Family
ID=50993605
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201210570438.4A Active CN103902260B (zh) | 2012-12-25 | 2012-12-25 | 一种对象文件系统的预取方法 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN103902260B (zh) |
Families Citing this family (10)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN105589888B (zh) * | 2014-10-24 | 2020-10-16 | 中兴通讯股份有限公司 | 一种设备中管理文件的方法和装置 |
CN104580396B (zh) * | 2014-12-19 | 2018-07-20 | 华为技术有限公司 | 一种任务调度方法、节点及系统 |
JP5963991B1 (ja) * | 2015-02-27 | 2016-08-03 | 三菱電機株式会社 | ユーザインタフェース実行装置およびユーザインタフェース設計装置 |
CN104881369B (zh) * | 2015-05-11 | 2017-12-12 | 中国人民解放军国防科学技术大学 | 面向混合存储系统的低内存开销热点数据识别方法 |
CN106844740B (zh) * | 2017-02-14 | 2020-12-29 | 华南师范大学 | 基于内存对象缓存系统的数据预读方法 |
CN109324842A (zh) * | 2017-07-31 | 2019-02-12 | 武汉斗鱼网络科技有限公司 | 程序启动所需资源创建方法、存储介质、设备及方法 |
CN107943519B (zh) * | 2017-12-12 | 2018-12-11 | 清华大学 | 一种时序数据乱序操作处理方法和装置 |
CN110287010B (zh) * | 2019-06-12 | 2021-09-14 | 北京工业大学 | 一种面向Spark时间窗口数据分析的缓存数据预取方法 |
CN110399314B (zh) * | 2019-06-25 | 2021-10-15 | 苏州浪潮智能科技有限公司 | 一种cpu、一种电子设备以及一种cpu缓存控制方法 |
CN113128531B (zh) * | 2019-12-30 | 2024-03-26 | 上海商汤智能科技有限公司 | 一种数据处理方法及装置 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1845093A (zh) * | 2006-04-30 | 2006-10-11 | 华中科技大学 | 一种属性可扩展的对象文件系统 |
CN101556557A (zh) * | 2009-05-14 | 2009-10-14 | 浙江大学 | 一种基于对象存储设备的对象文件组织方法 |
CN102707966A (zh) * | 2012-04-12 | 2012-10-03 | 腾讯科技(深圳)有限公司 | 加速操作系统启动的方法及装置、预取信息生成方法及装置和终端 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US7793266B2 (en) * | 2007-06-04 | 2010-09-07 | International Business Machines Corporation | Method, apparatus and computer program product for optimizing access to the content of a virtual application container on a fixed, read-only medium |
-
2012
- 2012-12-25 CN CN201210570438.4A patent/CN103902260B/zh active Active
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN1845093A (zh) * | 2006-04-30 | 2006-10-11 | 华中科技大学 | 一种属性可扩展的对象文件系统 |
CN101556557A (zh) * | 2009-05-14 | 2009-10-14 | 浙江大学 | 一种基于对象存储设备的对象文件组织方法 |
CN102707966A (zh) * | 2012-04-12 | 2012-10-03 | 腾讯科技(深圳)有限公司 | 加速操作系统启动的方法及装置、预取信息生成方法及装置和终端 |
Also Published As
Publication number | Publication date |
---|---|
CN103902260A (zh) | 2014-07-02 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN103902260B (zh) | 一种对象文件系统的预取方法 | |
CN105653591B (zh) | 一种工业实时数据分级存储及迁移方法 | |
CN111124762B (zh) | 一种基于改进粒子群算法的动态副本放置方法 | |
KR102036419B1 (ko) | 그래프 처리 성능 향상을 위한 복수 계층 캐싱 방법 및 복수 계층 캐싱 시스템 | |
CN106464669B (zh) | 基于访问模式的智能文件预取 | |
CN110287010B (zh) | 一种面向Spark时间窗口数据分析的缓存数据预取方法 | |
CN103562887B (zh) | 用于存储设备的第一高速缓存和第二高速缓存中的轨道的高速缓存管理 | |
CN106959928B (zh) | 一种基于多级缓存结构的流式数据实时处理方法及系统 | |
CN110188080A (zh) | 基于客户端高效缓存的远程文件数据访问性能优化方法 | |
CN108833352A (zh) | 一种缓存方法及系统 | |
CN101765831A (zh) | 数据库不一致的处理方法 | |
CN105975215B (zh) | 一种基于Ondemand算法的叠瓦式磁质存储翻译层映射表管理方法 | |
CN104040508B (zh) | 用于在高速缓存系统中管理数据的方法和系统 | |
CN107292388A (zh) | 一种基于神经网络的热点数据的预测方法及系统 | |
CN106503238A (zh) | 一种强化学习驱动的网络地图区域聚类预取方法 | |
CN104657286A (zh) | 一种分级存储方法及装置 | |
CN110515726A (zh) | 一种数据库负载均衡方法与装置 | |
CN107426315A (zh) | 一种基于BP神经网络的分布式缓存系统Memcached的改进方法 | |
CN101221465A (zh) | 用于降低硬盘功耗的数据缓冲区实现方法 | |
CN108319634A (zh) | 分布式文件系统的目录访问方法和装置 | |
CN104035807A (zh) | 一种云存储系统的元数据缓存替换方法 | |
CN100518146C (zh) | 一种用于集群存储系统的全局缓存管理的方法 | |
CN102354301A (zh) | 缓存分区方法 | |
CN106973088B (zh) | 一种基于位置变动的联合lru与lfu的缓存更新方法及网络 | |
CN111787062B (zh) | 面向广域网络文件系统的自适应快速增量预读方法 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant |