缓存写入的方法、缓存装置和存储系统的制作方法

文档序号:6510458阅读:133来源:国知局
缓存写入的方法、缓存装置和存储系统的制作方法
【专利摘要】本发明实施例提供了一种缓存写入的方法、缓存装置和存储系统,该方法包括:更新内存中的至少一个元数据;获取所述至少一个元数据所属的至少一个元数据组;如果所述至少一个元数据组内的第一元数据组的写状态为非写入状态且所述第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令,则将所述多个写入IO请求命令移动到所述第一元数据组的合并写入元数据队列;将所述第一元数据组的元数据写入到所述Flash中所述第一元数据组所对应的元数据块中;对所述第一元数据组的合并写入元数据队列下的多个写入IO请求命令返回所述第一元数据组写入是否成功的状态。本发明实施例的方法、装置和系统能够一定程度上减少对Flash的元数据写入次数。
【专利说明】缓存写入的方法、缓存装置和存储系统
【技术领域】
[0001]本发明实施例涉及数据存储领域,并且更具体地,涉及一种缓存写入的方法、缓存装置和存储系统。
【背景技术】
[0002]现今业界采用现有技术的,由于缓存(Cache)的存储介质是基于NVRAM或者NVDIMM,这些存储介质特性可以很好的满足系统的小IO的性能,特别是针对元数据。
[0003]通常一个元数据的大小一般是30B-64B之间。当Cache的存储介质采用Flash时,由于要保证数据的安全性,每一次写请求都需要2次的10。而Flash的寿命跟写的次数直接相关,如果每个元数据按照元数据的大小直接10,则不能充分发挥Flash的性能,如果元数据按照4K对齐的大小下10,则可能存在写放大的问题,对整个Flash的寿命会大大的影响。

【发明内容】

[0004]本发明实施例提供一种缓存写入的方法、缓存装置和存储系统,能够一定程度上减少对Flash的元数据写入次数,提高Flash的使用寿命。
[0005]第一方面,提供了一种缓存Cache写入的方法,该Cache的闪存Flash的存储区域包括多个chunk, —个该chunk包括一个chunk元数据区和一个chunk数据区,该一个chunk元数据区包括至少一个元数据块,该一个chunk数据区包括与该至少一个元数据块对应的至少一个数据区,该元数据块包括多个元数据,该数据区包括多个数据块,该元数据块与该
数据区--对应,该元数据与该数据块--对应,内存中的一个元数据组对应于一个该元
数据块,一个该元数据组包含多个元数据,一个该元数据组内的元数据与该元数据组对应
的元数据块内的元数据--对应,该方法包括:更新内存中的至少一个元数据,该至少一个
元数据对应于该Flash中用于存储写入IO请求命令请求写入的数据的至少一个数据块;获取该至少一个元数据所属的至少一个元数据组;如果该至少一个元数据组内的第一元数据组的写状态为非写入状态且该第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令,则将该多个写入IO请求命令移动到该第一元数据组的合并写入元数据队列;将该第一元数据组的元数据写入到该Flash中该第一元数据组所对应的元数据块中;对该第一元数据组的合并写入元数据队列下的多个写入IO请求命令返回该第一元数据组写入是否成功的状态。
[0006]结合第一方面,在第一种可能的实现方式中,更新内存中的至少一个元数据具体实现为:如果该至少一个元数据之一的状态指示信息指示该至少一个元数据之一为干净Clean状态,则更新该至少一个元数据之一,其中,该Clean状态用于指示该至少一个元数据之一在该Flash对应的元数据与该至少一个元数据之一内容相同。
[0007]结合第一方面或第一方面的第一种可能的实现方式,在第二种可能的实现方式中,具体实现为:一个该元数据块的大小等于该Flash的页面大小。[0008]结合第一方面的第二种可能的实现方式,在第三种可能的实现方式中,具体实现为:一个该元数据的大小为32B、64B或128B。
[0009]结合第一方面的第二种可能的实现方式或第一方面的第三种可能的实现方式,在第四种可能的实现方式中,具体实现为:该chunk元数据区的大小与一个该数据块的大小—致。
[0010]结合第一方面的第二种可能的实现方式或第一方面的第三种可能的实现方式,在第五种可能的实现方式中,具体实现为:一个该数据块的大小为512B、1K、2K、4K、8K、16K、32K 或 64K。
[0011]第二方面,提出了一种缓存装置,该缓存装置的闪存Flash的存储区域包括多个chunk, 一个该chunk包括一个chunk元数据区和一个chunk数据区,该一个chunk元数据区包括至少一个元数据块,该一个chunk数据区包括与该至少一个元数据块对应的至少一个数据区,该元数据块包括多个元数据,该数据区包括多个数据块,该元数据块与该数据区
--对应,该元数据与该数据块--对应,内存中的一个元数据组对应于一个该元数据块,
一个该元数据组包含多个元数据,一个该元数据组内的元数据与该元数据组对应的元数据块内的元数据一一对应,该缓存装置包括:更新单元,用于更新内存中的至少一个元数据,该至少一个元数据对应于该Flash中用于存储写入IO请求命令请求写入的数据的至少一个数据块;获取单元,用于获取该至少一个元数据所属的至少一个元数据块之第一元数据组,一个该元数据组中的元数据对应于该Flash中的一个元数据块中的元数据;队列移动单元,用于如果该至少一个元数据 组内的第一元数据组的写状态为非写入状态且该第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令,则将该多个写入IO请求命令移动到该第一元数据组的合并写入元数据队列;写入单元,用于将该第一元数据组写入到该Flash中该第一元数据组所对应的元数据块;反馈单元,用于对该第一元数据组的合并写入元数据队列下的多个写入IO请求命令返回该第一元数据组写入是否成功的状态。
[0012]结合第二方面,在第一种可能的实现方式中,该更新单元具体实现为:如果该至少一个元数据之一的状态指示信息指示该至少一个元数据之一为干净Clean状态,则更新该至少一个元数据之一,其中,该Clean状态用于指示该至少一个元数据之一在该Flash对应的元数据与该至少一个元数据之一内容相同。
[0013]结合第二方面或第二方面的第一种可能的实现方式,在第二种可能的实现方式中,具体实现为:一个该元数据块的大小等于该Flash的页面大小。
[0014]结合第二方面或第二方面的第一种可能的实现方式或第二方面的第二种可能的实现方式,在第三种可能的实现方式中,具体实现为:该chunk元数据区的大小与一个该数据块的大小一致。
[0015]第三方面,提出了一种存储系统,包括内存、缓存Cache和处理器,该Cache包括闪存Flash,该Flash的存储区域包括多个chunk, —个该chunk包括一个chunk元数据区和一个chunk数据区,该一个chunk元数据区包括至少一个元数据块,该一个chunk数据区包括与该至少一个元数据块对应的至少一个数据区,该元数据块包括多个元数据,该数据区包括多个数据块,该元数据块与该数据区一一对应,该元数据与该数据块一一对应,内存中的一个元数据组对应于一个该元数据块,一个该元数据组包含多个元数据,一个该元数据组内的元数据与该元数据组对应的元数据块内的元数据一一对应,其中,该处理器用于:更新该内存中的至少一个元数据,该至少一个元数据对应于该Flash中用于存储写入IO请求命令请求写入的数据的至少一个数据块;获取该至少一个元数据所属的至少一个元数据块之第一元数据组,一个该元数据组中的元数据对应于该Flash中的一个元数据块中的元数据;如果该至少一个元数据组内的第一元数据组的写状态为非写入状态且该第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令,则将该多个写入IO请求命令移动到该第一元数据组的合并写入元数据队列;将该第一元数据组写入到该Flash中该第一元数据组所对应的元数据块;对该第一元数据组的合并写入元数据队列下的多个写入IO请求命令返回该第一元数据组写入是否成功的状态。
[0016]结合第三方面,在第一种可能的实现方式中,在用于更新该内存中的至少一个元数据,该处理器具体实现为:如果该至少一个元数据之一的状态指示信息指示该至少一个元数据之一为干净Clean状态,则更新该至少一个元数据之一,其中,该Clean状态用于指示该至少一个元数据之一在该Flash对应的元数据与该至少一个元数据之一内容相同。
[0017]结合第三方面或第三方面的第一种可能的实现方式,在第二种可能的实现方式中,具体实现为:一个该元数据块的大小等于该Flash的页面大小。
[0018]结合第三方面或第三方面的第一种可能的实现方式或第三方面的第二种可能的实现方式,在第三种可能的实现方式中,具体实现为:该chunk元数据区的大小与一个该数据块的大小一致。
[0019]基于以上技术方案,本发明实施例的缓存写入的方法、缓存装置和存储系统,通过合并多个写入IO请求命令对同一元数据块的写入操作,可以一定程度上减少Flash的写入次数并一定程度上避免IO写放大的问题,从而能够提高Flash的使用寿命。
【专利附图】

【附图说明】
[0020]为了更清楚地说明本发明实施例的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
[0021]图1是本发明实施例Flash的一种数据布局示意图。
[0022]图2是本发明实施例一种Cache写入的方法流程图。
[0023]图3是本发明实施例Flash的另一种数据布局示意图。
[0024]图4是本发明实施例Flash的再一种数据布局示意图。
[0025]图5是本发明实施例Flash的再一种数据布局示意图。
[0026]图6是本发明实施例元数据在内存中位置和Flash中实际持久化的位置的一种关系不意图。
[0027]图7是本发明实施例缓存装置对元数据合并写入的具体流程图。
[0028]图8是本发明实施例缓存装置800的结构示意图。
[0029]图9是本发明实施例存储系统900的结构示意图。
【具体实施方式】[0030]下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0031]图1是本发明实施例闪存(Flash)的一种数据布局示意图。如图1所示,Flash的存储区域可包括超级块、元数据区和数据区三部分。
[0032]超级块,用于存储缓存(Cache)中的全局数据,主要为了系统宕机后恢复时需要用的数据。其中,该全局数据可包括元数据块的大小、数据块的大小等。
[0033]元数据(metadata),维护存储系统中的数据块的数据,用于描述和组织数据块的关系,其大小根据系统中定义的数据结构大小决定。
[0034]元数据区,指用于存储元数据的区域。
[0035]数据区,用于存储缓存(Cache)中真实的数据,其下可包括多个数据块。
[0036]图3是本发明实施例Flash的另一种数据布局示意图。如图3所示,Flash下包括超级块和多个存储块(chunk),每个chunk包括一个chunk元数据区和一个chunk数据区,每个chunk元数据区包括一个或多个元数据块,每个chunk数据区包括与该一个或多个元数据块对应的数据区。每个chunk数据区下的数据区与其对应的chunk元数据区下的元数据块一一对应。一个元数据块维护一个对应的数据区,具体地,每个元数据区下包括多个元数据,每个元数据对应于数据区下的一个数据块。
[0037]图3中,虽然I个chunk元数据区中包含了 4个元数据块,但并不表示I个chunk元数据区只能包含4个元数据块,还可以是I个、2个或其它数值。同样的,图3所示的chunk的个数,chunk数据区内数据 区的个数、元数据区内元数据的个数、数据区内数据块的个数都不限于图3所示的数值。
[0038]每个数据区对应于一个不同的元数据块,一个元数据块内的元数据所对应的数据块组成一个数据区。也就是说,一个数据区包含一个元数据块大小的元数据所对应的数据,一个数据区的大小由一个元数据块内元数据的个数和一个数据块的大小来决定。
[0039]在Flash中,一次页面写入的大小为4K。因此,一种优选的方案,一个元数据块的大小为4K。不妨假设一个元数据的大小为32B,一个数据块的大小为16K,则一个数据区的大小为 2M (16K* (4K/32B))。
[0040]图2是本发明实施例一种Cache写入的方法流程图。图2的方法由缓存装置执行。其中,缓存装置的Flash的存储区域包括多个chunk, —个该chunk包括一个chunk元数据区和一个chunk数据区,该一个chunk元数据区包括至少一个元数据块,该一个chunk数据区包括与该至少一个元数据块对应的至少一个数据区,该元数据块包括多个元数据,该数据区包括多个数据块,该元数据块与该数据区一一对应,该元数据与该数据块一一对应,内存中的一个元数据组对应于一个该元数据块,一个该元数据组包含多个元数据,一个该元数据组内的元数据与该元数据组对应的元数据块内的元数据--对应。该方法包括:
[0041]201,更新内存中的至少一个元数据。
[0042]其中,该至少一个元数据对应于该Flash中用于存储写入IO请求命令请求写入的数据的至少一个数据块。
[0043]或者说,该至少一个元数据对应于该Flash中的至少一个数据块,该Flash中的至少一个数据块用于存储写入IO请求命令请求写入的数据。
[0044]202,获取该至少一个元数据所属的至少一个元数据组。
[0045]本发明实施中,获取一个元数据组,可通过获取元数据组的标识、内存地址或变量等方式实现,具体实现可参考现有技术,本发明实施例在此不再赘述。
[0046]内存中的元数据,可按照Flash中的元数据块的大小进行分组。例如,Flash中一个元数据块有128个元数据,则内存中可将128个元数据编为I组。同时,内存中一个元数据组的元数据与Flash中一个元数据块的元数据--对应。
[0047]203,如果该至少一个元数据组内的第一元数据组的写状态为非写入状态且该第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令,则将该多个写入IO请求命令移动到该第一元数据组的合并写入元数据队列。
[0048]本发明中任一处提到的第一元数据组,均指代该至少一个元数据组内的任一元数据组,或者说包含更新元数据的任一元数据组。
[0049]本发明实施例中,第一元数据组的写状态用于标记是否正在对第一元数据组在Flash所对应的元数据块进行写操作。
[0050]如果第一元数据组正在进行写操作或者说处于写入状态,则在写操作完成之前涉及第一元数据组写操作的写入IO请求命令需要进行等待。
[0051]如果第一元数据组写操作完毕或未执行写操作,或者说处于非写入状态,则可以将第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令移动到第一元数据组的合并写入元数据队列中。此时,第一元数据组处于写入状态,可以执行写入操作。
[0052]204,将该第一元数据组写入到该Flash中该第一元数据组所对应的元数据块。
[0053]205,对该第一元数据组的合并写入元数据队列下的多个写入IO请求命令返回该第一元数据组写入是否成功的状态。
[0054]本发明实施例中,在向Cache的Flash写入元数据时,合并多个写入IO请求命令对同一元数据块的写入操作,可以一定程度上减少Flash的写入次数并一定程度上避免IO与放大的问题,提闻Flash的使用寿命。
[0055]可选地,作为一个实施例,步骤201具体可实现为:如果该至少一个元数据之一的状态指示信息指示该至少一个元数据之一为干净Clean状态,则更新该至少一个元数据之一。其中,该Clean状态用于指示该至少一个元数据之一在该Flash对应的元数据与该至少一个元数据之一内容相同。本发明实施例中,对已经置脏的元数据,不再进行写入操作,也一定程度上减少Flash的写入次数,提高Flash的使用寿命。
[0056]可选地,在步骤205之后,该方法还包括:如果第一元数据组还存在等待执行元数据写入操作的写入IO请求命令,则将等待执行元数据写入操作的写入IO请求命令移动到该第一元数据组的合并写入元数据队列并对该第一元数据组执行元数据写入操作。如果不存在待执行元数据写入操作的写入IO请求命令,则此时可将第一元数据组的写入状态置为非写入状态。
[0057]可选地,一个该元数据块的大小等于该Flash的页面大小。元数据块的大小与Flash的页面大小一致,能够一定程度上提高Flash的寿命,并提高Flash写入性能。现有技术中,Flash的页面大小为4K。
[0058]可选地,一个该元数据的大小为32B、64B或128B。[0059]可选地,作为一个实施例,该chunk元数据区的大小与一个该数据块的大小一致。Chunk元数据区的大小与一个数据块的大小一致,使得缓存装置在加载Flash或对Flash初始化时,可以按照数据块的大小进行存储区域划分。
[0060]可选地,一个该数据块的大小可以为512B、1K、2K、4K、8K、16K、32K*64K。
[0061]下面,结合具体的例子,对本发明实施例的方法进行描述。 [0062]如图3所不,Flash下包括超级块和多个chunk,每个chunk包括一个chunk兀数据区和一个chunk数据区,每个chunk元数据区包括一个或多个元数据块,每个chunk数据区包括与该一个或多个元数据块对应的数据区。每个chunk数据区下的数据区与其对应的chunk元数据区下的元数据块--对应。
[0063]图4是本发明实施例Flash的再一种数据布局不意图。本发明实施例的一种布局方式如图4所示,一个chunk元数据区中包含I个元数据块,对应地,一个chunk数据区包含I个数据区。
[0064]图5是本发明实施例Flash的再一种数据布局不意图。本发明实施例的一种布局方式如图5所示,一个chunk元数据区中包含4个元数据块,对应地,一个chunk数据区包含4个数据区。
[0065]由图4和图5可知,一个chunk元数据区可能包括一个或多个元数据块,一个chunk元数据区的大小是可变的。一种优选的方案,可将一个数据块的大小作为一个chunk元数据区的大小,这样,可使得在Flash加载初始化时,按照数据块的大小对Flash的存储区域进行划分。例如,一个数据块的大小为4K,则一个chunk元数据区的大小也为4K,其元数据块的个数为I (4K/4K),如图4所示。又例如,一个数据块的大小为16K,则一个chunk元数据区的大小也为16K,其元数据块的个数为4(16K/4K)。数据块的大小可以由操作系统或存储装置配置,其大小可以为41(、81(、161(、321(或641(等等,本发明实施例在此不作限制。
[0066]当然,数据块的大小也可以与chunk元数据区的大小不同。例如,数据块的大小还可以是512B,1K,2K等,而chunk元数据区中至少包括I个元数据块,显然比一个数据块大。又例如,当数据块的大小为8K、16K、32K或64Κ等时,chunk元数据区的大小也可以比数据块的大小还小,比如chunk元数据区中只包括I个元数据块。
[0067]图6是本发明实施例元数据在内存中位置和Flash中实际持久化的位置的一种关系不意图。
[0068]如图6所示,可在内存中设计一个数据结构p_head数组,存储的数据区中每个数据块对应的元数据。不妨假设每个数据块所需要的元数据的大小为64个字节,那么可以将p_head数组按照64个(4K/64B=64)元数据分成一组,一个元数据组对应于Flash中的一个元数据块。
[0069]内存中一个元数据对应于p_head数组的一个元素,其数据结构flashCache_wbhead及含义可如下所示:
[0070]typedef struct flashCache—wbhead
{
dsw_u8 headjype:1; //head的类型,主要分冷写和热点区的head
dsw_u8 head_status:3; // 标记 head 是否是脏块
dsw_ul 6 read_ref_count; / /标记当前的块正在读的个数
dsw_ul 6 write_ref_count; / /标记当前的块正在写的个数
dsw_ul 6 flush_ref_count; / /标记当前的块正在刷盘的个数
//用于检查IO是的命中
dsw_u8 valid_birmap[FLASH_BITMAP_SIZE];
dsw_u8 dirty_bitmap[FLASH_BITMAP_STZE];
array_h I ist_node_t hash_node;
array」ist_head_t wbhead_node; //the first, node is the head
II系统中的块其他辅助信息
mapping_info_t mapping_info;
} flashCache_wbhead_ t;
[0071]如图6所示,还可在内存中设计一个数据结构metadata_head数组,维护在内存中数据的元数据和这些元数据在实际持久化设备(Flash)中的实际的存储位置(即对应的元数据块)的关系。
[0072]Flash中的一个元数据块在内存中所对应的一个元数据组,对应于metadata_head数组中的一个元素,其数据结构metadata_head及含义可如下所示:
[0073]
typedef struct metadata—head
{
list_head_t metadata_pending_q; //表示等待合并的数据 IO 队列 list_head_t metadata_syncing_q; //表示同步合并元数据 IO 队列 dsw_u64 metadata jba; //'表示指定系统中元数据在Flash中具体的位置 void *buf_addr;.//表示指定内存中对应的4K的位置 dsw_u8 is_writing;././标记 head 是否正在 IO 操作 J metadata_head_t;
[0074]如图6所示,内存中按flashCache_wbhead存储着一个数据块的元数据信息,又按metadata_head存储着同一组元数据(即一个元数据块)的信息,以方便在写入时按照元数据块进行写入。
[0075]通过在内存中引入元数据块对应的元数据组的相关维护信息,为缓存装置实现元数据块级别多个写入IO请求命令合并写入提供了可能。
[0076]图7是本发明实施例缓存装置对元数据合并写入的具体流程图。
[0077]下面,结合图6及元数据、元数据块的数据结构对图7的方法进行描述。当然,图7的方法还可应用于其它包含多个元数据区的Flash数据布局方式,本发明实施例在此不作限制。
[0078]701,接收写入IO请求命令。
[0079]缓存装置可接收写入IO请求命令。
[0080]702,存储数据到 Flash。
[0081]缓存装置可根据写入IO请求命令,将待写入的数据存储到缓存装置的Flash的至少一个数据块中。
[0082]步骤701、702的具体实现可参考现有技术实现,本发明实施例在此不再赘述。
[0083]703,检查元数据是否需要更新。
[0084]缓存装置可根据Flash中存储的至少一个数据块的位置,获取该至少一个数据块在内存中对应的元数据。
[0085]缓存装置可根据当前元数据的修改状态判断元数据是否需要更新。该元数据的修改状态,可包括脏(Dirty)状态和干净(Clean)状态。其中,Dirty状态可表示该元数据相对于Flash中对应的元数据发生修改,Clean状态表示该元数据相对于Flash中对应的元数据未发生修改。
[0086]缓存装置可逐个判断数据块所对应的元数据是否需要更新,也可批量判断数据块所对应的元数据是否需要更新。
[0087]如果该至少一个数据块对应的元数据都已经置Dirty,则再次置Dirty后效果是一样的,不需要再次置Dirty。此时,执行步骤704。
[0088]如果该至少一个数据块对应的元数据中部分为Clean状态,则对该部分为Clean状态的元数据执行步骤705。
[0089]对元数据的修改状态判断以决定是否进行更新,可一定程度上减少内存中需要更新的元数据,进而减少Flash中元数据的写入次数,提高Flash的寿命。
[0090]当然,缓存装置也可不判断该至少一个数据块在内存中对应的元数据当前的修改状态直接写入,不影响本发明实施例Cache写入方法的执行。
[0091]704,对写入IO请求命令返回写成功,并修改元数据写入状态为非写状态。
[0092]由于元数据不需要进行更新,在数据写入Flash后该IO请求即可结束。缓存装置可向该写入IO请求命令返回写成功,并标记元数据写入状态为非写状态。
[0093]705,更新内存中的元数据。
[0094]如果该至少一个数据块对应的元数据中部分为Clean状态,缓存装置可对该修改状态为Clean状态的元数据置Dirty。
[0095]当然,也不排除缓存装置对修改状态为Dirty状态的元数据置Dirty。例如,当多个连续的元数据中部分为Clean状态,部分为Dirty状态,可对该多个连续的元数据同时置Dirty0
[0096]706,根据更新的元数据在内存中的位置获取元数据所在的至少一个元数据组。
[0097]缓存装置可根据更新的元数据在内存中的位置获取更新的元数据所在的元数据组。
[0098]例如,在图6中,根据元数据在内存中的位置(index),缓存装置可获取该元数据对应的元数据组的meta_head。不妨假设每个数据块所需要的元数据的大小为64个字节,一个元数据组(meta_head)就有64个(4K/64B=64)元数据。如果修改的元数据为第33-120,则其对应的元数据组(meta_head)为第0、1共2个元数据组。
[0099]707,把写入IO请求命令挂入该至少一个元数据组中的第一元数据组的待合并元数据队列中。
[0100]在获取到需要执行元数据写入操作的该至少一个元数据组后,缓存装置将写入IO请求命令挂入该至少一个元数据组中第一元数据组的待合并元数据队列。
[0101]其中,该第一元数据组指代该至少一个元数据组中的任一元数据组。例如,该第一元数据组可以是步骤706的第O个元数据组或第I个元数据组。
[0102]708,检查第一元数据组的是否正在写操作。
[0103]缓存装置判断第一元数据组的是否正在进行写操作。
[0104]如图6所示,缓存装置可根据第一元数据组对应的metadata_head判断第一元数据组的写状态是否为非写入状态。
[0105]第一元数据组的写状态用于标记是否正在对第一元数据组在Flash所对应的元数据块进行写操作。
[0106]如果第一元数据组正在进行写操作或者说处于写入状态,则在写操作完成之前涉及第一元数据组写操作的写入IO请求命令需要进行等待。
[0107]如果第一元数据组写操作完毕或未执行写操作,或者说处于非写入状态,则可以将第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令移动到第一元数据组的合并写入元数据队列中。此时,第一元数据组处于写入状态,可以执行写入操作。
[0108]也就是说,如果是写入状态,则执行步骤709 ;如果是非写入状态,则执行步骤710。
[0109]709,返回,等待写操作完成。
[0110]710,将第一元数据组的待合并元数据队列上的写入IO请求命令移到第一元数据组的合并写入元数据队列。
[0111]在第一元数据组上一次写入完毕后,缓存装置将第一元数据组的待合并元数据队列上的多个写入IO请求命令移到第一元数据组的合并写入元数据队列。
[0112]711,对第一元数据提交写请求操作。
[0113]缓存装置合对第一元数据组异步提交写请求操作,把第一元数据组写入到Flash对应的元数据块中。
[0114]712,元数据是否写入成功。
[0115]缓存装置判断元数据是否写入成功。
[0116]如果否,执行步骤713。
[0117]如果是,执行步骤714。
[0118]713,循环处理第一元数据组的合并写入元数据队列上的写入IO请求命令,分别返回写失败的状态,结束。
[0119]714,循环处理第一元数据组的合并写入元数据队列上的写入IO请求命令,分别返回写成功的状态。
[0120]715,检查第一元数据组的待合并元数据队列是否为空。
[0121]如果否,执行步骤710。
[0122]如果是,执行步骤716。
[0123]716,修改第一元数据组的写入状态为非写状态。
[0124]缓存装置修改第一元数据组的写入状态为非写状态。
[0125]图8是本发明实施例缓存装置800的结构示意图。其中,该缓存装置800的Flash的存储区域包括多个chunk, —个该chunk包括一个chunk元数据区和一个chunk数据区,该一个chunk元数据区包括至少一个元数据块,该一个chunk数据区包括与该至少一个元数据块对应的至少一个数据区,该元数据块包括多个元数据,该数据区包括多个数据块,该元数据块与该数据区一一对应,该元数据与该数据块一一对应,内存中的一个元数据组对应于一个该元数据块,一个该元数据组包含多个元数据,一个该元数据组内的元数据与该元数据组对应的元数据块内的元数据一一对应。该缓存装置800可包括更新单元801、获取单元802、队列移动单元803、写入单元804和反馈单元805。
[0126]更新单元801,用于更新内存中的至少一个元数据。
[0127]其中,该至少一个元数据对应于该Flash中用于存储写入IO请求命令请求写入的数据的至少一个数据块。
[0128]或者说,该至少一个元数据对应于该Flash中的至少一个数据块,该Flash中的至少一个数据块用于存储写入I O请求命令请求写入的数据。
[0129]获取单元802,用于获取该至少一个元数据所属的至少一个元数据组。
[0130]内存中的元数据,可按照Flash中的元数据块的大小进行分组。例如,Flash中一个元数据块有128个元数据,则内存中可将128个元数据编为I组。同时,内存中一个元数据组的元数据与Flash中一个元数据块的元数据--对应。
[0131]队列移动单元803,用于如果该至少一个元数据组内的第一元数据组的写状态为非写入状态且该第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令,则将该多个写入IO请求命令移动到该第一元数据组的合并写入元数据队列。
[0132]本发明中任一处提到的第一元数据组,均指代该至少一个元数据组内的任一元数据组,或者说包含更新元数据的任一元数据组。
[0133]本发明实施例中,第一元数据组的写状态用于标记是否正在对第一元数据组在Flash所对应的元数据块进行写操作。
[0134]如果正在进行写操作或者说处于写入状态,则在写操作完成之前涉及第一元数据组写操作的写入IO请求命令需要进行等待。
[0135]如果写操作完毕或未执行写操作,或者说处于非写入状态,则可以将第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令移动到第一元数据组的合并写入元数据队列中。此时,第一元数据组处于写入状态,可以执行写入操作。
[0136]写入单元804,用于将该第一元数据组写入到该Flash中该第一元数据组所对应的元数据块。
[0137]反馈单元805,用于对该第一元数据组的合并写入元数据队列下的多个写入IO请求命令返回该第一元数据组写入是否成功的状态。[0138]本发明实施例中,在向缓存装置800的Flash写入元数据时,合并多个写入IO请求命令对同一元数据块的写入操作,可以一定程度上减少Flash的写入次数并一定程度上避免IO写放大的问题,提高Flash的使用寿命。
[0139] 可选地,作为一个实施例,更新单元801具体用于:如果该至少一个元数据之一的状态指示信息指示该至少一个元数据之一为干净Clean状态,则更新该至少一个元数据之一,其中,该Clean状态用于指示该至少一个元数据之一在该Flash对应的元数据与该至少一个元数据之一内容相同。本发明实施例中,缓存装置800对已经置脏的元数据,不再进行写入操作,也一定程度上减少Flash的写入次数,提高Flash的使用寿命。
[0140]可选地,可选地,一个该元数据块的大小等于该Flash的页面大小。元数据块的大小与Flash的页面大小一致,能够一定程度上提高Flash的寿命,并提高Flash写入性能。现有技术中,Flash的页面大小为4K。
[0141]可选地,一个该元数据的大小为32B、64B或128B。
[0142]可选地,作为一个实施例,该chunk元数据区的大小与一个该数据块的大小一致。Chunk元数据区的大小与一个数据块的大小一致,使得缓存装置800在加载Flash或对Flash初始化时,可以按照数据块的大小进行存储区域划分。
[0143]可选地,一个该数据块的大小可以为512B、1K、2K、4K、8K、16K、32K*64K。
[0144]另外,缓存装置800还可执行图2的方法,并实现缓存装置在图7所示的实施例的功能,本发明实施例在此不再赘述。
[0145]图9是本发明实施例存储系统900的结构示意图。该存储系统900可包括:存储器901和处理器902。存储器901可包括内存903、缓存904等。
[0146]存储器901和处理器902通过总线905系统相互连接;总线904可以是ISA总线、PCI总线或EISA总线等。所述总线可以分为地址总线、数据总线、控制总线等。为便于表示,图9中仅用一个双向的粗箭头表示,但并不表示仅有一根总线或一种类型的总线。
[0147]缓存904,包括Flash,该Flash的存储区域包括多个chunk,—个该chunk包括一个chunk元数据区和一个chunk数据区,该一个chunk元数据区包括至少一个元数据块,该一个chunk数据区包括与该至少一个元数据块对应的至少一个数据区,该元数据块包括多个元数据,该数据区包括多个数据块,该元数据块与该数据区一一对应,该元数据与该数据
块--对应,内存中的一个元数据组对应于一个该元数据块,一个该元数据组包含多个元
数据,一个该元数据组内的元数据与该元数据组对应的元数据块内的元数据--对应。
[0148]当然,存储器901可能还包含其它高速RAM存储器,还可能还包括非易失性存储器(non-volatile memory),例如至少一个磁盘存储器。存储器901还用于向处理器902提供指令和数据。
[0149]存储器901存储了如下的元素,可执行模块或者数据结构,或者它们的子集,或者它们的扩展集:
[0150]操作指令:包括各种操作指令,用于实现各种操作。
[0151]操作系统:包括各种系统程序,用于实现各种基础业务以及处理基于硬件的任务。
[0152]在本发明实施例中,处理器902通过调用存储器901存储的操作指令(该操作指令可存储在操作系统中),执行如下操作:
[0153]更新内存中的至少一个元数据,其中,该至少一个元数据对应于该Flash中用于存储写入IO请求命令请求写入的数据的至少一个数据块;用于获取该至少一个元数据所属的至少一个元数据组;如果该至少一个元数据组内的第一元数据组的写状态为非写入状态且该第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令,则将该多个写入IO请求命令移动到该第一元数据组的合并写入元数据队列;将该第一元数据组写入到该Flash中该第一元数据组所对应的元数据块;对该第一元数据组的合并写入元数据队列下的多个写入IO请求命令返回该第一元数据组写入是否成功的状态。
[0154]内存中的元数据,可按照Flash中的元数据块的大小进行分组。例如,Flash中一个元数据块有128个元数据,则内存中可将128个元数据编为I组。同时,内存中一个元数据组的元数据与Flash中一个元数据块的元数据--对应。
[0155] 本发明实施例中,存储系统800在向Flash写入元数据时,合并多个写入IO请求命令对同一元数据块的写入操作,可以一定程度上减少Flash的写入次数并一定程度上避免IO写放大的问题,提高Flash的使用寿命。
[0156]可选地,作为一个实施例,在用于更新内存中的至少一个元数据时,处理器902具体用于:如果该至少一个元数据之一的状态指示信息指示该至少一个元数据之一为干净Clean状态,则更新该至少一个元数据之一,其中,该Clean状态用于指示该至少一个元数据之一在该Flash对应的元数据与该至少一个元数据之一内容相同。本发明实施例中,缓存装置900对已经置脏的元数据,不再进行写入操作,也一定程度上减少Flash的写入次数,提高Flash的使用寿命。
[0157]可选地,可选地,一个该元数据块的大小等于该Flash的页面大小。元数据块的大小与Flash的页面大小一致,能够一定程度上提高Flash的寿命,并提高Flash写入性能。现有技术中,Flash的页面大小为4K。
[0158]可选地,一个该元数据的大小为32B、64B或128B。
[0159]可选地,作为一个实施例,该chunk元数据区的大小与一个该数据块的大小一致。Chunk元数据区的大小与一个数据块的大小一致,使得缓存装置900在加载Flash或对Flash初始化时,可以按照数据块的大小进行存储区域划分。
[0160]可选地,一个该数据块的大小可以为512B、1K、2K、4K、8K、16K、32K*64K。
[0161]另外,缓存装置900还可执行图2的方法,并实现缓存装置在图7所示的实施例的功能,本发明实施例在此不再赘述。
[0162]本领域普通技术人员可以意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、或者计算机软件和电子硬件的结合来实现。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本发明的范围。
[0163]所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统、装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
[0164]在本申请所提供的几个实施例中,应该理解到,所揭露的系统、装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
[0165]所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
[0166]另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
[0167]所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个计算机可读取存储介质中。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本发明各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:U盘、移动硬盘、只读存储器(ROM,Read-Only Memory)、随机存取存储器(RAM, Random Access Memory)、磁碟或者光盘等各种可以存储程序代码的介质。
[0168]以上所述,仅为本发明的【具体实施方式】,但本发明的保护范围并不局限于此,任何熟悉本【技术领域】的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。
【权利要求】
1.一种缓存Cache写入的方法,其特征在于,所述Cache的闪存Flash的存储区域包括多个存储块chunk, —个所述chunk包括一个chunk元数据区和一个chunk数据区,所述一个chunk元数据区包括至少一个元数据块,所述一个chunk数据区包括与所述至少一个元数据块对应的至少一个数据区,所述元数据块包括多个元数据,所述数据区包括多个数据块,所述元数据块与所述数据区一一对应,所述元数据与所述数据块一一对应,内存中的一个元数据组对应于一个所述元数据块,一个所述元数据组包含多个元数据,一个所述元数据组内的元数据与所述元数据组对应的元数据块内的元数据--对应,包括: 更新内存中的至少一个元数据,所述至少一个元数据对应于所述Flash中用于存储写入IO请求命令请求写入的数据的至少一个数据块; 获取所述至少一个元数据所属的至少一个元数据组; 如果所述至少一个元数据组内的第一元数据组的写状态为非写入状态且所述第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令,则将所述多个写入IO请求命令移动到所述第一元数据组的合并写入元数据队列; 将所述第一元数据组的元数据写入到所述Flash中所述第一元数据组所对应的元数据块中; 对所述第一元数据组的合并写入元数据队列下的多个写入IO请求命令返回所述第一元数据组写入是否成功的状态。
2.如权利要求1所述的方法,其特征在于,所述更新内存中的至少一个元数据包括: 如果所述至少一个元数据之一的状态指示信息指示所述至少一个元数据之一为干净Clean状态,则更新所述至少一个元数据之一,其中,所述Clean状态用于指示所述至少一个元数据之一在所述Flash对应的元数据与所述至少一个元数据之一内容相同。
3.如权利要求1或2所述的方法,其特征在于,一个所述元数据块的大小等于所述Flash的页面大小。
4.如权利要求3所述的方法,其特征在于,一个所述元数据的大小为32B、64B或128B。
5.如权利要求3或4所述的方法,其特征在于,所述chunk元数据区的大小与一个所述数据块的大小一致。
6.如权 利要求3或4所述的方法,其特征在于,一个所述数据块的大小为512B、1K、2K、4Κ、8Κ、16Κ、32Κ 或 64Κ。
7.一种缓存装置,其特征在于,所述缓存装置的闪存Flash的存储区域包括多个存储块chunk, —个所述chunk包括一个chunk兀数据区和一个chunk数据区,所述一个chunk元数据区包括至少一个元数据块,所述一个chunk数据区包括与所述至少一个元数据块对应的至少一个数据区,所述元数据块包括多个元数据,所述数据区包括多个数据块,所述元数据块与所述数据区一一对应,所述元数据与所述数据块一一对应,内存中的一个元数据组对应于一个所述元数据块,一个所述元数据组包含多个元数据,一个所述元数据组内的元数据与所述元数据组对应的元数据块内的元数据--对应,包括: 更新单元,用于更新内存中的至少一个元数据,所述至少一个元数据对应于所述Flash中用于存储写入IO请求命令请求写入的数据的至少一个数据块; 获取单元,用于获取所述至少一个元数据所属的至少一个元数据块之第一元数据组,一个所述元数据组中的元数据对应于所述Flash中的一个元数据块中的元数据;队列移动单元,用于如果所述至少一个元数据组内的第一元数据组的写状态为非写入状态且所述第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令,则将所述多个写入IO请求命令移动到所述第一元数据组的合并写入元数据队列; 写入单元,用于将所述第一元数据组写入到所述Flash中所述第一元数据组所对应的元数据块; 反馈单元,用于对所述第一元数据组的合并写入元数据队列下的多个写入IO请求命令返回所述第一元数据组写入是否成功的状态。
8.如权利要求7所述的缓存装置,其特征在于,所述更新单元具体用于: 如果所述至少一个元数据之一的状态指示信息指示所述至少一个元数据之一为干净Clean状态,则更新所述至少一个元数据之一,其中,所述Clean状态用于指示所述至少一个元数据之一在所述Flash对应的元数据与所述至少一个元数据之一内容相同。
9.如权利要求7或8所述的缓存装置,其特征在于,一个所述元数据块的大小等于所述Flash的页面大小。
10.如权利要求7至9任一项所述的缓存装置,其特征在于,所述chunk元数据区的大小与一个所述数据块的大小一致。
11.一种存储系统,其特征在于,包括存储器和和处理器,所述存储器包括内存、缓存Cache,所述Cache包括闪存Flash,所述Flash的存储区域包括多个存储块chunk, —个所述chunk包括一个chunk元数据区和一个chunk数据区,所述一个chunk元数据区包括至少一个元数据块,所述一个chunk数据区包括与所述至少一个元数据块对应的至少一个数据区,所述元数据块包括多个元数据,所述数据区包括多个数据块,所述元数据块与所述数据区一一对应,所述元数据与所述数据块一一对应,内存中的一个元数据组对应于一个所述元数据块,一个所述元数据组包含多个元数据,一个所述元数据组内的元数据与所述元数据组对应的元数据块内的元数据一一对应,其中,所述处理器用于: 更新所述内存中的至少一个元数据,所述至少一个元数据对应于所述Flash中用于存储写入IO请求命令请求写入的数据的至少一个数据块; 获取所述至少一个元数据所属的至少一个元数据块之第一元数据组,一个所述元数据组中的元数据对应于所述Flash中的一个元数据块中的元数据; 如果所述至少一个元数据组内的第一元数据组的写状态为非写入状态且所述第一元数据组下存在等待执行元数据写入操作的多个写入IO请求命令,则将所述多个写入IO请求命令移动到所述第一元数据组的合并写入元数据队列; 将所述第一元数据组写入到所述Flash中所述第一元数据组所对应的元数据块; 对所述第一元数据组的合并写入元数据队列下的多个写入IO请求命令返回所述第一元数据组写入是否成功的状态。
12.如权利要求11所述的存储系统,其特征在于,在用于更新所述内存中的至少一个元数据,所述处理器具体用于: 如果所述至少一个元数据之一的状态指示信息指示所述至少一个元数据之一为干净Clean状态,则更新所述至少一个元数据之一,其中,所述Clean状态用于指示所述至少一个元数据之一在所述Flash对应的元数据与所述至少一个元数据之一内容相同。
13.如权利要求11或12所述的存储系统,一个所述元数据块的大小等于所述Flash的页面大小。
14. 如权利要求11至13任一项所述的存储系统,其特征在于,所述chunk元数据区的大小与一个所述数据块的大小一致。
【文档编号】G06F3/06GK103473185SQ201310402988
【公开日】2013年12月25日 申请日期:2013年9月6日 优先权日:2013年9月6日
【发明者】黄福堂, 明亮, 王朝海 申请人:华为数字技术(苏州)有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1