改善缓存预取数据局部性的方法和系统及缓存访问方法与流程

文档序号:12040049阅读:210来源:国知局
改善缓存预取数据局部性的方法和系统及缓存访问方法与流程
本发明涉及缓存技术,尤其涉及改善缓存命中率的预取数据局部性组织方法。

背景技术:
缓存是多级存储系统中非常重要的组成部分,缓存预取是一项重要的提高缓存效率的技术。访问数据记录pij时首先查找其访问位置(索引查找或元数据查找等),当未能在缓存中命中时,缓存预取通过一次存储访问将pij所在低级存储层次中的预取数据记录集合Pi:{pi1,...,pin}预取到缓存中,并将pi1pin的访问位置修改为缓存中对应的位置,期望其后出现较多对pi1~pin的访问。其中,称Pi为pi1,...,pin的预取入口,pij为此次预取的预取首记录。所访问的数据记录可以是定长数据记录,也可以是变长数据记录。缓存预取数据内的空间局部性决定了预取机制是否有效:具有较好空间局部性的缓存预取数据能够使一次预取带来较多的缓存命中,减少低层次存储的访问,而空间局部性较差的缓存预取数据使预取机制得不到收益。为了使预取机制发挥更大的作用,需要改善预取数据的空间局部性。

技术实现要素:
因此,本发明的目的在于克服上述现有技术的缺陷,提供一种改善缓存预取数据局部性的方法。本发明的目的是通过以下技术方案实现的:一方面,本发明提供了一种改善缓存预取数据局部性的方法,所述方法包括:统计缓存中每个预取数据记录集合的预取命中次数,所述预取命中次数为该集合中被访问的数据记录的总数;对于其预取命中次数小于设定的命中阈值的预取数据记录集合,在将该集合换出缓存时,将该集合中被访问的数据记录写入到新的存储区域,与该存储区域中的其他数据形成新的预取数据记录集合。上述方法中,还可包括:对于缓存中每个预取数据记录集合:将该集合中首次被访问的数据记录标记为特殊记录;计算该集合中当前被访问的数据记录与上次被访问的数据记录之间的访问间隔,如果该访问间隔大于设定的间隔阈值,则将当前被访问的数据记录标记为特殊记录;对于其预取命中次数小于命中阈值的预取数据记录集合,在将该集合换出缓存时,将被标记为特殊记录的数据记录的预取入口修改为所述新的预取数据记录集合。上述方法中,所述访问间隔可为时间间隔、访问次数间隔、自定义的逻辑间隔或者上述间隔的组合。上述方法中,还可包括对于其预取命中次数小于命中阈值的预取数据记录集合,在将该集合换出缓存时,将该集合中被访问的数据记录预取入口都修改为所述新的预取数据记录集合。又一方面,本发明还提供了一种改善缓存预取数据局部性的系统,所述系统包括:用于统计缓存中每个预取数据记录集合的预取命中次数的装置,所述预取命中次数为该集合中被访问的数据记录的总数;用于对于其预取命中次数小于设定的命中阈值的预取数据记录集合,在将该集合换出缓存时,将该集合中被访问的数据记录写入到新的存储区域,与该存储区域中的其他数据形成新的预取数据记录集合的装置。上述系统中,还可包括标记装置和修改装置,所述标记装置可用于对于缓存中每个预取数据记录集合:将该集合中首次被访问的数据记录标记为特殊记录;计算该集合中当前被访问的数据记录与上次被访问的数据记录之间的访问间隔,如果该访问间隔大于设定的间隔阈值,则将当前被访问的数据记录标记为特殊记录;所述修改装置可用于对于其预取命中次数小于命中阈值的预取数据记录集合,在将该集合换出缓存时,将被标记为特殊记录的数据记录的预取入口修改为所述新的预取数据记录集合。在又一方面,本发明还提供了一种缓存访问方法,该方法包括:对于待访问的数据记录,如果缓存命中,则将缓存中包含该待访问的数据记录的预取数据记录集合的预取命中次数增加1;如果缓存未命中且有空的缓存项,则将包含该待访问的数据记录的预取数据记录集合预取到该缓存项中,并将该预取数据记录集合的预取命中次数增加1;如果缓存未命中且没有空的缓存项,则执行:判断选定的缓存项中预取数据记录集合的预取命中次数是否小于设定的命中阈值,如果小于,则将该集合中被访问的数据记录写入到新的存储区域,与该存储区域中的其他数据形成新的预取数据记录集合;以及将包含该待访问的数据记录的预取数据记录集合预取到该选定的缓存项中,并将该预取数据记录集合的预取命中次数增加1。上述缓存访问方法中,还可包括:对于缓存中每个预取数据记录集合:将该集合中首次被访问的数据记录标记为特殊记录;计算该集合中当前被访问的数据记录与上次被访问的数据记录之间的访问间隔,如果该访问间隔大于设定的间隔阈值,则将当前被访问的数据记录标记为特殊记录;在将其预取命中次数小于命中阈值的预取数据记录集合换出缓存时,将被标记为特殊记录的数据记录的预取入口修改为所述新的预取数据记录集合。上述缓存访问方法中,还可包括在将其预取命中次数小于命中阈值的预取数据记录集合换出缓存时,将该集合中被访问的数据记录预取入口都修改为所述新的预取数据记录集合。上述缓存访问方法,还可包括:当所述新的预取数据记录集合中的数据记录个数达到设定的阈值时,对于缓存中其预取命中次数小于设定的命中阈值的每个预取数据记录集合,将该集合中被访问的数据记录写入到该新的预取数据记录集合中;停止对该新的预取数据记录集合的写入,获取空闲的缓存空间用于存储另一个新的预取数据记录集合。与现有技术相比,本发明提供的改善缓存预取数据局部性的方法能有效降低预取次数,提高缓存命中率。附图说明以下参照附图对本发明实施例作进一步说明,其中:图1为根据本发明实施例的改善缓存预取数据局部性的方法的流程示意图;图2为根据本发明实施例的缓存访问方法的流程示意图。具体实施方式为了使本发明的目的,技术方案及优点更加清楚明白,以下结合附图通过具体实施例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。要改善缓存预取数据局部性需要解决两个问题:确定哪些缓存预取数据的局部性较差,需要对其进行改善;以及如何改善这些缓存预取数据的局部性。从某个预取数据记录集合(例如,Pi)被预取到缓存中,到其被换出缓存之前,该集合中将会有若干个数据记录被访问,这些被访问的数据记录的集合(例如,Hi:{pij1,...,pijm},)可称为此次预取的预取命中数据,这些被访问的数据记录的个数(例如,m)可以被称为此次预取的预取命中次数。例如,在将预取数据记录集合Pi预取到缓存中后,期望此次预取的预取命中次数较快地超过一个阈值,如果未达到此要求,则说明预取Pi没有发挥作用或者发挥了较少的作用,称此种情况为未达到预取效果,表明此次预取数据内部的空间局部性较差,应当对这些预取数据进行适当的重新布局从而改善局部性。图1给出了根据本发明的一个实施例的改善缓存预取数据局部性的方法的流程示意图。该方法统计缓存中每个预取数据记录集合的预取命中次数,对于其预取命中次数小于设定的命中阈值的预取数据记录集合(例如Pi),在将该集合换出缓存时,将该集合中被访问的数据记录(即预取命中数据,例如Hi)冗余写入到新的存储区域,与该存储区域中的其他数据形成新的预取数据记录集合(例如为P)。其中,所述命中阈值可以根据实际系统环境或用户需求来进行设置,可以为静态阈值,也可以是动态阈值,例如可以将命中阈值设定为某个预定的整数值,也可以将命中阈值设置为预取数据记录集合中元素个数的百分比,例如10%×|Pi|,20%×|Pi|,30%×|Pi|等。所述预取命中次数为该集合中被访问的数据记录的总数。在其他实施例中,所述预取命中次数也可以是对该预取数据记录集合的访问次数。通过上述方法被冗余写入到该新的预取数据记录集合中的预取命中数据与该集合中其他数据记录形成一批新的空间局部性较好的预取数据;该集合中的其他数据记录可以是通过同样的方法写入的冗余数据,也可以是写入的新产生的数据记录,该集合中可以存在重复的数据记录,也可以通过某种方法去除重复的数据记录。在其他实施例中,可以同时存在一个或多个这样的新的预取数据记录集合。当存在多个时,将所确定的要改善局部性的预取数据记录集合中被访问的数据记录按照某种分类写入到其中一个集合中。另外,不限定所形成的新的预取数据记录集合所在的存储介质,可以在写缓存中,也可以在其他层次的存储介质中,还可以从写缓存转入到其他层次的存储介质中;当访问存在多个副本的数据记录时优先从缓存中访问,如不在缓存中,则通过预取方式进入到缓存中后访问。在冗余写入这些预取命中数据(例如Hi)之后,同一条数据记录可能存在于多个预取数据记录集合中,此时被冗余的预取命中数据中每一条数据记录的预取入口有多种选择,可以不做更改(例如,仍然为Pi),也可以定位到新的预取位置(例如P),还可以根据访问的情况做出选择,不同的预取入口定位策略所适用的环境不同。在本发明的一个优选实施例中,该方法还包括下列步骤:对于缓存中每个预取数据记录集合:将该集合中首次被访问的数据记录标记为特殊记录;以及计算该集合中当前被访问的数据记录与上次被访问的数据记录之间的访问间隔,如果该访问间隔大于设定的间隔阈值,则将当前被访问的数据记录标记为特殊记录。这样,对于其预取命中次数小于命中阈值的预取数据记录集合,在将该集合换出缓存时,将该集合中被访问的数据记录冗余写入到新的存储区域,与该存储区域中的其他数据形成新的预取数据记录集合,同时还可以将该集合中被标记为特殊记录的数据记录的预取入口修改为所述新的预取数据记录集合。其中,访问间隔可以是时间间隔、访问次数间隔以及自定义的某种逻辑间隔中的一种,也可以是多种间隔类型组合(其中一种间隔过长即可标记为特殊记录)。间隔阈值可以根据访问间隔的类型来设置。在其他实施例中,也可以将进行上述冗余写入的所有数据记录的预取入口都修改为所述新的预取数据记录集合。或者也可以全部不修改。从上文所述可以看出,该改善缓存预取数据局部性的方法可以伴随缓存访问和缓存替换过程而运行。在本发明的又一个实施例中,还提供了一种结合上述改善缓存预取数据局部性方法的缓存访问方法。该缓存访问方法执行过程如下:当访问某个数据记录(假设为pij)时,分三种情况进行处理:(1)当访问未能在缓存中命中时(即该数据记录pij不在缓存中),如果存在空的缓存项,例如缓存项Ck,则将pij所在预取数据记录集合Pi:{pi1,...,pin}预取到缓存项Ck中,此时在预取完成后将pij加入到Hk中,递增hk,并标记pij为特殊记录;其中,Hk是与缓存项Ck对应的记录预取命中数据的集合,其数据结构可以例如为队列,位图等,hk用于记录预取命中次数计数。如果没有空的缓存项,则执行缓存替换步骤(将在下文中介绍),用Pi替换所选的缓存项Ck中的原有内容。(2)访问在缓存中命中(例如,Pi已经被预取到缓存项Ck中)且hk<Ti时,此时如果pij还未在Hk中,则将其加入到Hk中,递增hk,并计算上次访问Pi中的元素和当前访问的间隔I,如果I>TI,则标记pij为特殊记录;其中,Ti为命中阈值,TI为间隔阈值,其可根据访问间隔类型来确定,两者可以是静态阈值,也可以是动态阈值。(3)访问在缓存中命中且预取命中次数hk≥Ti时,此时递增hk。其中,将pij加入到Hk中例如可以指将pij在缓存中的逻辑或物理指针保存到记录Hk的数据结构中(加入之前判断pij是否已经Hk中存在,不存在时加入)。当要将缓存项Ck的内容将要从Pi替换为Pl时(例如,要访问的数据记录在Pl中,需要将Pl预取到缓存项Ck中),分两种情况处理:(1)如果hk<Ti,则将Hk中的数据记录写入到冗余数据记录集合Pw中,同时更改Hk中标记为特殊记录的预取入口为Pw,然后清空Hk并置hk为0;(2)如果hk≥Ti,则清空Hk并置hk为0。其中,Pw的存储位置可以在缓存中(例如,写缓存),也可以在其他层次的存储介质中,还可以从写缓存转入到其他层次的存储介质中。Pw中除按上述方法冗余写入的数据记录外,还可以写入新产生的数据记录;此时,冗余写入的数据记录可能存在两个副本(Pi和Pw中各一),访问存在多个副本的数据记录时优先从缓存中访问,如不在缓存中,则通过预取方式进入到缓存中后访问。当冗余数据记录集合Pw中的存储空间耗尽或者其中的数据记录个数达到上限要求,此时扫描所有缓存项C1~Cn,当扫描缓存项Ck(其中缓存集合为Pi)时,分两种情况处理:(1)如果hk<Ti,则将Hk中的数据记录写入到Pw中,同时更改Hk中标记为特殊记录的预取入口为Pw,最后清空Hk并置hk为0;(2)如果hk≥Ti,则不执行动作。然后,停止向Pw中写入新的数据记录,继续获取空闲缓存存储空间使其成为新的冗余数据记录集合Pw′。为更好地理解上述的缓存访问方法,参照图2对该缓存访问方法的执行过程进行举例说明。在该示例中假设缓存项个数为4,所用缓存替换算法为最近最少使用(LRU)算法,用j作为pij在缓存项Ck中的逻辑指针(通过记录数字j即可实现将pij加入到集合Hk中),令命中阈值Ti=10%×|Pi|,设定间隔阈值TI的值为4,可以写入的新的预取记录集合中记录个数上限要求为10,该新的预取记录集合的存储空间位于写缓存中。初始状态时,缓存全部为空,预取命中数据集合全部为空,预取命中次数为0。假设当前系统中,已存在6个如表1所示预取数据记录集合P1-P6。表2给出了该示例中要进行的访问序列1-20,其中访问序列1-7,12-20为读访问;访问序列8-11为写访问。访问序列1表示读数据记录p1,2,访问序列8表示写数据记录p7,1,以此类推。表1P1P2P3P4P5P6p1,1~p1,22p2,1~p2,18p3,1~p3,15p4,1~p4,12p5,1~p5,25p6,1~p6,21表2序号12345678910类型读读读读读读读写写写记录p1,2p2,5p3,1p4,9p2,6p2,7p1,3p7,1p7,2p7,3序号11121314151617181920类型写读读读读读读读读读记录p7,4p5,10p5,11p5,10p1,2p6,3p1,4p3,2p3,11p4,12继续参考图2,访问上述序列1-20的具体过程为:1)执行步骤101,判断所访问数据p1,2是否在缓存中;例如,缓存系统可通过查找操作确定所访问数据记录是否在缓存中。如果p1,2不在缓存中,那么需要将p1,2所在的预取数据记录集合P1预期到缓存中。假设系统选择将P1预期到缓存项C1中,转至步骤104继续执行。2)执行步骤104,判断缓存项C1中是否为空;也就是说,缓存系统在将P1预取到缓存项C1之前,要判断C1中是否有数据。如果缓存项C1为空,则转到步骤110继续执行。3)执行步骤110,将P1预取到缓存项C1中;4)执行步骤111,将p1,2加入到C1的预取命中集合H1中;然后返回步骤101,继续处理下一个访问序列。具体地,在C1对应的预取命中数据集合H1中加入p1,2的逻辑指针2,标记p1,2为特殊记录,递增预取命中次数h1。按照与过程1)~5)相同的方式,处理访问序列2~4,处理完毕后缓存项中存储的预取数据记录集合,对应的预取命中数据集合,及对应预取命中次数可如下表3所示(下划线表示特殊记录标记):表3缓存项预取数据记录集合预取命中数据集合预取命中次数C1P121C2P251C3P311C4P491参考图2以及表2所示的访问序列,下面继续处理访问序列5:5)执行步骤101,判断p2,6是否在缓存中;这里p2,6已经在缓存中,则转至步骤102继续执行。6)执行步骤102,判断预取命中次数h2是否小于命中阈值;如果小于,则转至步骤103继续执行,否则返回步骤101,处理下一个访问序列。此时,h2此时为1,小于阈值T2=10%×|P2|=10%×18。7)执行步骤103,将p2,6加入到C2的预取命中集合H2中;然后返回步骤101,继续处理下一个访问序列。在步骤103,还需要计算如上文所述的访问间隔I;这里与对C2的前一次的访问间隔I为3,小于间隔阈值TI,因此在C2对应的预取命中数据集合H2中记录p2,6的逻辑指针6,递增预取命中次数h2。按照与过程5)~7)相同的方式,继续处理访问序列6~7,不同的是,对于访问序列6,在执行102时h2已经大于命中阈值T2,因此不需执行步骤103;对于访问序列7,在执行103时,与对C1的前一次的访问间隔I为6,大于间隔阈值TI,因此除将p1,3的逻辑指针3加入到H1中并递增h1以外,还需要将其标记为特殊记录。接着,继续处理访问序列8~11。对于写入序列8~11,缓存系统会生成一个新的预取数据记录集合P7,将p7,1~p7,4写入到P7中(本示例中,假设P7的存储位置在写缓存Pw中)。此时,各缓存项中存储的预取数据记录集合,对应的预取命中数据集合,及对应的预取命中次数如下表4所示(下划线表示特殊记录标记,连字符表示信息为空):表4接着处理访问序列12,即读数据记录p5,10:8)执行步骤101,判断p5,10是否在缓存中;这里p5,10不再缓存中,假设系统选择p5,10所在的预取数据访问记录集合P5预取到缓存项C1中,接着转至步骤104执行。9)执行步骤104,判断缓存项C1是否为空;如果缓存项为空,则转至步骤110;如果缓存项不为空,则需要将缓存项C1中的内容换出缓存,此时转至步骤105继续执行。10)执行步骤105,判断预取命中次数h1是否小于或等于命中阈值;如果小于或等于命中阈值,则执行步骤106;如果大于命中阈值,则转至步骤110继续执行。具体地,此时h1为2,小于命中阈值T1=10%×|P1|=10%×22。这说明此时C1中的预取数据访问记录集合P1中的数据局部性较差,需要进行改善。反之,如果大于命中阈值,则说明不需要改善这部分数据的局部性,即不需要对现在缓存项C1的数据进行额外处理,直接将P5换入到C1即可。11)执行步骤106,将H1中的数据记录写入集合P7中;具体地,从缓存项C1对应的预取命中数据集合H1中依次读出逻辑指针2和3,并据此从C1中读出第2和第3个记录p1,2和p1,3,将其写入到P7中(成为P7中的p7,5和p7,6),并更改p1,2和p1,3的预取入口为P7(本实施例将这些冗余的数据记录和新产生的记录写入同一预取数据记录集合)。此时p1,2,p1,3和p7,5,p7,6互为副本,由于后者在写缓存Pw中而P1已经被换出缓存,所以优先访问p7,5,p7,6。12)执行步骤107,清空预取命中集合H1,并置h1为0;13)执行步骤108,判断写入集合P7是否已满;如果未满,则转至步骤110继续执行;如果已满,则转至步骤109继续执行。这里,P7中数据记录个数为4,小于10,未达到个数上限。14)执行步骤110,将P5换入到缓存项C1中;15)执行步骤111,将p5,10加入到C1的预取命中集合H1中;按照与过程5)~7)相同的方式,处理访问序列13,14,不同的是,对于访问序列14,执行步骤103过程中向H1中加入p5,10的逻辑指针10时,发现该数字已经被记录(与序列12访问相同数据记录),因此,跳过步骤103中其他操作。处理完成后,各缓存项中存储的预取数据记录集合,对应的预取命中数据集合,及对应预取命中次数如下表5所示(下划线表示特殊记录标记,连字符表示信息为空):表5对于访问序列15,由于p1,2和p1,3在P7中存在副本p7,5和p7,6(通过缓存查找找到副本),因此访问会从P7中读取数据记录p7,5,p7,6,不执行其他操作。按照与过程8)~15)相同的方式,处理访问序列16~18,在处理过程中,按照LRU缓存替换算法,P3,P4,P2先后被换出缓存,在此过程中将p3,1,p4,9写入P7,由于p3,1,p4,9被标记为特殊记录其预取入口修改为P7,换出P2时由于预取命中次数大于阈值T2,其中预取命中数据不写入P7。按照与过程5)~7)相同的方式,处理访问序列19,在处理过程中,p3,11在缓存项C2中命中,在C2对应的预取命中数据集合H2中加入p3,11的逻辑指针11,递增预取命中次数h2。按照与过程8)~15)相同的方式,处理访问序列20,在处理过程中,按照LRU缓存替换算法,P5被换出缓存,在此过程中将p5,10,p5,11写入P7,由于p5,10被标记为特殊记录其预取入口修改为P7。不同的是,在执行步骤108时,P7中的数据记录个数为10,达到了个数上限,需要执行步骤109,具体地,扫描缓存项C1~C4,发现h1,h3,h4不满足阈值要求,因此将p6,3,p1,4,p4,12写入P7(h2满足阈值要求,因此p3,2,p3,11不写入),由于p6,3,p1,4,p4,12被标记为特殊记录,其预取入口修改为P7,最后清空C1,C3,C4对应的预取命中数据集合H,H3,H4,并置h1,h3,h4为0。步骤109执行完毕之后,新的预取数据记录集合P7:{p7,1,...,p7,13}中包含13个数据记录,其中四个为新写入记录,九个为副本记录。此时将停止对P7的写入操作,当后续有新的数据产生或如上文所述需要冗余写入部分数据记录时,从新空闲缓存存储空间分配新的存储区域,使其用于存储新的冗余数据记录集合P8等。处理完表2给出的所有访问序列之后,各缓存项中存储的预取数据记录集合,对应的预取命中数据集合,及对应预取命中次数如下表6所示(下划线表示特殊记录标记,连字符表示信息为空,在P7被换出写缓存之前将其持久化到磁盘中):表6发明人还在内容寻找存储中的索引系统中,利用真实环境下的备份负载对上述的方法进行了测试。测试结果表明,该方法减少了17.8%~56%的索引预取次数,提升了8%~24%的读取带宽和2%~6%的写入带宽;在同样的索引系统中,利用为期两周的数据同步负载的测试结果表明,预取次数下降了96%。虽然本发明已经通过优选实施例进行了描述,然而本发明并非局限于这里所描述的实施例,在不脱离本发明范围的情况下还包括所作出的各种改变以及变化。
当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1