一种固态硬盘页级缓存区管理方法
技术领域
本发明属于固态硬盘固件优化设计技术领域,具体涉及一种固态硬盘页级缓存区管理方法。
背景技术
缓存区是现代计算机***组成部分中不可或缺的一部分,在存储***,数据库,网络服务器,文件***以及操作***应用广泛。传统的面向机械硬盘的缓存区管理方法,都是基于底层的存储设备读写操作具有相同时延的假设,因此此类缓存区管理方法都是以最大化命中率为目标,减少对底层硬盘读写操作次数以及磁道寻址时间为目标。但是,固态硬盘的底层存储介质为闪存,闪存具有明显与传统磁介质不一样的特点,因而传统面向机械硬盘的缓存区管理算法在固态盘缓存区设计中难以适用。
固态硬盘底层的NAND闪存有如下局限:1)闪存只提供读、写和擦除3种操作,且这三种操作性能不对称,读最快,写次之,擦除最慢;2)闪存是按页(page)、块(block)、平面(plane)的结构进行组织;页是读/写的最小单位,一般为2/4/8KB;块是擦除的最小单位,一个块一般包含64/128个页;3)闪存擦除后只能写一次,即所谓的erase-before-write,这造成闪存不支持原地更新;4)闪存每个存储单元的编程/擦除(P/E)次数有限,超过该P/E次数后,闪存存储数据不再可靠。
目前现有的面向固态盘的缓存区设计主要针对闪存读写代价的不对称性,优先置换干净页,延迟缓存区中脏页的回写,从而减少对底层闪存的写操作次数,实现较快的请求响应时间和较少的块擦除次数。同时现有的算法大部分都是在LRU(Least Recently Used)的基础上进行改进,并没有解决LRU算法在处理一次性扫描污染的缺陷。
缓存区管理方法根据其管理粒度可以分为页级缓存区管理方法和块级缓存区管理方法。页级缓存区管理方法因为操作粒度为页级,相对块级方法能够更精确地区分每个页的访问特性,所以其具有更高的命中率和更少的回写次数。本发明也是公布了一种固态硬盘页级缓存区管理方法。
经典固态盘的页级缓存区管理方法以CFLRU(Clean First LRU)算法为代表。CFLRU缓存读请求和写请求,在缓存区满需要进行剔除操作时,优先置换干净页,脏页被留在缓存区中减少置换代价。AD-LRU是一种基于CFLRU的改进页级缓存区管理算法,它采用二次机剔除策略对缓存区中的数据页进行热冷区分,同时将缓存区划分为冷数据页队列和热数据页队列来缓存相应的数据页。AD-LRU通过设置最小冷数据页队列长度,实现冷热数据页队列动态调整。但是,CFLRU及其最新的改进算法都忽略了访问负载动态的读写变化特性。例如,无条件地优先置换干净页并不适用于以读特性为主的负载。同时CFLRU及其改进算法都没有充分利用数据访问的局部特性,因此没有实现有效的热数据页识别。
发明内容
针对上述现有技术中存在的不足,本发明公布一种固态硬盘页级缓存区管理方法,不仅能有效识别数据请求中的热数据页,而且能依据负载访问特性自适应地选择数据页进行置换。
为实现本发明的目的,本发明采用以下技术方案:
一种固态硬盘页级缓存区管理方法,所述固态硬盘缓存区划分为哈希索引表缓存区,脏页缓存区和干净页缓存区三个部分,所述固态硬盘缓存区的管理粒度为页级。所述哈希索引表缓存区用于记录更多数据页的访问特性,所述脏页缓存区用于缓存热的修改过的数据页(脏页),所述干净页缓存区用于缓存仅被读过的热的数据页(干净页)。
所述管理方法包括如下步骤:
S1,当访问请求到来时,查看请求数据页是否在脏页或干净页缓存区命中;若命中,执行S2,否则,执行S3;
S2,将命中数据页迁移到相应队列的MRU位置,并响应上层请求;然后更新目标干净页队列长度;最后执行S8;
S3,利用哈希索引表对当前请求进行热数据识别;若识别为热数据页,则执行S4,若识别为冷数据页,则执行S5;
S4,判定当前缓存区是否满;若满,执行S6,否则,执行S7;
S5,交由底层闪存转换层响应该访问请求;然后执行S8;
S6,比较当前干净页列队长度与目标干净页列队长度的大小;若大于,剔除干净页队列的LRU位置的数据页,否则,剔除脏页队列的LRU位置的数据页;然后更新剔除页在哈希索引表中记录的信息;最后执行S7;
S7,将缺失的数据页加载进相应的缓存队列,并响应上层请求;然后执行S8;
S8,更新该请求对应数据页在哈希索引表中记录的信息;然后将当前的***操作时间t_sys加1,并对t_sys进行模T(T为预设的半衰期)运算,若余数为0,执行S9;否则,结束本次请求的处理;
S9,判断***操作时间t_sys与哈希索引表中记录的每个数据页的最后更新时间t_update的差是否超过T;若超过,则将该数据页在哈希表中记录的访问次数除2取整。
进一步地,所述步骤S6和S8中,所述更新数据页在哈希索引表中记录的信息的具体方法是:
所述数据页在哈希索引表记录的信息包括访问次数count、最后访问时间t_update及数据页在缓存区的状态Buf_State。
所述的更新方法为,每次更新时,访问次数加1,即count=count+1;最后访问时间更新为当前***操作时间t_sys,即t_update=t_sys;当数据页在缓存区时,Buf_State=1,否则Buf_State=0。
进一步地,所述步骤S2中,所述将命中数据页迁移到相应队列的MRU位置的具体方法是:
所述脏页缓存区采用LRU原则管理队列,当请求的数据页在脏页缓存区命中请求时,将命中的数据页移动到脏页队列的MRU位置。
所述干净页缓存区采用LRU原则管理队列,当该缓存区命中读请求时,将命中的数据页移动到干净页队列的MRU位置;当命中写请求时,将命中的数据页移动到脏页队列的MRU位置。
进一步地,所述步骤S2中,所述更新目标干净页队列长度Tau的计算公式为:
上述公式中,Tau’为更新前的目标干净页队列长度,Tau的初始值设为缓存区实际能存储的队列长度的一半;CL、DL为当前干净页、脏页队列的实际长度;Cr、Cw是归一化的闪存读、写代价,具体如下:
ReadDelay和WriteDelay为实际的闪存读、写延迟。
进一步地,所述步骤S3中,所述的利用哈希索引表对当前请求进行热数据识别的流程如下:
S31,查询该请求数据页对应哈希表是否记录了有效信息,若不存在则执行步骤S32,反之则执行步骤S33;
S32,该请求判定为初次访问的数据,若为写请求则判定为热数据页,若为读请求则判定为冷数据页,然后结束冷热判断;
S33,读取该数据页对应的哈希表项中记录的访问次数count,最后访问时间t_update,***操作时间t_sys,利用下面公式计算该数据页的访问热度Hp;
S34,将访问热度值Hp与预设的热度阈值H_th1进行比较,若Hp>H_th1,则判定该请求为热数据页,并结束冷热判断;反之,执行步骤S35;
S35,读取该数据页逻辑地址页前后K个数据页的哈希表项的记录信息,统计K个数据页在哈希表中的数量N,以及这N个数据页在缓存区的状态bufState为1的项数为M;比较M/N与预设阈值H_th2,若M/N>H_th2,则判定该数据页为热,反之判定为冷;然后结束冷热判断。
本发明与现有技术相比,有益效果是:
本发明提出的固态硬盘页级缓存区管理方法通过将缓存区进行分区,然后采用高效的热数据识别机制识别冷热数据页,高效的随负载特性变化的干净缓存区队列长度自适应调整机制,自适应数据页剔除机制,使得该管理方法在多种负载测试条件下都能得到较高的缓存命中率和提升固态硬盘的读写性能。在多种读写特性不同的负载测试环境下,本发明公布的方法读写命中率都优于CFLRU及改进算法AD-LRU等,具有良好的实用性和市场前景。
附图说明
为了更清楚地说明本发明实施例或现有技术的技术方案,下面将对实施例或现有技术描述所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1:本发明的哈希索引表结构示意图。
图2:本发明的干净页和脏页缓存队列结构示意图。
图3:本发明的热数据识别机制。
图4:本发明的自适应置换机制。
图5:本发明的管理方法的实施流程图。
图6:本发明的具体实施例图
具体实施方式
为了使本领域技术人员更好地理解本发明的技术方案,下面将结合附图以及具体的实施方式,对本发明进行详细地介绍说明。
本发明提出的固态硬盘页级缓存区管理方法,将缓存区划分为三个部分:哈希索引表缓存区(Hash-List),脏页缓存区(Dirty-List)和干净页缓存区(Clean-List)。
Hash-List用于记录不同数据页访问的历史特性。每个数据页的哈希索引值X由其对应的逻辑页地址(Logical Page Address Number,LPN)代入给定的哈希函数计算得到。利用该索引值X实现对哈希索引表的查询,更新和重置。如图1所示,本发明所述Hash-List具体包括数据页的访问次数count,最后访问时间t_update,以及该数据页在缓存区中的状态Buf_State。
Dirty-List用于缓存热的修改过的数据页(脏页),该缓存区的数据页按照LRU原则进行队列管理。Clean-List用来缓存仅被读过的热的数据页(干净页),该缓存区同样利用LRU队列管理数据页,但发生更新的数据页将被移入脏页缓存区。脏页缓存区和干净页缓存区的队列结构如图2所示,两者缓存队列的大小会受自适应置换机制的控制动态调整。
本发明提出的管理方法中所述的热数据识别机制如图3所示,读取待判断数据页对应哈希表中的记录,对其进行初步的冷热判断;再通过读取该数据页前后K个数据页的哈希表项的记录信息,结合这些相邻数据页的状态对该数据页识别的结果进行纠正,提高识别精度,只有识别为热的请求数据页才能进入缓存区。其数据识别流程如下:
S31,查询该请求数据页对应哈希表是否记录了有效信息,若不存在则执行步骤S32,反之则执行步骤S33;
S32,该请求判定为初次访问的数据,若为写请求则判定为热数据页,若为读请求则判定为冷数据页,然后结束冷热判断;
S33,读取该数据页对应的哈希表项中记录的访问次数count,最后访问时间t_update,***操作时间t_sys,利用下面公式计算该数据页的访问热度Hp;
S34,将访问热度值Hp与预设的热度阈值H_th1进行比较,若Hp>H_th1,则判定该请求为热数据页,并结束冷热判断;反之,执行步骤S35;
S35,读取该数据页逻辑地址页前后K个数据页的哈希表项的记录信息,统计K个数据页在哈希表中的数量N,以及这N个数据页在缓存区的状态buf_State为1的项数为M;比较M/N与预设阈值H_th2,若M/N>H_th2,则判定该数据页为热,反之判定为冷;然后结束冷热判断。
本发明提出的管理方法中所述的自适应选择剔除机制如图4所示,该机制包含两种处理流程,一个为阈值Tau(目标干净页队列长度)更新流程,一个为选择剔除流程。
在阈值Tau更新流程中,所述更新目标干净页队列长度Tau的计算公式为:
上述公式中,Tau’为更新前的目标干净页队列长度,Tau的初始值设为缓存区实际能存储的队列长度的一半;CL、DL为当前干净页、脏页队列的实际长度;Cr、Cw是归一化的闪存读、写代价,具体如下:
ReadDelay和WriteDelay为实际的闪存读、写延迟。
在剔除流程中,缓冲区通过比较当前干净页队列长度CL和当前目标干净页长度Tau选择合适的剔除对象。若CL>Tau,则选择干净页缓存队列LRU位置的数据页进行剔除,反之选择脏页缓存队列LRU位置的数据页进行剔除。
本发明的提出的管理方法的实施流程图如图5所示,包含如下步骤:
S1,当访问请求到来时,查看请求数据页是否在脏页缓存区或干净页缓存区命中,若是,则执行S2,若否,则执行S3。具体来说,当一个访问请求到达需要处理的时候,需要遍历脏页和干净页缓存队列,查看请求数据页是否在缓冲区中。
S2,响应请求进行相应的数据页命中迁移,并根据命中数据页所在的缓存队列位置和请求类型,启动自适应阈值调整机制,更新目标干净页队列长度Tau;然后将当前的请求逻辑页地址代入哈希函数计算得到哈希索引值,更新该哈希索引值对应表项中记录的信息,包括:更新对应表项中记录的Count=Count+1,最后访问时间更新为当前***操作时间t_sys,即t_update=t_sys,Buf_State=1,之后执行S8。
S3,启动热数据识别机制,查询请求数据页对应的哈希索引表中的信息,对访问的数据页进行冷热识别;若识别为热数据页,则执行S4,若识别为冷数据页,则执行S5。
S4,判定当前缓冲区是否满,若满,则执行S6,若否,则执行S7。
S5,将请求直接交由底层闪存进行响应处理,将当前的请求逻辑页地址代入哈希函数计算得到哈希索引值,更新该哈希索引值对应表中记录位的信息,之后跳转执行S8。
S6,启动自适应选择剔除机制,比较当前干净页队列长度CL与目标干净页队列长度Tau的大小,选择相应缓存队列LRU位置的数据页进行剔除,同时将剔除的请求逻辑页地址代入哈希函数计算得到哈希索引值,初始化对应表项中记录信息;之后跳转执行S7。
S7,将缺失的数据页加载入缓冲区相应的缓存队列并响应请求,同时将当前的请求逻辑页地址代入哈希函数计算得到哈希索引值,更新对应表项中记录的Count=1,最后访问时间更新为当前***操作时间t_sys,即t_update=t_sys,Buf_State=1,之后执行S8。
S8,将当前的***操作时间t_sys加1,并对t_sys进行模T(T为预设的半衰期)运算,若余数不为0,则执行S9,否则,结束本次请求的处理。
S9,判断***操作时间t_sys与哈希索引表中记录的每个数据页的最后更新时间t_update的差是否超过T,若超过,若超过,则将该数据页在哈希表中记录的访问次数除2取整,之后结束本次请求的处理。
为了进一步对上述实施流程进行说明,本发明结合一个实际写请求处理流程进行说明,该流程如图6所示:
S10,当一个写请求(请求访问数据,LPN=10)到来时,遍历缓冲区后未匹配到请求的数据页,则执行S11;
S11,通过对请求逻辑地址进行哈希计算,找到请求页对应的哈希表,计算其热度值
(当前的***时间为9,热度阈值H_th1=0.5),则初步判断请求为冷,执行S12;
S12,遍历该请求页(LPN=10)前后K(K=4)个相邻地址数据页(LPN=8,9,11,12)的状态,发现存在有效哈希表的记录个数M=4,在缓冲区的项数N=4,
(热度阈值H_th2=0.5),纠正该数据页判断为热,执行S13;
S13,此时缓冲区满(Buf_Size=9,Tau=5),根据比较干净页缓存队列和目标队列的大小,选择脏页LRU位置的(LPN=9)的数据页剔除,执行S14;
S14,将数据页(LPN=9)剔除时,更新其哈希表对应的信息,将其Buf_State置为0,执行S15;
S15,根据请求类型,将请求的数据页(LPN=10)加入到脏页缓存队列的MRU位置,执行S16;
S16,更新请求页对应的哈希表中的信息,将Buf_State置为1,t_update更新为当前***时间,访问次数Count加1。单次请求处理结束。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。