一种缓存数据的方法及装置与流程

文档序号:14175270阅读:166来源:国知局
一种缓存数据的方法及装置与流程

本发明涉及计算机技术领域,具体的说是一种缓存数据的方法及装置。



背景技术:

在计算机技术中,缓存的使用比较广泛,cpu和内存之间、存储软件中都有使用。数据缓存是决定设备运行能力的重要决定因素,它不仅直接反应了设备的性能,而且决定着对硬件的选择范围。

目前,几款常见的用于linux系统中的缓存软件的数据调度方法,基本上都未对上层下发的io数据块做过多的处理,直接利用接收到的io数据块访问缓存盘或后端机械盘,只是在数据访问的优先级、访问通道等环节进行了优化,对于较大的io数据块而言,将io数据块作为整体进行访问的方式,在缓存命中率以及缓存访问速度上不能满足客户的需求。



技术实现要素:

为了解决上述问题,提供了一种缓存数据的方法及装置,对上层下发的io数据块先做拆分处理,拆分成更小的数据块,再访问缓存盘或磁盘,以此方式提高io请求的缓存命中率,提升缓存访问速度。

本发明实施例提供了一种缓存数据的方法,所述的方法包括:

s1:接收上层下发的io数据块,并将io数据块拆分成若干小数据块;

s2:将拆分后的若干小数据块依次访问缓存盘;

s3:访问完成后,将拆分后的若干小数据块封装成io数据块,并通过回调函数提交给上层接口。

进一步的,步骤s1的具体实现过程为:

s11:系统接收到io访问请求后,将io数据块拆分成若干小数据块;

s12:为每一个小数据块建立链表管理。

进一步的,步骤s12的具体实现过程为:

s121:创建每一个小数据块的结构体,每一个机构体均包含链表、卷编号、逻辑块地址和扇区数量;

s122:获取io请求的起始逻辑块地址;

s123:以io请求的起始逻辑块地址为边界选取第一个小数据块,并记录其卷编号、逻辑块地址和扇区数量三种信息;

s124:通过上一个小数据块的逻辑块地址和扇区数量,计算出下一个小数据块的起始扇区地址,并在io中以新计算出的逻辑块地址开始截取新的小数据块;

s125:将步骤s124中获取的信息记录到该小数据块对应的链表中;

s126:重复步骤s124-s125,直至所有的小数据块建立链表管理信息。

进一步的,步骤s123的具体实现过程为:

计算io的起始逻辑块地址和缓存分区的扇区边界是否对齐;

若边界对齐,则从io的起始扇区开始截取一个小数据块作为第一个小数据块,并记录其卷编号、逻辑块地址和扇区数量三种信息;

若边界不对齐,截取io起始逻辑块地址到与缓存扇区对齐地址之间的这段数据作为第一个小数据块,并记录其卷编号、逻辑块地址和扇区数量三种信息。

进一步的,如果小数据块为读数据,则步骤s2的具体实现过程为:

通过小数据块的扇区逻辑块地址计算ssd盘数据分区编号,并查询是否命中;

若命中,则把将硬盘的扇区号转换为ssd的扇区号,然后将此小数据块向ssd提交,进行读取;

若未命中,则向硬盘驱动提交小数据块,从硬盘读数据,读取完成后,由回调函数启动回写ssd操作,将小数据块的扇区号转换为ssd的扇区号,然后向ssd驱动程序提交,将硬盘读取的数据写入ssd。

进一步的,如果小数据块为写数据,则步骤s2的具体实现过程为:

通过小数据块的扇区逻辑块地址计算ssd盘数据分区编号,并查询是否命中;

若命中,则把小数据块提交到ssd盘,ssd盘在脏数据达到阈值时自动下刷数据;

若未命中,则直接把数据提交到后端hdd盘。

本发明实施例还提供了一种缓存数据的装置,所述的装置包括:

数据拆分模块,用于将io数据块差分成若干小数据块;

数据访问模块,用于实现若干小数据块对于缓存盘的读或写访问;

数据封装模块,用于将若干小数据块分装成一个完整的io数据块。

发明内容中提供的效果仅仅是实施例的效果,而不是发明所有的全部效果,上述技术方案中的一个技术方案具有如下优点或有益效果:

1、在生成io请求提交到缓存盘之前对其进行拆分,在保证数据块信息不丢失的情况下,可以有效缩小数据块的大小,提高缓存加速的性能。

2、使用链表对拆分后的小数据块进行管理,可以保证拆分后数据块的唯一性,并增减拆分后数据块的逻辑性和关联性,在处理大块io读写请求时能有效的提高数据的缓存命中率。

3、对于读、写数据采用不同的缓存策略,可以进一步提升缓存速度,减少读、写数据的缓存响应时间。

附图说明

图1是本发明方法流程图;

图2是本发明装置的原理框图。

具体实施方式

为能清楚说明本方案的技术特点,下面通过具体实施方式,并结合其附图,对本发明进行详细阐述。下文的公开提供了许多不同的实施例或例子用来实现本发明的不同结构。为了简化本发明的公开,下文中对特定例子的部件和设置进行描述。此外,本发明可以在不同例子中重复参考数字和/或字母。这种重复是为了简化和清楚的目的,其本身不指示所讨论各种实施例和/或设置之间的关系。应当注意,在附图中所图示的部件不一定按比例绘制。本发明省略了对公知组件和处理技术及工艺的描述以避免不必要地限制本发明。

如图1所示的一种缓存数据的方法,所述的方法包括以下步骤:

s1:接收上层下发的io数据块(bio),并将io数据块(bio)拆分成若干小数据块(pio),具体实现过程为:

s11:当有io访问请求时,对io数据块进行拆分,一般拆分成4k大小的数据块(pio)。

s12:使用链表对新拆分的数据块进行管理,具体实现过程为:

s121:创建pio结构体,结构体中主要包含链表(listnode)、卷编号(lun)、逻辑块地址(lba)、扇区数量(count)等属性。链表使用单链表即可满足要求。

s122:获取io请求的起始逻辑块地址。

s123:以io请求的起始逻辑块地址为边界选取第一个小数据块,并记录其卷编号、逻辑块地址和扇区数量三种信息。此处要计算io的起始lba和缓存分区的扇区边界是否对齐,若边界对齐,则从io的起始扇区开始截取一个小数据块作为第一个小数据块,并记录其卷编号、逻辑块地址和扇区数量三种信息;若边界不对齐,截取io起始逻辑块地址到与缓存扇区对齐地址之间的这段数据作为第一个小数据块,并记录其卷编号、逻辑块地址和扇区数量三种信息。

s124:通过上一个小数据块的逻辑块地址和扇区数量,计算出下一个小数据块的起始扇区地址,并在io中以新计算出的逻辑块地址开始截取新的小数据块。

s125:将步骤s124中获取的信息记录到该小数据块对应的链表中。

s126:重复步骤s124-s125,直至所有的小数据块建立链表管理信息。

s2:将拆分后的若干小数据块依次访问缓存盘。

如果小数据块为读数据,则步骤s2的具体实现过程为:

通过小数据块的扇区逻辑块地址计算ssd盘数据分区编号,并查询是否命中;若命中,则把将硬盘的扇区号转换为ssd的扇区号,然后将此小数据块向ssd提交,进行读取;若未命中,则向硬盘驱动提交小数据块,从硬盘读数据,读取完成后,由回调函数启动回写ssd操作,将小数据块的扇区号转换为ssd的扇区号,然后向ssd驱动程序提交,将硬盘读取的数据写入ssd。

如果小数据块为写数据,则步骤s2的具体实现过程为:

通过小数据块的扇区逻辑块地址计算ssd盘数据分区编号,并查询是否命中;若命中,则把小数据块提交到ssd盘,ssd盘在脏数据达到阈值时自动下刷数据;若未命中,则直接把数据提交到后端hdd盘。

s3:访问完成后,将拆分后的若干小数据块封装成io数据块,并通过回调函数提交给上层接口。

对于io请求的起始lba,一般情况下不会与缓存盘的扇区地址对齐。也就是说拆分后生成的pio链中第一个和最后一个pio的数据块小于4kb。比对齐的情况下,对于起始pio和最后一个pio的处理如下:

1)对于读io请求,直接提交到后端hdd盘,读取完成后不同步缓存。

2)对于写io请求,在提交到后端hdd盘之前,需要先把pio补全到4k大小,获取数据后同步缓存,否则会破坏数据一致性。

如图2所示,本发明实施例还提供了一种缓存数据的装置,所述的装置包括数据拆分模块、数据访问模块和数据封装模块。

数据拆分模块,接收上层下发的io数据块(bio),并将io数据块(bio)拆分成若干小数据块(pio)。

数据访问模块,用于实现若干小数据块对于缓存盘的读或写访问。

数据封装模块,用于将若干小数据块分装成一个完整的io数据块。

尽管说明书及附图和实施例对本发明创造已进行了详细的说明,但是,本领域技术人员应当理解,仍然可以对本发明创造进行修改或者等同替换;而一切不脱离本发明创造的精神和范围的技术方案及其改进,其均涵盖在本发明创造专利的保护范围当中。

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