基于ssd的大容量缓存中的lru策略实现方法

文档序号:6400873阅读:210来源:国知局
专利名称:基于ssd的大容量缓存中的lru策略实现方法
技术领域
本发明涉及计算机存储领域,具体涉及一种基于SSD的大容量缓存中的低开销LRU策略实现方法。
背景技术
缓存是一种根据局部性原理,利用小容量的高速存储设备保存近期频繁使用的数据,从而提高整个存储系统性能的机制。它因为简单有效、性价比高、对上层应用透明而被广泛的应用于计算机系统中。缓存只保存近期频繁访问的数据,不再频繁访问的数据将被替换出缓存,识别不频繁访问数据的机制被称为缓存替换策略。LRU(Least RecentlyUsed,最久未使用)是一种基本的缓存替换策略。它因为准确地反映了局部性原理而被广泛地采用,成为大部分复杂缓存替换策略的基础。LRU替换策略维护一条LRU队列。近期访问的数据被放到LRU队列的头部,近期未访问的数据逐步淘汰到LRU队列的底部。发生缓存替换时,仅需将LRU队列底部的数据替换出缓存即可。
本发明针对基于SSD(Solid State Drive,固态盘)的缓存,提出一种低开销的LRU缓存替换策略实现方法。基于本发明提出的方法,可以实现更复杂的缓存替换策略。SSD是一种新型的存储设备。它读写延迟较低,能够提供很高的带宽。但是,相比于磁盘,SSD价格较贵,容量较小。所以,SSD适合当作磁盘的缓存。相对基于DRAM (Dynamic RandomAccess Memory,内存)的缓存,基于SSD的缓存容量很大。这种大容量缓存采用的替换策略需要维护很长的LRU队列。目前,LRU替换策略的实现方法通常有以下两种:
1、LRU队列以双向链表的方式实现,链表中的每个节点索引一页数据。当一页数据被访问时,相应的节点被移动到链表的头部。很久不被访问的数据逐步淘汰到链表的尾部,缓存替换时只需将链表尾部的数据淘汰出缓存即可。这种方法只能将链表实现在内存中,因为操作系统发出的每个读写请求都会触发双向链表中节点的移动,频繁的链表操作只能在内存中进行。对于基于SSD的大容量缓存,这种实现方式占用过多的内存。另外,基于双向链表的实现方式需要为链表维护一个互斥锁,频繁地加锁和解锁也会占用很多计算资源。
2、以Clock (时钟)队列替代LRU队列。LRU队列以双向链表的方式实现时,互斥锁消耗较多的计算资源,Clock队列则用来减少加锁和解锁操作的频率。Clock队列也维护一个双向链表,链表的每个节点索引一页数据,同时还为这页数据设置一个标志位,标志位初始化为O。如果一页数据被访问,只需将标志位置为1,而不需将整个节点移动到双向链表的头部,所以避免了加锁和解锁。缓存替换时,检查Clock队列尾部的节点,如果节点的标志位为1,则将该节点移动到队列头部,并将标志位置为O ;否则,将该节点删除,该节点索引的数据被替换出缓存。Clock队列避免了频繁地加锁和解锁,但必须实现在内存中,因为需要频繁地重置标志位。对于基于SSD的大容量缓存,这种方法仍然不适用。发明内容
本发明要解决的技术问题是提供一种实现简单、操作快捷、存储占用空间低、内存开销低的基于SSD的大容量缓存中的LRU策略实现方法。
为了解决上述技术问题,本发明采用的技术方案为:
一种基于SSD的大容量缓存中的LRU策略实现方法,其实施步骤如下:
I)在SSD上分配一块连续的地址空间初始化FIFO队列;在内存中建立用于记录只访问过一次的磁盘逻辑地址的第一计数型布隆选择器和用于记录访问过两次以上的磁盘逻辑地址的第二计数型布隆选择器的数据结构,在内存中分别申请两块地址空间作为待写入磁盘逻辑地址缓冲区和待替换磁盘逻辑地址缓冲区,跳转执行下一步;
2)接收操作系统对磁盘逻辑地址的读写请求,跳转执行下一步;
3)检查读写请求的磁盘逻辑地址是否记录在第二计数型布隆选择器中,若在第二计数型布隆选择器中存在,等待在新的读写请求到来时跳转执行步骤2);否则跳转执行步骤4);
4)检查读写请求的磁盘逻辑地址是否记录在第一计数型布隆选择器中,若在第一计数型布隆选择器中存在,跳转执行步骤5);否则,跳转执行步骤6);
5)将读写请求的磁盘逻辑地址从第一计数型布隆选择器中删除,同时将读写请求的磁盘逻辑地址添加到第二计数型布隆选择器中,等待在新的读写请求到来时跳转执行步骤2);
6)判定第一计数型布隆选择器和第二计数型布隆选择器的数据结构中均不包含读写请求的磁盘逻辑地址,将读写请求的磁盘逻辑地址添加至第一计数型布隆选择器中,跳转执行下一步;
7)将读写请求的磁盘逻辑地址写到待写入磁盘逻辑地址缓冲区,跳转执行下一I K少;
8)检查待写入磁盘逻辑地址缓冲区是否写满,若未写满则跳转执行步骤10),否则跳转执行步骤9);
9)将待写入磁盘逻辑地址缓冲区中的磁盘逻辑地址刷新到SSD中FIFO队列的尾部,同时将FIFO队列的尾部指针递增,跳转执行下一步;
10)判定读写请求的请求类型,如果请求类型为写请求,则直接将待写入的用户数据写到SSD上;如果请求类型为读请求,由于没有在SSD上命中,先从底层存储系统读出数据,将数据返回给上层应用的同时,将数据写到SSD上;跳转执行下一步;
11)检查SSD的空闲存储空间占SSD总容量的比例是否小于第一预设阈值,若SSD的空闲存储空间占SSD总容量的比例小于第一预设阈值则跳转执行步骤12),否则等待在新的读写请求到来时跳转执行步骤2);
12)读取FIFO队列的头部到待替换磁盘逻辑地址缓冲区,跳转执行下一步;
13)取出所述待替换磁盘逻辑地址缓冲区的首个磁盘逻辑地址作为当前磁盘逻辑地址,跳转执行下一步;
14)判断当前磁盘逻辑地址是否在第二计数型布隆选择器中,如果在第二计数型布隆选择器中则跳转执行步骤15);否则跳转执行步骤16);
15)将当前磁盘逻辑地址从第二计数型布隆选择器中删除,同时将当前磁盘逻辑地址添加到第一计数型布隆选择器中,跳转执行步骤17);
16)判断当前磁盘逻辑地址是否在第一计数型布隆选择器中,如果在第一计数型布隆选择器中则将当前磁盘逻辑地址从第一计数型布隆选择器中删除,跳转执行步骤18);
17)将当前磁盘逻辑地址写入到待写入磁盘逻辑地址缓冲区,使得当前磁盘逻辑地址对应的数据继续保留在SSD上,跳转执行步骤18);
18)判断所述待替换磁盘逻辑地址缓冲区的所有磁盘逻辑地址是否已经全部处理完毕,如果尚未处理完毕则获取下一个磁盘逻辑地址作为当前磁盘逻辑地址,跳转执行步骤14);如果已经处理完毕则跳转执行步骤19);
19)检查SSD的空闲存储空间占SSD总容量的比例是否大于第二预设阈值,所述第二预设阈值比第一预设阈值大,若SSD的空闲存储空间占SSD总容量的比例大于第二预设阈值,则等待在新的读写请求到来时跳转执行步骤2);否则跳转执行步骤12)。
作为本发明上述技术方案的进一步改进:
所述步骤I)中在内存中建立的第一计数型布隆选择器和第二计数型布隆选择器的数据结构均包含一个整数数组,所述第一计数型布隆选择器和第二计数型布隆选择器均对应设有多个哈希函数;在将磁盘逻辑地址添加到第一计数型布隆选择器或第二计数型布隆选择器中时,将磁盘逻辑地址代入到所述多个哈希函数中得到多个哈希值,将所述哈希值分别对应指向整数数组中各个位置的整数都加I;在将磁盘逻辑地址从第一计数型布隆选择器或第二计数型布隆选择器中删除时,将磁盘逻辑地址代入到所述多个哈希函数中得到多个哈希值,将所述哈希值分别对应指向整数数组中各个位置的整数都减I ;在查询磁盘逻辑地址是否在第一计数型布隆选择器或第二计数型布隆选择器中时,将磁盘逻辑地址代入到所述多个哈希函数中得到多个哈希值,检查所述哈希值分别对应指向整数数组中各个位置的整数是否都大于0,如果都大于O则说明在第一计数型布隆选择器或第二计数型布隆选择器中。
所述步骤I)中在内存中分别申请两块地址空间作为待写入磁盘逻辑地址缓冲区和待替换磁盘逻辑地址缓冲区时,待写入磁盘逻辑地址缓冲区和待替换磁盘逻辑地址缓冲区的地址空间大小均为4KB。
所述第一预设阈值为5%。
所述第二预设阈值为10%。
本发明基于SSD的大容量缓存中的LRU策略实现方法具有下述优点:
1.本发明在SSD上分配一块连续的地址空间初始化FIFO队列,针对FIFO队列的操作只发生在队列的头部和尾部,实现简单。相比之下,现有技术采用LRU队列,一个磁盘逻辑地址在LRU队列中命中时,首先需要查找该磁盘逻辑地址在LRU队列中的位置,然后将该磁盘逻辑地址移动到LRU队列的头部,操作非常复杂。
2.本发明的FIFO队列保存在SSD上,不占用内存空间。由于每个读写请求都会触发对LRU队列的操作,队列操作频繁,且队列操作可能发生在LRU队列的任何位置,所以现有技术只能将LRU队列保存在内存中,而LRU队列必然占用大量内存空间;而本发明通过FIFO队列模拟实现LRU队列,充分利用了 SSD的高读写速度,而且不会占用内存空间。
3.本发明的FIFO队列中只记录磁盘逻辑地址,每个磁盘逻辑地址仅占4字节,整个FIFO队列占用的SSD空间较少。相比之下,现有技术采用LRU队列时,LRU队列的每个节点不仅包含磁盘逻辑地址,还包含维护LRU队列所需的前向指针和后向指针,整个LRU队列所占的空间是FIFO队列的三倍以上。
4.本发明提出的方法仅将两个计数型布隆选择器保存在内存中,计数型布隆选择器在内存中仅仅为两个整数数组,其占用内存空间很小。相比之下,现有技术采用LRU队列时,LRU队列占用数GB内存空间。


图1为本发明实施例的方法流程示意图。
具体实施方式
如图1所示,本实施例基于SSD的大容量缓存中的LRU策略实现方法的实施步骤如下:
I)在SSD上分配一块连续的地址空间初始化FIFO队列;在内存中建立用于记录只访问过一次的磁盘逻辑地址的第一计数型布隆选择器CBF1和用于记录访问过两次以上的磁盘逻辑地址的第二计数型布隆选择器CBF2的数据结构,在内存中分别申请两块地址空间作为待写入磁盘逻辑地址缓冲区和待替换磁盘逻辑地址缓冲区,跳转执行下一步。
本实施例中,FIFO队列存放在SSD中的一片连续地址空间上,这片连续地址空间被循环利用,连续地址空间的空间大小取决于磁盘逻辑地址的长度和SSD的容量。假定基于SSD的缓存容量为512GB,SSD中每页占4KB,则整个缓存可以保存512GB/4KB = 128M个磁盘逻辑地址的数据,这128M个磁盘逻辑地址保存在FIFO队列中。假定每个磁盘逻辑地址为4字节,则整个FIFO队列占512MB的SSD空间。
计数型布隆选择器CBF由一个维护在内存中的整数数组和k个哈希函数Ii1(X),h2(x),h3(x), , hk(x)组成,整数数组的所有元素被初始化为O。CBF能够以较低的空间开销记录一个集合中包含有哪些元素。本实施例中,步骤I)中在内存中建立的第一计数型布隆选择器CBF1和第二计数型布隆选择器CBF2的数据结构均包含一个整数数组,第一计数型布隆选择器CBF1和第二计数型布隆选择器CBF2均对应设有k个哈希函数Qi1 (x),h2 (x),h3(x),...,hk(x));在将磁盘逻辑地址添加到第一计数型布隆选择器CBF1和第二计数型布隆选择器CBF2中时,将磁盘逻辑地址代入到多个哈希函数中得到多个哈希值,将哈希值分别对应指向整数数组中各个位置的整数都加I ;在将磁盘逻辑地址从第一计数型布隆选择器CBF1和第二计数型布隆选择器CBF2中删除时,将磁盘逻辑地址代入到多个哈希函数中得到多个哈希值,将哈希值分别对应指向整数数组中各个位置的整数都减I ;在查询磁盘逻辑地址是否在第一计数型布隆选择器CBF1和第二计数型布隆选择器CBF2中时,将磁盘逻辑地址代入到多个哈希函数中得到多个哈希值,检查哈希值分别对应指向整数数组中各个位置的整数是否都大于0,如果都大于O则说明在第一计数型布隆选择器CBF1或第二计数型布隆选择器CBF2中。本实施例中,CBF1和CBF2各维护4个哈希函数Ii1 (x),h2 (x),h3 (x),h4(X)。
本实施例中,第一计数型布隆选择器和第二计数型布隆选择器均对应的多个哈希函数,哈希函数通过将磁盘逻辑地址代入到SHAl函数中进行哈希运算得到。对于磁盘逻辑地址Addr,当需要使用它的4个哈希值时,计算Addr的SHAl (Secure Hash Algorithm,安全哈希算法)值,Addr 的 SHAl 值包含 160 位,Ii1 (Addr), h2 (Addr), h3 (Addr), h4 (Addr)分别对应这160位中不同的29位。这种方法保证4个哈希函数的随机性和均匀性,且计算简单。
由于SSD的最小读写单位是页,页大小一般为4KB。将磁盘逻辑地址添加到FIFO队列的尾部时,需要累积1024个4字节的磁盘逻辑地址,才能向SSD发送一个写请求,待写入磁盘逻辑地址缓冲区正是用来累积一页的磁盘逻辑地址。引入待写入磁盘逻辑地址缓冲区和待替换磁盘逻辑地址缓冲区主要是因为SSD的最小读写单位是页,页大小一般为4KB,因此本实施例中,步骤I)中在内存中分别申请两块地址空间作为待写入磁盘逻辑地址缓冲区和待替换磁盘逻辑地址缓冲区时,待写入磁盘逻辑地址缓冲区和待替换磁盘逻辑地址缓冲区的地址空间大小均为4KB,既可以进行累积一页的磁盘逻辑地址来适配SSD的写入需要而且各占用4KB内存空间,开销很小。CBF维护的整数数组的大小取决于可能放入该CBF中的元素个数。如果基于SSD的缓存为512GB,SSD每页4KB,则放入CBF1和CBF2中的磁盘逻辑地址最多为128M个。每个磁盘逻辑地址添加到CBF1 (CBF2)中时,都会将CBF1 (CBF2)维护的整数数组中的k个元素加1,这k个元素的位置取决于磁盘逻辑地址和采用的哈希函数。为了减少哈希冲突,CBF1和CBF2维护的整数数组都包含512M个元素。整数数组中每个元素占2位,整个数组占128MB的内存空间。所以,本实施例的第一计数型布隆选择器CBF1和第二计数型布隆选择器CBF2共占用256MB的内存空间。当4KB的待写入磁盘逻辑地址缓冲区写满时,则将待写入磁盘逻辑地址缓冲区中的磁盘逻辑地址刷新到SSD上FIFO队列的尾部;发生缓存替换时,先从FIFO队列头部取出4KB的磁盘逻辑地址,放到待替换磁盘逻辑地址缓冲区内,然后逐个处理这些逻辑地址。
2)接收操作系统对磁盘逻辑地址Addr的读写请求,跳转执行下一步。
3)检查读写请求的磁盘逻辑地址Addr是否记录在第二计数型布隆选择器CBF2中,若在第二计数型布隆选择器CBF2中存在,等待在新的读写请求到来时跳转执行步骤2);否则跳转执行步骤4)。
本实施例将读写请求的磁盘逻辑地址Addr代入到第二计数型布隆选择器CBF2的四个哈希函数 Ii1 (X),h2 (X),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四个29位的哈希值,这四个哈希值指向第二计数型布隆选择器CBF2维护的内存中整数数组中的四个位置,如果这四个位置对应的整数都大于0,说明读写请求的磁盘逻辑地址Addr在第二计数型布隆选择器CBF2中。
4)检查读写请求的磁盘逻辑地址Addr是否记录在第一计数型布隆选择器CBF1中,若在第一计数型布隆选择器CBF1中存在,跳转执行步骤5);否则,跳转执行步骤6)。
与步骤3)类似,本实施例将读写请求的磁盘逻辑地址Addr代入到第一计数型布隆选择器 CBF1 的四个哈希函数 Ii1 (X),h2 (X),h3 (x),h4 (x)中,得到 Ii1 (Addr),h2 (Addr),h3(Addr), h4 (Addr)四个29位的哈希值,这四个哈希值指向第一计数型布隆选择器CBF1维护的内存中整数数组中的四个位置,如果这四个位置对应的整数都大于0,说明读写请求的磁盘逻辑地址Addr在第一计数型布隆选择器CBF1中。
5)将读写请求的磁盘逻辑地址Addr从第一计数型布隆选择器CBF1中删除,同时将读写请求的磁盘逻辑地址Addr添加到第二计数型布隆选择器CBF2中,等待在新的读写请求到来时跳转执行步骤2)。
将读写请求的磁盘逻辑地址Addr从第一计数型布隆选择器CBF1中删除时,将读写请求的磁盘逻辑地址Addr代入到四个哈希函数Ill(X), h2(x),h3(x),h4(x)中,得到hi (Addr), h2 (Addr), h3 (Addr), h4 (Addr)四个29位的哈希值,这四个哈希值指向第一计数型布隆选择器CBF1维护的整数数组中的四个位置,将这四个位置的整数都减1,即将读写请求的磁盘逻辑地址Addr从第一计数型布隆选择器CBF1中删除;将读写请求的磁盘逻辑地址Addr添加到第二计数型布隆选择器CBF2中时,将读写请求的磁盘逻辑地址Addr代入到四个哈希函数 Ii1 (X),h2 (X),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四个29位的哈希值,这四个哈希值指向第二计数型布隆选择器CBF2维护的整数数组中的四个位置,将这四个位置的整数都加1,即实现将读写请求的磁盘逻辑地址Addr添加到第二计数型布隆选择器CBF2中。本实施例中,在第二计数型布隆选择器CBF2维护的整数数组中,每个元素仅占2位,能表示的最大整数为3。如果某一位置的整数为3,不能将它加I。
6)判定第一计数型布隆选择器CBF1和第二计数型布隆选择器CBF2的数据结构中均不包含读写请求的磁盘逻辑地址,将读写请求的磁盘逻辑地址添加至第一计数型布隆选择器CBF1中,跳转执行下一步。
本实施例将读写请求的磁盘逻辑地址添加至第一计数型布隆选择器CBF1中与添加到第二计数型布隆选择器CBF2相同,步骤为:将读写请求的磁盘逻辑地址Addr代入到四个哈希函数 Ii1 (X),h2 (X),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四个29位的哈希值,这四个哈希值指向第一计数型布隆选择器CBF1维护的整数数组中的四个位置,将这四个位置的整数都加1,即实现将Addr添加到第一计数型布隆选择器CBF1中。本实施例中,在第一计数型布隆选择器CBF1维护的整数数组中,每个元素仅占2位,能表示的最大整数为3。如果某一位置的整数为3,同样也不能将它加I。
7)将读写请求的磁盘逻辑地址Addr写到待写入磁盘逻辑地址缓冲区,跳转执行下一步。
8)检查待写入磁盘逻辑地址缓冲区是否写满,若未写满则跳转执行步骤10),否则跳转执行步骤9)。
9)将待写入磁盘逻辑地址缓冲区中的磁盘逻辑地址刷新到SSD中FIFO队列的尾部,同时将FIFO队列的尾部指针递增,跳转执行下一步。
10)判定读写请求的请求类型,如果请求类型为写请求,则直接将待写入的用户数据写到SSD上;如果请求类型为读请求,由于没有在SSD上命中,先从底层存储系统读出数据,将数据返回给上层应用的同时,将数据写到SSD上;跳转执行下一步。
将读写请求的磁盘逻辑地址Addr对应的数据写到SSD上,因此递减SSD的缓存空闲空间C。将读写请求的磁盘逻辑地址Addr对应的数据写到SSD上时对于写请求,直接将待写入的用户数据写到SSD上。对于读请求,由于没有在SSD上命中,先从底层存储系统读出数据,将数据返回给上层应用的同时,将数据写到SSD上。
11)检查SSD的空闲存储空间占SSD总容量的比例c是否小于第一预设阈值α,若SSD的空闲存储空间占SSD总容量的比例c小于第一预设阈值α则跳转执行步骤12),否则等待在新的读写请求到来时跳转执行步骤2);
本实施例中,第一预设阈值α为5%,即缓存空间利用率超过95%时,触发缓存替换。如果第一预设阈值α取值太大,则可能引起SSD被频繁读写,而本实施例中第一预设阈值α取值为5%,能够尽量避免对SSD的读写操作,又能够确保SSD有足够的缓存空间可用。
12)读取FIFO队列的头部到待替换磁盘逻辑地址缓冲区,跳转执行下一步。
由于SSD的基本读写单位是页,所以从FIFO队列的头部读取一页的磁盘逻辑地址,放到待替换磁盘逻辑地址缓冲区。由于在步骤9)中以4KB为单位将磁盘逻辑地址写到FIFO队列中,这里以4KB为基本单位从FIFO队列头部将磁盘逻辑地址读出,放到待替换磁盘逻辑地址缓冲区。每个磁盘逻辑地址大小为N字节,所以一共读出4KB/N的磁盘逻辑地址。下面的步骤13) 步骤18)即为将这4KB/N个磁盘逻辑地址对应的数据替换出SSD,直到SSD的空闲存储空间大于第二预设阈值β,其中第二预设阈值β与第一预设阈值α的关系为:β > α。
13)取出待替换磁盘逻辑地址缓冲区(共存储有4ΚΒ/Ν个磁盘逻辑地址)的首个磁盘逻辑地址Addrn(η = I)作为当前磁盘逻辑地址,跳转执行下一步。
14)判断当前磁盘逻辑地址Addrn是否在第二计数型布隆选择器CBF2中,如果在第二计数型布隆选择器CBF2中则跳转执行步骤15);否则跳转执行步骤16)。
与步骤3)相同,本实施例将当前磁盘逻辑地址Addrn代入到第二计数型布隆选择器的四个哈希函数 Ii1 (X), h2(x), h3(x), h4(x)中,得到 Ii1 (Addr), h2 (Addr), h3 (Addr),h4(Addr)四个29位的哈希值,这四个哈希值指向第二计数型布隆选择器CBF2维护的内存中整数数组中的四个位置,如果这四个位置对应的整数都大于0,说明当前磁盘逻辑地址Addrn在第二计数型布隆选择器CBF2中。
15)将当前磁盘逻辑地址Addrn从第二计数型布隆选择器CBF2中删除,同时将当前磁盘逻辑地址Addrn添加到第一计数型布隆选择器CBF1中,跳转执行步骤17)。
与步骤5)类似,将当前磁盘逻辑地址Addrn从第二计数型布隆选择器CBF2中删除时,将当前磁盘逻辑地址Addrn代入到四个哈希函数Ill (X),h2(x),h3(x),h4(x)中,得到hi (Addr), h2 (Addr), h3 (Addr), h4 (Addr)四个29位的哈希值,这四个哈希值指向第二计数型布隆选择器CBF2维护的整数 数组中的四个位置,将这四个位置的整数都减1,即实现将当前磁盘逻辑地址Addrn从第二计数型布隆选择器CBF2中删除;将当前磁盘逻辑地址Addrn添加到第一计数型布隆选择器CBF1中时,将当前磁盘逻辑地址Addrn代入到四个哈希函数Ii1 (X),h2 (X),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四个 29 位的哈希值,这四个哈希值指向第一计数型布隆选择器CBF1维护的整数数组中的四个位置,将这四个位置的整数都加1,即实现将当前磁盘逻辑地址Addr1J^加到第一计数型布隆选择器CBF1中。本实施例中,在第一计数型布隆选择器CBF1维护的整数数组中,每个元素仅占2位,能表示的最大整数为3。如果某一位置的整数为3,不能将它加I。
16)判断当前磁盘逻辑地址Addrn是否在第一计数型布隆选择器CBF1中,如果在第一计数型布隆选择器CBF1中则将当前磁盘逻辑地址从第一计数型布隆选择器CBF1中删除,跳转执行步骤18)。
本实施例中,无论当前磁盘逻辑地址Addrn是否记录在第一计数型布隆选择器CBF1中,都将当前磁盘逻辑地址Addrn对应的数据从SSD上替换出来,将该数据占据的空间添加到SSD的空闲存储空间中。当前磁盘逻辑地址Addrn不出现在第二计数型布隆选择器CBF2中,说明当前磁盘逻辑地址Addrn是不频繁访问的逻辑地址,应该尽快替换出缓存。
同时,本步骤中对η值递增I,使得当前磁盘逻辑地址Addrn切换到4ΚΒ/Ν个磁盘逻辑地址中的下一个磁盘逻辑地址。
本实施例中,判断当前磁盘逻辑地址Addrn是否在第一计数型布隆选择器CBF1中与步骤3)相似,本实施例将当前磁盘逻辑地址AddrnR入到第一计数型布隆选择器CBF1的四个哈希函数 Ii1 (X),h2 (X),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四个29位的哈希值,这四个哈希值指向第一计数型布隆选择器CBF1护的内存中整数数组中的四个位置,如果这四个位置对应的整数都大于0,说明当前磁盘逻辑地址Addrn在第一计数型布隆选择器CBF1中;将当前磁盘逻辑地址从第一计数型布隆选择器CBF1中删除与步骤15)中将当前磁盘逻辑地址Addrn从第二计数型布隆选择器CBF2中删除相似:将当前磁盘逻辑地址Addrn代入到第一计数型布隆选择器CBF1维系的四个哈希函数Ii1 (x),h2 (x),h3 (X),h4 (X)中,得至Ij Ii1 (Addr),h2 (Addr),h3 (Addr),h4 (Addr)四个 29 位的哈希值,这四个哈希值指向第一计数型布隆选择器CBF1维护的整数数组中的四个位置,将这四个位置的整数都减1,即实现将当前磁盘逻辑地址Addrn从第一计数型布隆选择器CBF1中删除。
17)将当前磁盘逻辑地址Addrn写入到待写入磁盘逻辑地址缓冲区,使得当前磁盘逻辑地址Addrn对应的数据继续保留在SSD上,跳转执行步骤18)。
因为当前磁盘逻辑地址Addrn出现在第二计数型布隆选择器CBF2中,说明当前磁盘逻辑地址AddrnS频繁访问的逻辑地址,不用替换出缓存,将它重新写到待写入磁盘逻辑地址缓冲区中,使它对应的数据在缓存中驻留更长的时间,从而当前磁盘逻辑地址Addrn再次获得驻留在SSD中的机会。
同时,本步骤中对η值递增I,使得当前磁盘逻辑地址Addrn切换到4ΚΒ/Ν个磁盘逻辑地址中的下一个磁盘逻辑地址。
18)判断待替换磁盘逻辑地址缓冲区的所有磁盘逻辑地址是否已经全部处理完毕(即判断待替换磁盘逻辑地址缓冲区是否空),如果尚未处理完毕则获取下一个磁盘逻辑地址作为当前磁盘逻辑地址,跳转执行步骤14);如果已经处理完毕则跳转执行步骤19)。
本实施例中,具体为将η值与4ΚΒ/Ν进行比较,若η值大于4ΚΒ/Ν,说明这一批次从FIFO队列尾部取出的4KB/N个磁盘逻辑地址处理完毕,跳转执行步骤19)。若η值小于等于4ΚΒ/Ν,跳转执行步骤14)对4ΚΒ/Ν个磁盘逻辑地址中的下一个磁盘逻辑地址进行处理。
19)检查SSD的空闲存储空间占SSD总容量的比例c是否大于第二预设阈值β,第二预设阈值β比第一预设阈值α大,若SSD的空闲存储空间占SSD总容量的比例c大于第二预设阈值β,则等待在新的读写请求到来时跳转执行步骤2);否则跳转执行步骤12)。
本实施例中,第二预设阈值β为10%,即当SSD的空闲空间超过总容量的90%时,停止缓存替换。通过第二预设阈值β的设置,使得每一轮缓存替换都会将SSD空闲出5%的存储空间,能够尽量避免对SSD的读写操作,又能够确保SSD有足够的缓存空间可用。
综上所述,本实施例针对基于SSD的缓存容量较大的问题,将上层应用读写请求的逻辑地址组织成FIFO (First In First Out,先进先出)队列,并用两个计数型布隆选择器(Counting Bloom Filter, CBF)结构分类记录FIFO队列中的逻辑地址。其中,第一个CBF记录FIFO队列中只访问过一次的逻辑地址,第二个CBF记录FIFO队列中被多次访问的逻辑地址。缓存替换时优先将第一个CBF中逻辑地址对应的数据替换出缓存。FIFO队列和两个CBF能够准确地模拟LRU队列的行为。FIFO队列保存在SSD上,不占用内存空间。两个CBF保存在内存中,但占用内存空间很小。所以,本实施例以很低的内存开销为前提实现了 LRU队列的功能,LRU缓存替换策略实现方法,充分利用了 SSD的高读写性能的优点,具有实现简单、操作快捷、存储占用空间低、内存开销低的优点。
以上所述仅是本发明的优选实施方式,本发明的保护范围并不仅局限于上述实施例,凡属于本发明思路下的技术方案均属于本发明的保护范围。应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明原理前提下的若干改进和润饰,这些改进和润饰也应视为本发明的保护范围。
权利要求
1.一种基于SSD的大容量缓存中的LRU策略实现方法,其特征在于实施步骤如下: 1)在SSD上分配一块连续的地址空间初始化FIFO队列;在内存中建立用于记录只访问过一次的磁盘逻辑地址的第一计数型布隆选择器和用于记录访问过两次以上的磁盘逻辑地址的第二计数型布隆选择器的数据结构,在内存中分别申请两块地址空间作为待写入磁盘逻辑地址缓冲区和待替换磁盘逻辑地址缓冲区,跳转执行下一步; 2)接收操作系统对磁盘逻辑地址的读写请求,跳转执行下一步; 3)检查读写请求的磁盘逻辑地址是否记录在第二计数型布隆选择器中,若在第二计数型布隆选择器中存在,等待在新的读写请求到来时跳转执行步骤2);否则跳转执行步骤4); 4)检查读写请求的磁盘逻辑地址是否记录在第一计数型布隆选择器中,若在第一计数型布隆选择器中存 在,跳转执行步骤5);否则,跳转执行步骤6); 5)将读写请求的磁盘逻辑地址从第一计数型布隆选择器中删除,同时将读写请求的磁盘逻辑地址添加到第二计数型布隆选择器中,等待在新的读写请求到来时跳转执行步骤2); 6)判定第一计数型布隆选择器和第二计数型布隆选择器的数据结构中均不包含读写请求的磁盘逻辑地址,将读写请求的磁盘逻辑地址添加至第一计数型布隆选择器中,跳转执行下一步; 7)将读写请求的磁盘逻辑地址写到待写入磁盘逻辑地址缓冲区,跳转执行下一步; 8)检查待写入磁盘逻辑地址缓冲区是否写满,若未写满则跳转执行步骤10),否则跳转执行步骤9); 9)将待写入磁盘逻辑地址缓冲区中的磁盘逻辑地址刷新到SSD中FIFO队列的尾部,同时将FIFO队列的尾部指针递增,跳转执行下一步; 10)判定读写请求的请求类型,如果请求类型为写请求,则直接将待写入的用户数据写至IJ SSD上;如果请求类型为读请求,由于没有在SSD上命中,先从底层存储系统读出数据,将数据返回给上层应用的同时,将数据写到SSD上;跳转执行下一步; 11)检查SSD的空闲存储空间占SSD总容量的比例是否小于第一预设阈值,若SSD的空闲存储空间占SSD总容量的比例小于第一预设阈值则跳转执行步骤12),否则跳转执行步骤2)等待新的读写请求到来; 12)读取FIFO队列的头部到待替换磁盘逻辑地址缓冲区,跳转执行下一步; 13)取出所述待替换磁盘逻辑地址缓冲区的首个磁盘逻辑地址作为当前磁盘逻辑地址,跳转执行下一步; 14)判断当前磁盘逻辑地址是否在第二计数型布隆选择器中,如果在第二计数型布隆选择器中则跳转执行步骤15);否则跳转执行步骤16); 15)将当前磁盘逻辑地址从第二计数型布隆选择器中删除,同时将当前磁盘逻辑地址添加到第一计数型布隆选择器中,跳转执行步骤17); 16)判断当前磁盘逻辑地址是否在第一计数型布隆选择器中,如果在第一计数型布隆选择器中则将当前磁盘逻辑地址从第一计数型布隆选择器中删除,跳转执行步骤18); 17)将当前磁盘逻辑地址写入到待写入磁盘逻辑地址缓冲区,使得当前磁盘逻辑地址对应的数据继续保留在SSD上,跳转执行步骤18);18)判断所述待替换磁盘逻辑地址缓冲区的所有磁盘逻辑地址是否已经全部处理完毕,如果尚未处理完毕则获取下一个磁盘逻辑地址作为当前磁盘逻辑地址,跳转执行步骤14);如果已经处理完毕则跳转执行步骤19); 19)检查SSD的空闲存储空间占SSD总容量的比例是否大于第二预设阈值,所述第二预设阈值比第一预设阈值大,若SSD的空闲存储空间占SSD总容量的比例大于第二预设阈值,则等待在新的读写请求到来时跳转执行步骤2);否则跳转执行步骤12)。
2.根据权利要求1所述的基于SSD的大容量缓存中的LRU策略实现方法,其特征在于:所述步骤I)中在内存中建立的第一计数型布隆选择器和第二计数型布隆选择器的数据结构均包含一个整数数组,所述第一计数型布隆选择器和第二计数型布隆选择器均对应设有多个哈希函数;在将磁盘逻辑地址添加到第一计数型布隆选择器或第二计数型布隆选择器中时,将磁盘逻辑地址代入到所述多个哈希函数中得到多个哈希值,将所述哈希值分别对应指向整数数组中各个位置的整数都加I ;在将磁盘逻辑地址从第一计数型布隆选择器或第二计数型布隆选择器中删除时,将磁盘逻辑地址代入到所述多个哈希函数中得到多个哈希值,将所述哈希值分别对应指向整数数组中各个位置的整数都减I ;在查询磁盘逻辑地址是否在第一计数型布隆选择器或第二计数型布隆选择器中时,将磁盘逻辑地址代入到所述多个哈希函数中得到多个哈希值,检查所述哈希值分别对应指向整数数组中各个位置的整数是否都大于O,如果都大于O则说明在第一计数型布隆选择器或第二计数型布隆选择器中。
3.根据权利要求2所述的基于SSD的大容量缓存中的LRU策略实现方法,其特征在于:所述步骤I)中在内存中分别申请两块地址空间作为待写入磁盘逻辑地址缓冲区和待替换磁盘逻辑地址缓冲区时,待写入磁盘逻辑地址缓冲区和待替换磁盘逻辑地址缓冲区的地址空间大小均为4KB。
4.根据权利要求1或2或3所述的基于SSD的大容量缓存中的LRU策略实现方法,其特征在于:所述第一预设阈值为5%。
5.根据权利要求4所述的基于SSD的大容量缓存中的LRU策略实现方法,其特征在于:所述第二预设阈 值为10%。
全文摘要
本发明公开了一种基于SSD的大容量缓存中的LRU策略实现方法,该方法将上层应用读写请求的逻辑地址组织成FIFO队列,两个计数型布隆选择器分别用于记录FIFO队列中只访问过一次和访问过多次的逻辑地址,FIFO队列和两个计数型布隆选择器能够准确地模拟LRU队列的行为。FIFO队列保存在SSD上,不占用内存空间。两个计数型布隆选择器保存在内存中,但占用内存空间很小。本发明以很低的内存开销实现了LRU队列的功能,具有实现简单、操作快捷、存储占用空间低、内存开销低的优点。
文档编号G06F5/16GK103150136SQ20131009730
公开日2013年6月12日 申请日期2013年3月25日 优先权日2013年3月25日
发明者肖侬, 卢宇彤, 陈志广, 周恩强, 刘芳, 所光, 谢旻, 董勇, 张伟 申请人:中国人民解放军国防科学技术大学
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1