存储系统页内脏数据索引方法和装置与流程

文档序号:15205182发布日期:2018-08-21 07:53阅读:182来源:国知局

本发明涉及存储设备技术领域,尤其涉及一种存储系统页内脏数据索引方法和装置。



背景技术:

固态硬盘(solidstatedrives)是用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(flash芯片、dram芯片)组成。固态硬盘在接口的规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也完全与普通硬盘一致。由于其高读写带宽、低访问延迟、低功耗等特点被广泛应用。

以闪存为基础构建的固态盘采用闪存转换层(flashtranslationlayer,ftl)对闪存的读写擦除进行管理,并向软件系统提供与传统磁盘相同的读写接口。闪存转换层(ftl)主要包含三种功能:地址映射、垃圾回收和磨损均衡。

在固态盘内部,闪存芯片(package)通过不同的通道(channel)连接到闪存控制器。在闪存芯片中,封装有多个闪存颗粒(die),每个颗粒可以独立执行指令。每个颗粒包含多个闪存片(plane),每个闪存片拥有独立的寄存器,可提供多闪存片之间的流水指令执行。通过不同级别的并发,固态盘可提供充足的访问带宽。这一特性被称为闪存设备的内部并发。

在文件系统(即存储系统)中,使用页高速缓存(即存储系统的存储页)来缓存最近操作的数据,以加速读写过程。当需要读取数据时,首先在页高速缓存中查找该部分内容是否驻留在内存中,如果找到,则直接返回数据,不再需要启动昂贵的设备操作;如果没找到,再到闪存中进行读取。当需要进行写操作时,不再直接把数据写入到设备中,而是把数据写入到页高速缓存后将相应页面标记为脏,然后直接返回,当用户发出同步调用或操作系统后台线程启动同步操作时,将页高速缓存中的脏页面写入到闪存设备中。

在这种模式下,一次写操作涉及到一个页面(即存储页),则该页面会被整个标记为脏,后续会全部写入到闪存设备中,即使本次写操作仅仅涉及到该页面的很少一部分。这使得写入数据量大大增加,不仅增加了同步操作的延时,降低了文件系统或存储系统的性能,而且增加了闪存设备的磨损,大大降低了其寿命。



技术实现要素:

本发明的主要目的在于提供一种存储系统页内脏数据索引方法和装置,旨在解决存储系统中写入数据量大、增加闪存设备磨损的技术问题。

为实现上述目的,本发明提供的一种存储系统页内脏数据索引方法,所述存储系统页内脏数据索引方法包括:

获取存储系统中目标存储页中存储点的点数量,并获取所述目标存储页中脏数据在各个存储点中的脏数据分布信息;

根据所述点数量和脏数据分布信息创建位图,并根据所述脏数据分布信息创建扩展段集合,并获取扩展段集合中扩展段的当前扩展段个数和段容量;

根据所述点数量,获取所述目标存储页以位图索引脏数据的第一存储代价;根据所述当前扩展段个数和段容量,获取所述目标存储页以扩展段索引脏数据的第二存储代价;

根据第一存储代价和第二存储代价,确定基于位图方式或扩展段方式索引所述目标存储页中的脏数据。

可选地,所述获取存储系统中目标存储页中存储点的点数量,并获取所述目标存储页中脏数据在各个存储点中的脏数据分布信息的步骤包括:

获取存储系统中目标存储页的页容量和目标存储页中存储点的点容量,并根据所述页容量和点容量得出存储点的点数量,并获取所述目标存储页中脏数据在各个存储点中的脏数据分布信息;

其中当存储点为脏数据,对应位图中的数据位为肯定标识;当存储点为脏数据,对应位图中的数据位为否定标识;扩展段集合中一个扩展段对应所述目标存储页中一个脏数据段,每个扩展段包括偏移子段和长度子段,并根据偏移子段和长度子段的数据位个数得出扩展段的段容量。

可选地,所述根据第一存储代价和第二存储代价,确定基于位图方式或扩展段方式索引所述目标存储页中的脏数据包括:

若第一存储代价小于第二存储代价,则基于位图方式索引所述目标存储页中的脏数据;若第二存储代价小于第一存储代价,则基于扩展段方式索引所述目标存储页中的脏数据。

可选地,所述根据第一存储代价和第二存储代价,确定基于位图方式或扩展段方式索引所述目标存储页中的脏数据包括:

获取所述目标存储页以位图索引脏数据的第一查询代价;根据所述当前扩展段个数,获取所述目标存储页以扩展段索引脏数据的第二查询代价;

根据第一存储代价和第一查询代价,得出所述目标存储页以位图索引脏数据的第一总代价;根据第二存储代价和第二查询代价,得出所述目标存储页以扩展段索引脏数据的第二总代价;

若第一总代价小于第二总代价,则基于位图方式索引所述目标存储页中的脏数据;若第二总代价小于第一总代价,则基于扩展段方式索引所述目标存储页中的脏数据。

可选地,所述根据第一存储代价和第一查询代价,得出所述目标存储页以位图索引脏数据的第一总代价的步骤包括:

根据预设公式、第一存储代价和第一查询代价,得出所述目标存储页以位图索引脏数据的第一总代价;

所述根据第二存储代价和第二查询代价,得出所述目标存储页以扩展段索引脏数据的第二总代价的步骤包括:

根据预设公式、第二存储代价和第二查询代价,得出所述目标存储页以扩展段索引脏数据的第二总代价;

其中,预设公式为cost=p*storage+q*query,cost为总代价、p为第一预设系数、storage为存储代价、q为第二预设系数、query为查询代价、p+q=1;其中,所述存储系统的存储容量越大,p越小;存储系统的存储容量越小,p越大。

可选地,所述根据所述脏数据分布信息创建扩展段集合,并获取扩展段集合的当前扩展段个数的步骤之后包括:

当检测到脏数据分布信息更新时,更新所述扩展段集合中各个扩展段的偏移子段和长度子段中数据;

根据更新后的各个扩展段的偏移子段和长度子段,对各个扩展段进行合并,以将存在交集的扩展段合并为一个新的扩展段,并将进行扩展段合并后的扩展段集合中扩展段个数作为新的当前扩展段个数。

本发明还提供一种存储系统页内脏数据索引装置,所述存储系统页内脏数据索引装置包括:

获取模块,用于获取存储系统中目标存储页中存储点的点数量,并获取所述目标存储页中脏数据在各个存储点中的脏数据分布信息;

位图创建模块,用于根据所述点数量和脏数据分布信息创建位图;

扩展段创建模块,用于根据所述脏数据分布信息创建扩展段集合,并获取扩展段集合中扩展段的当前扩展段个数和段容量;

代价获取模块,用于根据所述点数量,获取所述目标存储页以位图索引脏数据的第一存储代价;根据所述当前扩展段个数和段容量,获取所述目标存储页以扩展段索引脏数据的第二存储代价;

索引模块,用于根据第一存储代价和第二存储代价,确定基于位图方式或扩展段方式索引所述目标存储页中的脏数据。

可选地,所述获取模块用于:

获取存储系统中目标存储页的页容量和目标存储页中存储点的点容量,并根据所述页容量和点容量得出存储点的点数量,并获取所述目标存储页中脏数据在各个存储点中的脏数据分布信息;

其中当存储点为脏数据,对应位图中的数据位为肯定标识;当存储点为脏数据,对应位图中的数据位为否定标识;扩展段集合中一个扩展段对应所述目标存储页中一个脏数据段,每个扩展段包括偏移子段和长度子段,并根据偏移子段和长度子段的数据位个数得出扩展段的段容量。

可选地,所述索引模块用于:

若第一存储代价小于第二存储代价,则基于位图方式索引所述目标存储页中的脏数据;若第二存储代价小于第一存储代价,则基于扩展段方式索引所述目标存储页中的脏数据。

可选地,所述索引模块包括:

第一获取单元,用于获取所述目标存储页以位图索引脏数据的第一查询代价;根据所述当前扩展段个数,获取所述目标存储页以扩展段索引脏数据的第二查询代价;

第二获取单元,用于根据第一存储代价和第一查询代价,得出所述目标存储页以位图索引脏数据的第一总代价;根据第二存储代价和第二查询代价,得出所述目标存储页以扩展段索引脏数据的第二总代价;

索引单元,用于若第一总代价小于第二总代价,则基于位图方式索引所述目标存储页中的脏数据;若第二总代价小于第一总代价,则基于扩展段方式索引所述目标存储页中的脏数据。

可选地,所述第二获取单元用于:

根据预设公式、第一存储代价和第一查询代价,得出所述目标存储页以位图索引脏数据的第一总代价;

根据预设公式、第二存储代价和第二查询代价,得出所述目标存储页以扩展段索引脏数据的第二总代价;

其中,预设公式为cost=p*storage+q*query,cost为总代价、p为第一预设系数、storage为存储代价、q为第二预设系数、query为查询代价、p+q=1;其中,所述存储系统的存储容量越大,p越小;存储系统的存储容量越小,p越大。

可选地,所述扩展段创建模块用于:

当检测到脏数据分布信息更新时,更新所述扩展段集合中各个扩展段的偏移子段和长度子段中数据;

根据更新后的各个扩展段的偏移子段和长度子段,对各个扩展段进行合并,以将存在交集的扩展段合并为一个新的扩展段,并将进行扩展段合并后的扩展段集合中扩展段个数作为新的当前扩展段个数。

本发明通过在获取当前存储系统中目标存储页的以位图索引脏数据的第一存储代价,以及以扩展段索引脏数据的第二存储代价,并根据第一存储代价和第二存储代价,确定基于位图方式或扩展段方式索引所述目标存储页中的脏数据,从而以位图或扩展段的更小粒度来更新和索引脏数据,存于缓存中,当缓存快满时(即缓存大于预设缓存值时)再以存储页的粒度写回外存或闪存中,从而避免存储页仅写入很少一部分(即存储页中脏数据段很少)时也将存储页全部写入到闪存设备中,从而降低了写入数据量,降低了同步操作的延时,间接提高了系统的性能,同时也降低了闪存设备的磨损,提高了闪存设备的使用寿命。

附图说明

图1为本发明中创建并更新位图的场景示意图;

图2为本发明中扩展段合并的场景示意图;

图3为本发明存储系统页内脏数据索引方法一实施例的流程示意图;

图4为本发明存储系统页内脏数据索引方法另一实施例中步骤s50的细化流程示意图;

图5为本发明存储系统页内脏数据索引装置一实施例的模块示意图;

图6为本发明存储系统页内脏数据索引装置一实施例中索引模块的细化模块示意图。

本发明目的的实现、功能特点及优点将结合实施例,参照附图做进一步说明。

具体实施方式

应当理解,此处所描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

为了更好理解本发明,在此还提供一种存储系统页内脏数据索引方法,在存储系统页内脏数据索引方法一实施例中,参照图3,该方法包括:

步骤s10,获取存储系统中目标存储页中存储点的点数量,并获取所述目标存储页中脏数据在各个存储点中的脏数据分布信息;

具体地,步骤s10为获取存储系统中目标存储页的页容量和目标存储页中存储点的点容量,并根据所述页容量和点容量得出存储点的点数量,并获取所述目标存储页中脏数据在各个存储点中的脏数据分布信息。

存储系统中可包括多个存储页,本实施例的页内脏数据索引方法可以适用于每一个存储页,以某一存储页为目标存储页来解释说明本发明存储系统页内脏数据索引方法和装置。此外,存储系统在未应用本发明存储系统页内脏数据索引方法和装置之前,不限定存储系统记录脏数据的形式,可以为背景技术中所述的以整个存储页来记录脏数据,当然也可以是本发明提出的位图记录脏数据或者扩展段记录脏数据,无论是哪种记录脏数据的形式,只需获取存储系统中目标存储页的页容量和目标存储页中存储点的点容量,并根据页容量和点容量得出存储点的点数量,并获取目标存储页中脏数据在各个存储点中的脏数据分布信息。

例如,存储系统的目标存储页的页容量为4kb,目标存储页中存储点的点容量为8b(1b位1字节,1字节为8比特位),从而存储点的点数量为512(即4kb/8b=512),即目标存储页具有有序分布的512个存储点,脏数据分布信息中包括存在脏数据的存储点位置(如512个存储点有序编号,存储点的编号对应存储点的位置)以及目标存储页中存在脏数据的数据位位置(如存储页的页容量为4kb,即存储页包括32*1024个数据位,数据位的编号对应脏数据的数据位位置)。

步骤s20,根据点数量和脏数据分布信息创建位图,其中位图中一个数据位对应目标存储页中一个存储点,其中当存储点为脏数据,对应位图中的数据位为肯定标识;当存储点为脏数据,对应位图中的数据位为否定标识;

位图可为一个数据位序列,用以记录存储页中的数据是否是脏数据的数据结构,在本实施例中,存储页最小的更新单位是存储点,一个存储页由众多存储点组成,一个存储点默认为8b(字节),存储点的容量可以调整。位图的数据位为比特位(bit),位图的每一个比特位对应着存储页中的一个存储点。位图中的一个比特位只能是0或1,即数据位的肯定标识为1,、否定标识为0。其中,0表示该比特位对应的存储点是干净的(没有被更新过),1表示该比特位对应的存储点是脏的(被更新过了)。

图1是创建并更新位图示意图,参照图1,位图中的一个比特位(即数据位)的值是0或1。0表示该比特位对应的存储点是干净的(没有被更新过),1表示该比特位对应的存储点是脏的(被更新过了)。位图的大小不会改变,如果更新了一个存储点则将位图相应的比特位为置为1,如果已经是1则忽略。创建位图时,为之分配一个容量大小固定的空间,大小可为存储页的容量大小除以存储点的容量大小,然后根据合并以后的扩展段来更新位图。如图中灰色部分的对应的比特位都置为1。

此外,如果目标存储页中数据更新完还没有来得及将位图对应的比特位(即数据位)设置成为1就断电了,此时需要查看存储系统中记录日志的log区写过数据的位置,然后将对应的位图的比特位点值是否为1,如果为1则忽略;不为1则置1。当要在目标数据页中索引脏数据时,扫描位图,找出所有值为1所对应的存储点位置的数据。

步骤s30,根据脏数据分布信息创建扩展段集合,并获取扩展段集合中扩展段的当前扩展段个数,其中扩展段集合中一个扩展段对应目标存储页中一个脏数据段,每个扩展段包括偏移子段和长度子段,并根据偏移子段和长度子段的数据位个数得出扩展段的段容量;

扩展段包括偏移子段和长度子段,即扩展段包括两个属性:offset(偏移)和len(长度),扩展段<offset,len>指的是某次对数据更新的那一段。offset表示扩展段起始位置基于基地址0的偏移,即扩展段的起始位置地址。len表示扩展段的长度。由于扩展段是连续的一段,所以这两个属性就确定了扩展段在存储页中的位置。

接上述存储系统的目标存储页的页容量为4kb的例子,扩展段的每个属性占10bit,即一个扩展段的偏移子段和长度子段各占10bit(即10个数据位),每个扩展段占20bit。

步骤s40,根据点数量,获取目标存储页以位图索引脏数据的第一存储代价;根据当前扩展段个数和段容量,获取目标存储页以扩展段索引脏数据的第二存储代价;

步骤s50,根据第一存储代价和第二存储代价,确定基于位图方式或扩展段方式索引目标存储页中的脏数据。

接上述存储系统的目标存储页的页容量为4kb的例子,目标存储页具有有序分布的512个存储点,那么存储位图需要512bit。若扩展段的每个属性占10bit,共有两个属性,即每个扩展段占20bit,即当前扩展段的段容量为20bit,当前扩展段个数与当前脏数据段的个数相等,设当前扩展段个数为n,则存储扩展段集合需要20nbit。也就是说,在该例子中,第一存储代价为512bit,第二存储代价为20nbit。

可选地,步骤s50包括:若第一存储代价小于第二存储代价,则基于位图方式索引目标存储页中的脏数据;若第二存储代价小于第一存储代价,则基于扩展段方式索引目标存储页中的脏数据。原则上当当前扩展段数量达到26个时,即第二存储代价为520bit时,第二存储代价大于第一存储代价(512bit),从而使用位图更加节省空间;而当当前扩展段数量小于26个时,即第二存储代价小于500bit,第二存储代价小于第一存储代价(512bit),使用扩展段更加节省空间。此外,脏数据集中时,一个扩展段就可以索引很多脏数据,故用扩展段的方式记录比较节省空间;而当脏数据不集中时,一个扩展段索引的脏数据容量可能大于扩展段本身占用的容量,故此时用位图记录更节省空间。

在本实施例中,在获取当前存储系统中目标存储页的以位图索引脏数据的第一存储代价,以及以扩展段索引脏数据的第二存储代价,并根据第一存储代价和第二存储代价,确定基于位图方式或扩展段方式索引所述目标存储页中的脏数据,从而以位图或扩展段的更小粒度来更新和索引脏数据,存于缓存中,当缓存快满时(即缓存大于预设缓存值时)再以存储页的粒度写回外存或闪存中,从而避免存储页仅写入很少一部分(即存储页中脏数据段很少)时也将存储页全部写入到闪存设备中,从而降低了写入数据量,降低了同步操作的延时,间接提高了系统的性能,同时也降低了闪存设备的磨损,提高了闪存设备的使用寿命。同时,本实施例实现了基于第一存储代价和第二存储代价,确定基于位图方式或扩展段方式索引目标存储页中的脏数据,灵活地节省了存储系统用在索引脏数据的容量消耗。

可选地,步骤s30之后包括:

步骤s31,当检测到脏数据分布信息更新时,更新扩展段集合中各个扩展段的偏移子段和长度子段中数据;

步骤s32,根据更新后的各个扩展段的偏移子段和长度子段,对各个扩展段进行合并,以将存在交集的扩展段合并为一个新的扩展段,并将进行扩展段合并后的扩展段集合中扩展段个数作为新的当前扩展段个数。

当检测到脏数据分布信息更新时,若存在多个扩展段,首先要做的就是扩展段的合并,扩展段的合并两两进行,两个扩展段<offset1,len1>和<offset2,len2>(offset2>=offset1),首先判断offset2–offset1是否大于len1,如果大于,则合并结果为<offset1,len1>+<offset2,len2>;如果等于,则合并结果为<offset1,len1+len2>;如果小于,则再判断len1–(offset2–offset1)是否大于等于len2,如果是,则合并结果为<offset1,len1>;如果不是,则合并结果为<offset1,len2+(offset2–offset1)>。

为辅助理解扩展段的合并过程,以下用一具体例子说明,参照图2中a1,第一扩展段<offset1,len1>为<0,50>,若<offset2,len2>为<51,10>,则offset2>offset1,且offset2–offset1>len1,即(51-0)>50,合并结果为<offset1,len1>+<offset2,len2>,即<0,50>+<51,10>;若<offset2,len2>为<50,6>,参照图2中a2,offset2–offset1=len1,即(50-0)=50,合并结果为<offset1,len1+len2>,即<0,56>;若<offset2,len2>为<40,6>,参照图2中a3,offset2–offset1<len1,即(40-0)<50,继续计算len1–(offset2–offset1)=50-(40-0)=10,从而len1–(offset2–offset1)>len2=6,合并结果为<offset1,len1>,即<0,50>;若<offset2,len2>为<40,16>,参照图2中a4,offset2–offset1<len1,即(40-0)<50,继续计算len1–(offset2–offset1)=50-(40-0)=10,从而len1–(offset2–offset1)<len2=16,合并结果为<offset1,len2+(offset2–offset1)>,即<0,16+(40–0)>,即<0,56>。

进一步地,在本发明存储系统页内脏数据索引方法另一实施例中,参照图4,步骤s50包括:

步骤s51,获取目标存储页以位图索引脏数据的第一查询代价;根据当前扩展段个数,获取目标存储页以扩展段索引脏数据的第二查询代价;

步骤s52,根据第一存储代价和第一查询代价,得出目标存储页以位图索引脏数据的第一总代价;根据第二存储代价和第二查询代价,得出目标存储页以扩展段索引脏数据的第二总代价;

步骤s53,若第一总代价小于第二总代价,则基于位图方式索引目标存储页中的脏数据;若第二总代价小于第一总代价,则基于扩展段方式索引目标存储页中的脏数据。

接上述存储系统的目标存储页的页容量为4kb的例子,存储点的容量为8b,存储位图需要512bit,需要的第一存储代价可为512单位,位图的索引复杂度为o(1);若扩展段集合包括n个扩展段,则存储扩展段集合需要20nbit,扩展段的索引复杂度为o(n/2),所以位图索引脏数据的第一查询代价为1单位,第一存储代价可为512bit,以扩展段索引脏数据的第二查询代价为n单位,第二存储代价可为20n单位。所以位图的索引的复杂度是o(1)的,而扩展段的索引的复杂度是o(n)的。所以考虑总的代价,可定为当扩展段数量(即n)少于等于20个时,使用扩展段的方式存储脏数据索引信息,;当扩展段的数量(即n)大于20个时,使用位图的方式来存储脏数据的索引信息。

在本实施例,增加考虑位图和扩展段的查询代价因素,以综合存储代价和查询代价得出总代价来选择位图或扩展段方式索引目标存储页中的脏数据,使得目标存储页中的脏数据的索引在索引速度和占有存储空间之间取得平衡,使存储系统中脏数据索引更加稳定和均衡,从而在脏数据集中时,用扩展段的方式记录比较节省空间;而当脏数据不集中时,用位图记录更节省空间,而且位图的查找还比扩展段的查找快,因而本发明根据实际情况动态调整使用哪种索引方法,实现根据脏块分布情况动态调整索引方法,用很低的开销索引到页内数据是否是脏数据。

可选地,步骤52包括:

根据预设公式、第一存储代价和第一查询代价,得出目标存储页以位图索引脏数据的第一总代价;

根据预设公式、第二存储代价和第二查询代价,得出目标存储页以扩展段索引脏数据的第二总代价;

其中,预设公式为cost=p*storage+q*query,cost为总代价、p为第一预设系数、storage为存储代价、q为第二预设系数、query为查询代价、p+q=1;其中,存储系统的存储容量越大,p越小;存储系统的存储容量越小,p越大。

接上述步骤s53中的例子,假设存储页容量为4kb,存储点容量为8b,那么存储位图需要512bit,假设扩展段的每个属性占10bit,共有两个属性(偏移和长度),即每个扩展段占20bit。原则上当扩展段的数量n达到26个时,使用位图更加节省空间;而当扩展段的数量n小于26个时,使用扩展段更加节省空间。但是位图的索引的复杂度是o(1)的,而扩展段的索引的复杂度是o(n)的。所以考虑总的代价,为存储代价(记为storage)和查询代价(记为query)分别加以权重p和q,得到总的代价(记为cost)如下表达式所示:

cost=p·storage+q·query

其中,当使用n个扩展段时,storage值(即第二存储代价)取20n/(512+20n),query值(即第二查询代价)取(n/2)/(1+n/2);当使用位图时,storage值(即第一存储代价)取512/(512+20n),query值(即第一查询代价)取1/(1+n/2)。可令p取值0.4,q取值0.6(根据存储系统实际情况取比重,如果存储系统存储空间小,让p取值大一点;反之让p取值小一点),测试得当扩展段的个数n小于14时,使用扩展段来记录脏数据信息cost(即第二总代价)较小;当扩展段的个数n大于等于14时,用位图来记录脏数据xinxcost(即第一总代价)较小。从而本实施例能够用固定大小的存储区域存储ssd(固态硬盘)中脏数据的信息,还能够用很低的开销和很快的速度索引到ssd中存储页的数据是否为脏数据。

本发明还提供一种存储系统页内脏数据索引装置,在存储系统页内脏数据索引装置一实施例中,参照图5,该装置包括:

获取模块10,用于获取存储系统中目标存储页的页容量和目标存储页中存储点的点容量,并根据页容量和点容量得出存储点的点数量,并获取目标存储页中脏数据在各个存储点中的脏数据分布信息;

存储系统中可包括多个存储页,本实施例的页内脏数据索引方法可以适用于每一个存储页,以某一存储页为目标存储页来解释说明本发明存储系统页内脏数据索引方法和装置。此外,存储系统在未应用本发明存储系统页内脏数据索引方法和装置之前,不限定存储系统记录脏数据的形式,可以为背景技术中所述的以整个存储页来记录脏数据,当然也可以是本发明提出的位图记录脏数据或者扩展段记录脏数据,无论是哪种记录脏数据的形式,只需获取模块10获取存储系统中目标存储页的页容量和目标存储页中存储点的点容量,并根据页容量和点容量得出存储点的点数量,并获取目标存储页中脏数据在各个存储点中的脏数据分布信息。

例如,存储系统的目标存储页的页容量为4kb,目标存储页中存储点的点容量为8b(1b位1字节,1字节为8比特位),从而存储点的点数量为512(即4kb/8b=512),即目标存储页具有有序分布的512个存储点,脏数据分布信息中包括存在脏数据的存储点位置(如512个存储点有序编号,存储点的编号对应存储点的位置)以及目标存储页中存在脏数据的数据位位置(如存储页的页容量为4kb,即存储页包括32*1024个数据位,数据位的编号对应脏数据的数据位位置)。

位图创建模块20,用于根据点数量和脏数据分布信息创建位图,其中位图中一个数据位对应目标存储页中一个存储点,其中当存储点为脏数据,对应位图中的数据位为肯定标识;当存储点为脏数据,对应位图中的数据位为否定标识;

位图可为一个数据位序列,用以记录存储页中的数据是否是脏数据的数据结构,在本实施例中,存储页最小的更新单位是存储点,一个存储页由众多存储点组成,一个存储点默认为8b(字节),存储点的容量可以调整。位图的数据位为比特位(bit),位图的每一个比特位对应着存储页中的一个存储点。位图中的一个比特位只能是0或1,即数据位的肯定标识为1,、否定标识为0。其中,0表示该比特位对应的存储点是干净的(没有被更新过),1表示该比特位对应的存储点是脏的(被更新过了)。

图1是创建并更新位图示意图,参照图1,位图中的一个比特位(即数据位)的值是0或1。0表示该比特位对应的存储点是干净的(没有被更新过),1表示该比特位对应的存储点是脏的(被更新过了)。位图的大小不会改变,如果更新了一个存储点则将位图相应的比特位为置为1,如果已经是1则忽略。创建位图时,为之分配一个容量大小固定的空间,大小可为存储页的容量大小除以存储点的容量大小,然后根据合并以后的扩展段来更新位图。如图中灰色部分的对应的比特位都置为1。

此外,如果目标存储页中数据更新完还没有来得及将位图对应的比特位(即数据位)设置成为1就断电了,此时需要查看存储系统中记录日志的log区写过数据的位置,然后将对应的位图的比特位点值是否为1,如果为1则忽略;不为1则置1。当要在目标数据页中索引脏数据时,扫描位图,找出所有值为1所对应的存储点位置的数据。

扩展段创建模块30,用于根据脏数据分布信息创建扩展段集合,并获取扩展段集合中扩展段的当前扩展段个数,其中扩展段集合中一个扩展段对应目标存储页中一个脏数据段,每个扩展段包括偏移子段和长度子段,并根据偏移子段和长度子段的数据位个数得出扩展段的段容量;

扩展段包括偏移子段和长度子段,即扩展段包括两个属性:offset(偏移)和len(长度),扩展段<offset,len>指的是某次对数据更新的那一段。offset表示扩展段起始位置基于基地址0的偏移,即扩展段的起始位置地址。len表示扩展段的长度。由于扩展段是连续的一段,所以这两个属性就确定了扩展段在存储页中的位置。

接上述存储系统的目标存储页的页容量为4kb的例子,扩展段的每个属性占10bit,即一个扩展段的偏移子段和长度子段各占10bit(即10个数据位),每个扩展段占20bit。

代价获取模块40,用于根据点数量,获取目标存储页以位图索引脏数据的第一存储代价;根据当前扩展段个数和段容量,获取目标存储页以扩展段索引脏数据的第二存储代价;

索引模块50,用于根据第一存储代价和第二存储代价,确定基于位图方式或扩展段方式索引目标存储页中的脏数据。

接上述存储系统的目标存储页的页容量为4kb的例子,目标存储页具有有序分布的512个存储点,那么存储位图需要512bit。若扩展段的每个属性占10bit,共有两个属性,即每个扩展段占20bit,即当前扩展段的段容量为20bit,当前扩展段个数与当前脏数据段的个数相等,设当前扩展段个数为n,则存储扩展段集合需要20nbit。也就是说,在该例子中,第一存储代价为512bit,第二存储代价为20nbit。

可选地,索引模块50用于:若第一存储代价小于第二存储代价,则基于位图方式索引目标存储页中的脏数据;若第二存储代价小于第一存储代价,则基于扩展段方式索引目标存储页中的脏数据。原则上当当前扩展段数量达到26个时,即第二存储代价为520bit时,第二存储代价大于第一存储代价(512bit),从而使用位图更加节省空间;而当当前扩展段数量小于26个时,即第二存储代价小于500bit,第二存储代价小于第一存储代价(512bit),使用扩展段更加节省空间。此外,脏数据集中时,一个扩展段就可以索引很多脏数据,故用扩展段的方式记录比较节省空间;而当脏数据不集中时,一个扩展段索引的脏数据容量可能大于扩展段本身占用的容量,故此时用位图记录更节省空间。

在本实施例中,在代价获取模块40获取当前存储系统中目标存储页的以位图索引脏数据的第一存储代价,以及以扩展段索引脏数据的第二存储代价,索引模块50并根据第一存储代价和第二存储代价,确定基于位图方式或扩展段方式索引所述目标存储页中的脏数据,从而以位图或扩展段的更小粒度来更新和索引脏数据,存于缓存中,当缓存快满时(即缓存大于预设缓存值时)再以存储页的粒度写回外存或闪存中,从而避免存储页仅写入很少一部分(即存储页中脏数据段很少)时也将存储页全部写入到闪存设备中,从而降低了写入数据量,降低了同步操作的延时,间接提高了系统的性能,同时也降低了闪存设备的磨损,提高了闪存设备的使用寿命。同时,本实施例实现了基于第一存储代价和第二存储代价,确定基于位图方式或扩展段方式索引目标存储页中的脏数据,灵活地节省了存储系统用在索引脏数据的容量消耗。

可选地,扩展段创建模块30用于:

当检测到脏数据分布信息更新时,更新扩展段集合中各个扩展段的偏移子段和长度子段中数据;

根据更新后的各个扩展段的偏移子段和长度子段,对各个扩展段进行合并,以将存在交集的扩展段合并为一个新的扩展段,并将进行扩展段合并后的扩展段集合中扩展段个数作为新的当前扩展段个数。

当检测到脏数据分布信息更新时,若存在多个扩展段,首先要做的就是扩展段的合并,扩展段的合并两两进行,两个扩展段<offset1,len1>和<offset2,len2>(offset2>=offset1),首先判断offset2–offset1是否大于len1,如果大于,则合并结果为<offset1,len1>+<offset2,len2>;如果等于,则合并结果为<offset1,len1+len2>;如果小于,则再判断len1–(offset2–offset1)是否大于等于len2,如果是,则合并结果为<offset1,len1>;如果不是,则合并结果为<offset1,len2+(offset2–offset1)>。

为辅助理解扩展段的合并过程,以下用一具体例子说明,参照图2中a1,第一扩展段<offset1,len1>为<0,50>,若<offset2,len2>为<51,10>,则offset2>offset1,且offset2–offset1>len1,即(51-0)>50,合并结果为<offset1,len1>+<offset2,len2>,即<0,50>+<51,10>;若<offset2,len2>为<50,6>,参照图2中a2,offset2–offset1=len1,即(50-0)=50,合并结果为<offset1,len1+len2>,即<0,56>;若<offset2,len2>为<40,6>,参照图2中a3,offset2–offset1<len1,即(40-0)<50,继续计算len1–(offset2–offset1)=50-(40-0)=10,从而len1–(offset2–offset1)>len2=6,合并结果为<offset1,len1>,即<0,50>;若<offset2,len2>为<40,16>,参照图2中a4,offset2–offset1<len1,即(40-0)<50,继续计算len1–(offset2–offset1)=50-(40-0)=10,从而len1–(offset2–offset1)<len2=16,合并结果为<offset1,len2+(offset2–offset1)>,即<0,16+(40–0)>,即<0,56>。

进一步地,在本发明存储系统页内脏数据索引装置另一实施例中,参照图6,索引模块50包括:

第一获取单元51,用于获取目标存储页以位图索引脏数据的第一查询代价;根据当前扩展段个数,获取目标存储页以扩展段索引脏数据的第二查询代价;

第二获取单元52,用于根据第一存储代价和第一查询代价,得出目标存储页以位图索引脏数据的第一总代价;根据第二存储代价和第二查询代价,得出目标存储页以扩展段索引脏数据的第二总代价;

索引单元53,用于若第一总代价小于第二总代价,则基于位图方式索引目标存储页中的脏数据;若第二总代价小于第一总代价,则基于扩展段方式索引目标存储页中的脏数据。

接上述存储系统的目标存储页的页容量为4kb的例子,存储点的容量为8b,存储位图需要512bit,需要的第一存储代价可为512单位,位图的索引复杂度为o(1);若扩展段集合包括n个扩展段,则存储扩展段集合需要20nbit,扩展段的索引复杂度为o(n/2),所以位图索引脏数据的第一查询代价为1单位,第一存储代价可为512bit,以扩展段索引脏数据的第二查询代价为n单位,第二存储代价可为20n单位。所以位图的索引的复杂度是o(1)的,而扩展段的索引的复杂度是o(n)的。所以考虑总的代价,可定为当扩展段数量(即n)少于等于20个时,使用扩展段的方式存储脏数据索引信息,;当扩展段的数量(即n)大于20个时,使用位图的方式来存储脏数据的索引信息。

在本实施例,增加考虑位图和扩展段的查询代价因素,以综合存储代价和查询代价得出总代价来选择位图或扩展段方式索引目标存储页中的脏数据,使得目标存储页中的脏数据的索引在索引速度和占有存储空间之间取得平衡,使存储系统中脏数据索引更加稳定和均衡,从而在脏数据集中时,用扩展段的方式记录比较节省空间;而当脏数据不集中时,用位图记录更节省空间,而且位图的查找还比扩展段的查找快,因而本发明根据实际情况动态调整使用哪种索引方法,实现根据脏块分布情况动态调整索引方法,用很低的开销索引到页内数据是否是脏数据。

可选地,第二获取单元52用于:

根据预设公式、第一存储代价和第一查询代价,得出目标存储页以位图索引脏数据的第一总代价;

根据预设公式、第二存储代价和第二查询代价,得出目标存储页以扩展段索引脏数据的第二总代价;

其中,预设公式为cost=p*storage+q*query,cost为总代价、p为第一预设系数、storage为存储代价、q为第二预设系数、query为查询代价、p+q=1;其中,存储系统的存储容量越大,p越小;存储系统的存储容量越小,p越大。

接上述索引单元53中的例子,假设存储页容量为4kb,存储点容量为8b,那么存储位图需要512bit,假设扩展段的每个属性占10bit,共有两个属性(偏移和长度),即每个扩展段占20bit。原则上当扩展段的数量n达到26个时,使用位图更加节省空间;而当扩展段的数量n小于26个时,使用扩展段更加节省空间。但是位图的索引的复杂度是o(1)的,而扩展段的索引的复杂度是o(n)的。所以考虑总的代价,为存储代价(记为storage)和查询代价(记为query)分别加以权重p和q,得到总的代价(记为cost)如下表达式所示:

cost=p·storage+q·query

其中,当使用n个扩展段时,storage值(即第二存储代价)取20n/(512+20n),query值(即第二查询代价)取(n/2)/(1+n/2);当使用位图时,storage值(即第一存储代价)取512/(512+20n),query值(即第一查询代价)取1/(1+n/2)。可令p取值0.4,q取值0.6(根据存储系统实际情况取比重,如果存储系统存储空间小,让p取值大一点;反之让p取值小一点),测试得当扩展段的个数n小于14时,使用扩展段来记录脏数据信息cost(即第二总代价)较小;当扩展段的个数n大于等于14时,用位图来记录脏数据xinxcost(即第一总代价)较小。从而本实施例能够用固定大小的存储区域存储ssd(固态硬盘)中脏数据的信息,还能够用很低的开销和很快的速度索引到ssd中存储页的数据是否为脏数据。

通过以上的实施方式的描述,本领域的技术人员可以清楚地了解到上述实施例方法可借助软件加必需的通用硬件平台的方式来实现,当然也可以通过硬件,但很多情况下前者是更佳的实施方式。基于这样的理解,本发明的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质(如rom/ram、磁碟、光盘)中,包括若干指令用以使得一台终端设备(可以是手机,计算机,服务器,空气处理设备,或者网络设备等)执行本发明各个实施例的方法。

以上仅为本发明的优选实施例,并非因此限制本发明的专利范围,凡是利用本发明说明书及附图内容所作的等效结构或等效流程变换,或直接或间接运用在其他相关的技术领域,均同理包括在本发明的专利保护范围内。

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